Git重置(不是硬)然后快速合并某些提交

时间:2015-05-12 03:42:50

标签: git git-merge git-reset

案例: 分支A. Commit1 - > Commit2 - > Commit3 - > Commit4

头部目前处于Commit4。

我想将(不是很难)重置为Commit1并使用Commit1作为基础来仅实现在Commit4中完成的任何更改。

所以最终的结果是: Commit1 - > Commit4

有没有git命令可以做到这一点?或者我应该回滚到Commit1并手动实现在Commit4中完成的更改?

谢谢!

2 个答案:

答案 0 :(得分:3)

根据您的问题, 明确表示您希望提交序列

... <- C1 <- new-C4   <-- branch

(记住,箭头总是指向过去的历史,而不是指向未来)。

new-C4,或者您是否要放弃C4C2中所做的所有更改,同时仅保留C3中的更改

您可以使用C4来实现后一个结果,但请记住通常的警告,即您不应该重新发布已发布的提交。要实现这一目标,只需运行:

git rebase

这将打开一个编辑器会话,您可以在其中保留或丢弃特定的提交。请参阅answer linked中的Martin Konecny's commentBarry Gackle's answer

如果您希望保留 git rebase -i HEAD~4 C2引入的更改,同时丢弃提交,则C3跟随git reset --soft是正确的方法。请参阅VonC's answer here

答案 1 :(得分:1)

我会在这里做一个互动的变基。

让我们说commit1的哈希是27af3(我在这里选择一个随机数来说明 - 做一个&#39; git log&#39;来获取实际的哈希值)

你可以这样做:

    git rebase --interactive 27af3

这将显示一个文本编辑器屏幕,显示提交列表。删除包含Commit2和Commit3的行,然后保存并退出。您将坐在您指定的所需最终状态。

请注意,此过程将破坏提交2和3,因此如果您想将其保留用于其他用途,请小心。

另请注意,如果您已经将这四个提交中的任何一个提交到任何地方的公共服务器,则不应该这样做。一般来说,重新定位只能用于树木的严格局部部分。