只还原特定分支的提交,同时保留“合并数据”

时间:2019-08-15 21:45:13

标签: git git-revert

说我有两个分支Amaster。意外地向分支A添加并完成了一项功能(该功能还用于处于工作状态/已合并为母版,但以后需要继续使用的其他功能)。

现在,我希望从A中删除产生新功能的提交,同时将主状态保持在当前HEAD中。理想情况是:

git checkout A
git revert HEAD~2..HEAD

但是这还不会恢复master分支的HEAD吗?

2 个答案:

答案 0 :(得分:2)

HEAD是指向当前活动分支的指针。

运行git checkout A后,对HEAD进行操作将修改A而不是master
在运行git checkout master之后,对HEAD进行操作将修改master而不是A


附加说明:

如果您打算“取消分支A的最后两次提交”,则可以运行:

git checkout A
git reset --hard HEAD~2

# if branch A was pushed,
# you will also need to push the corrected A :
git push origin --force-with-lease A

答案 1 :(得分:0)

具有重写历史记录的解决方案:

git checkout A
git reset HEAD~2
git push origin A --force

重要的是,在git reset命令之后,您对最近两次提交的所有更改将在工作目录中可用。它为您提供了创建另一个分支并继续进行处理或在需要时隐藏的机会。

无需重写历史记录的解决方案:

git checkout A
# automatically commits
git revert HEAD~2..HEAD
git push origin A

git checkout A

# doesn't commit automatically 
git revert --no-commit HEAD~2..HEAD

git commit -m 'Revert two last commits'
git push origin A

它将添加一个新的提交以反转两次最新提交的效果。

以上所有解决方案都不会更改master分支!

理论:

HEAD是当前分支引用的指针,而当前分支引用又是对该分支上最后一次提交的指针。

git checkout [<branch>]的真正作用是什么?

  • 更改HEAD以指向新的分支引用
  • 用该提交的快照填充您的index(临时区域)
  • index的内容复制到您的工作目录中

git reset [<commit>]的真正作用是什么?

  • 移动HEAD指向的分支(假设您当前在master分支上。运行git reset [<commit>]将使master指向[<commit>]
  • 使用指向快照index的内容更新HEAD(登台区域)