4

有时(经常发生)我会犯错误并在推送后做出一种“快速修复”。

但是为了清楚一些提交,有时我会重新分叉(如果那是在我的分叉中)并再次提交所有更改。

有没有办法合并提交?

4

2 回答 2

3

是的,有一种方法,叫做squashing

git rebase -i sha1_of_the_first_concerened_commit

然后用squash(或s )替换相关提交下方提交的所有编辑,保存文件,并继续使用.git rebase --continue

下次你推送时,你的推送可能会被拒绝,你需要然后git push -f.


但在你的具体情况下,没有必要经历这一切,你可以commit --amend改用。

假设您已提交,然后对file1进行了快速修复。您只需要将文件添加到暂存区域:

git add file1

然后:

git ci --amend

最后强制推送:

git push -f

重写历史时要小心,当你是唯一一个在 repo 上工作的人时很好,或者你确定没有人追随你,否则对其他人来说是一种痛苦。

于 2012-07-02T09:57:50.380 回答
1

是的。您要查看的是rebase. 尝试

$ git help rebase # and read it

另一种选择是git commit --amend。如果您即将进行的提交应该与当前 HEAD 合并,您可以修改它。

这两个选项,重写历史。因此,如果受影响的提交已经在远程端,您将需要将git push -f更改发送到上游。


对于rebase的简单示例用例,假设您进行了 5 次提交,

A--B--C--D--E
^ initial   ^ HEAD

并且提交 B 是提交 A 的快速修复,
提交 E 是提交 C 的快速修复。
所以你想将 B 合并到 A,将 E 合并到 C。

$ git rebase -i HEAD~5  

你从这个开始:

pick A msg
pick B msg
pick C msg
pick D msg
pick E msg

您重新排列提交,以便要合并的提交低于要合并的提交;即 A 之下的 B(已经存在)和 C 之下的 E。

pick A msg
pick B msg
pick C msg
pick E msg
pick D msg

你告诉 git,不要选择提交,而是压缩它;也就是将它合并到上面的一个 - 或修复它 - 参见手册页。

pick A msg
squash B msg
pick C msg
squah E msg
pick D msg

全部完成,保存文件,git 将重新排列并压缩提交。
所以现在你有:

A'--C'--D
于 2012-07-02T09:52:12.173 回答