有时(经常发生)我会犯错误并在推送后做出一种“快速修复”。
但是为了清楚一些提交,有时我会重新分叉(如果那是在我的分叉中)并再次提交所有更改。
有没有办法合并提交?
有时(经常发生)我会犯错误并在推送后做出一种“快速修复”。
但是为了清楚一些提交,有时我会重新分叉(如果那是在我的分叉中)并再次提交所有更改。
有没有办法合并提交?
是的,有一种方法,叫做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 上工作的人时很好,或者你确定没有人追随你,否则对其他人来说是一种痛苦。
是的。您要查看的是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