Git 仅恢复特定分支的提交,同时保留;“合并数据”;
假设我有两个分支Git 仅恢复特定分支的提交,同时保留;“合并数据”;,git,git-revert,Git,Git Revert,假设我有两个分支A和master。某个功能意外添加并完成到分支A(该分支也正在处理处于工作状态/合并到主功能但需要稍后继续的其他功能) 现在我想从A中删除产生新特性的提交,同时将主状态保留在当前头部。理想的情况是: git checkout A git revert HEAD~2..HEAD 但是,这不也会还原主分支的头吗?头是指向当前活动分支的指针 在运行git checkout A后,对头部执行操作将修改A,而不是master, 在运行git checkout master之后,对头执行操
A
和master
。某个功能意外添加并完成到分支A
(该分支也正在处理处于工作状态/合并到主功能但需要稍后继续的其他功能)
现在我想从A
中删除产生新特性的提交,同时将主状态保留在当前头部。理想的情况是:
git checkout A
git revert HEAD~2..HEAD
但是,这不也会还原主分支的头吗?
头是指向当前活动分支的指针
在运行git checkout A
后,对头部执行操作将修改A
,而不是master
,
在运行git checkout master
之后,对头执行操作将修改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
具有重写历史记录的解决方案:
一件重要的事情是,在执行git reset
命令后,您最近两次提交的所有更改都将在工作目录中可用。它让您有机会创建另一个分支,并在需要时继续工作或隐藏
不重写历史记录的解决方案:
或
它将添加一个新的提交,以反转最近两次提交的效果
以上所有解决方案都不会改变master
branch!
理论:
HEAD
是指向当前分支引用的指针,而当前分支引用又是指向该分支上最后一次提交的指针
git checkout[]
真正做什么
- 更改
头部
以指向新的分支参考
- 用提交的快照填充
索引(暂存区域)
- 将
索引的内容复制到工作目录中
git reset[]
真正做什么
- 移动
HEAD
指向的分支(假设您当前在master
分支上。运行git reset[]
将使master
指向[]
)
- 使用快照
头的内容更新索引
(暂存区)
指向
我确实推了一个(和主控)-我可以在不重写历史的情况下进行还原吗?两个还原的提交之一是从master
合并到A
?如果可以运行重置--hard
,这会重写历史,事情会更简单。如果这违反了一个严格的要求,您可以运行revert
命令,但稍后当a
合并到master
中时,请仔细检查master
中的内容。首先,不要问我们会发生什么。告诉我们你想发生什么。我理解你的问题的方式是,你有一个分支,a,你(意外地)添加了一些不相关的东西,然后你将a合并到master。现在,您希望从中恢复/撤消/删除不相关的内容,但希望将其保留在主控上。我理解得对吗?@LasseVågsætherKarlsen-是的,但更重要的是,我希望了解“恢复”之类的东西是如何与分支一起工作的。它们是在单个分支上工作还是同时还原其他分支。还原只会添加另一个与您正在还原的提交相反的提交。如果原始提交添加了一行,则恢复提交将删除该行,依此类推。还原会添加另一个提交,您需要自己将该提交合并到相关的分支中。Revert不能将提交插入历史记录,也不能更改原始提交,因此它会影响您希望它影响的分支。
git checkout A
git reset HEAD~2
git push origin A --force
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