文档和搜索让我对如何清理提交历史感到困惑。
假设我有一个称为测试的分支,我将其用于将构建推送到travis-ci,并且我的构建失败了。然后我必须做一些小提交来尝试修复错误消息并重新推送tests
分支。
这可能会导致一系列小而几乎无意义的提交,但我并不是真的想做,但我仍然被迫。我如何将这些压缩成一个提交?我认为rebase
是我正在寻找的,但我对一些事情感到困惑。
如果我使用squash
,我发现我遇到了大量的合并冲突,然后我必须手动解决。
我认为解决方案可能只是删除提交,但后来我不确定是否会删除一些我最终“工作”提交所需的历史记录。
说我的提交历史记录如下:
commit1: some new feature
commit2: crap, builds failing, trying fix
commit3: more build attempts
commit4: Ahh I think I got it this time
commit5: ok finally fixed, build passing
现在我基本上只想让一个提交合并回master
。你会在这里做些什么不会导致合并冲突?
答案 0 :(得分:4)
怎么样
git reset --soft HEAD~[n]
git commit
那应该压缩你的最后一次提交。
答案 1 :(得分:1)
你在这里做什么不会导致合并冲突?
不幸的是,如果你压缩提交,合并冲突可能是不可避免的。
您可以尝试执行交互式rebase,将修补程序提交合并到一个提交中。请记住,如果不尚未将此分支推送到远程,则仅建议使用此解决方案。所以,如果你已经在本地提交了1-5,没有推送它们,并且你想要将它们组合起来,那么交互式rebase是一个不错的选择。
从以下开始:
<input name="file_name" id="ext-gen4414" class="x-form-file-input" type="file" size="1">
这会显示一个窗口,显示以下5个提交列表,从最早的提交1到最新提交5 git checkout tests
git rebase -i HEAD~5
分支:
tests
您可以看到,默认情况下,每个提交的选项为pick 07c5abd message for commit 1
pick dl398cn message for commit 2
pick 93nmcdu message for commit 3
pick lst28e4 message for commit 4
pick 398nmol message for commit 5
。如果你现在完成了rebase,你只需保留每个提交,这实际上是一个无操作。但是既然你想要压缩某些中间提交,请编辑并将列表更改为:
pick
保存并关闭文件,然后完成rebase。
请仔细注意上面发生的事情。通过键入squash,你告诉Git将该提交合并到上面的中,这就是它之前的提交。因此,这表示将提交5向后压缩到提交4,然后将4压缩为3,依此类推,只为提交1到5提交一个提交。在提交1之前发生的其他提交保持原样。
如果你刚刚被压扁的提交没有被推送,并且提交1优先于pick 07c5abd message for commit 1
squash dl398cn message for commit 2
squash 93nmcdu message for commit 3
squash lst28e4 message for commit 4
squash 398nmol message for commit 5
,那么你应该只能通过以下方式推送这个分支:
origin/tests
如果这不起作用,您可能必须强制推动分支:
git push origin tests
但请记住,这会重写远程历史记录,理想情况下您不应该这样做。
答案 2 :(得分:1)
Git limit 10
适用于将提交合并为一个。
正如所提到的,Squash
将n替换为您希望压缩的提交数量,并在需要时git rebase -i HEAD~n
更改。
理想情况下,在需要记录并创建路径时进行提交。提交历史在rebase,检查代码版本,在实例中创建分支等方面起着重要作用。记录对git的更改时,请确保更改是相关的并且需要保留。
只有在真正不需要对您正在进行的更改做出指示时才进行壁球。这会修改完成的工作报告。