修复git双提交历史记录

修复git双提交历史记录,git,github,git-filter-branch,Git,Github,Git Filter Branch,前几天我不得不运行git过滤器分支。我按照指示做了,但出了点问题。我认为团队中有人没有在本地分支上运行rebase,而是合并了更改。从那时起,提交日志就充满了双重提交,例如: commit b0c03ec925c0b97150594a99861d8f21fd3ab22d Author: XXX Date: Wed Mar 19 17:01:52 2014 -0400 Removed most clearfixs in templates commit f30c21d21b5ea7

前几天我不得不运行
git过滤器分支
。我按照指示做了,但出了点问题。我认为团队中有人没有在本地分支上运行rebase,而是合并了更改。从那时起,提交日志就充满了双重提交,例如:

commit b0c03ec925c0b97150594a99861d8f21fd3ab22d
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit f30c21d21b5ea715a99b0844793cb4b5f5df97a1
Author: XXX
Date:   Wed Mar 19 17:01:52 2014 -0400

    Removed most clearfixs in templates

commit 2346be43d0e02d3987331f0a9eeb2f12cd698ede
Author: XXX
Date:   Wed Mar 19 16:40:26 2014 -0400

    new redirect logic

commit 1383070b31bde1aaa9eda7c2a9bcb598dd72247b
Merge: d1e2eb6 94e07fe
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit 79ce7824688cf2a71efd9ff82e3c7a71d53af229
Merge: 6079061 1ed3967
Author: XXX
Date:   Wed Mar 19 16:28:41 2014 -0400

    Merge branch 'develop' of github.com:xxx/xxx into develop

commit d1e2eb645a4fe2a1b3986082d0409b4075a0dbc9
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

commit 6079061f6ef1f856f94d92bc0fdacf18854b8a89
Author: XXX
Date:   Wed Mar 19 16:28:36 2014 -0400

    Fixed broken responsiveness for companies listing page and code refactoring.

奇怪的是,并不是所有的提交都是加倍的,比如上面的“新重定向逻辑”。我能做些什么来解决这个问题吗?这是相对温和的,但现在我们的承诺历史看起来像垃圾。这建议保持原样,但为了子孙后代,我更希望有一个干净的提交历史记录。

实现这一点的命令是:

git rebase -i HEAD~7
这将通过以下内容打开编辑器:

pick f392171 Removed most clearfixs in templates
pick ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
pick 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop
...
现在,您可以告诉git如何处理每个提交。让我们保留提交f392171,我们在其中添加了我们的特性。我们将把以下两个承诺压缩到第一个承诺中,留下一个干净的承诺

将您的文件更改为:

pick f392171 Removed most clearfixs in templates
squash ba9dd9a Removed most clearfixs in templates
pick df71a27 Unew redirect logic
pick 79ce782 Merge branch 'develop' of github.com:xxx/xxx into develop
squash 1383070 Merge branch 'develop' of github.com:xxx/xxx into develop
保存并退出编辑器时,Git将应用所有两个更改,然后将您放回编辑器以合并三条提交消息:

# This is a combination of  commits.
# The first commit's message is:
Removed most clearfixs in templates

# This is the 2nd commit message:

Removed most clearfixs in templates
完成后,保存并退出编辑器。Git现在将把提交压缩成一个。全部完成

那你必须做什么

git push origin your-branch -f
强制您在本地将更改提交到远程分支


注意:您必须对每个重复的提交进行挤压。

由@VAIRIX回答是完美的,但在一些复杂的情况下,重复的提交彼此并不相邻,因此挤压没有帮助

因此,取下历史,(假设a~是a的复制品)

要遵循的命令:(如@VAIRIX或以下回答中所述,如果您想使用master重新设置基址)
git-rebase-master-i
(最好遵循
git-rebase-i-HEAD~n
以避免重定基址问题)

现在! 1) 挤压重复提交,如下所示:

 pick h
 pick g
 pick f
 pick c~
 s b~
 s a~
 pick e
 pick d
 pick c
 pick b
 pick a
现在,这将挤压您在c中的提交

 # h
 # g
 # f
 # c~ (having changes of a~ and b~)
 # e
 # d
 # c
 # b
 # a
在我的例子中,c~是c的反提交,所以我不得不再次执行该过程,但现在我不再使用
s
挤压,而是使用
d
放弃提交

 pick h
 pick g
 pick f
 d c~ (having changes of a~ and b~)
 pick e
 pick d
 pick c
 pick b
 pick a
现在,您的历史记录将删除所有重复提交。现在,您可以使用
git diff
与原始分支进行比较,该分支对您的this分支进行了重复提交。如果你做得很好,应该不会有什么不同


这个过程看起来可能要长一点,但您可以放心,您不会错过任何提交。

当我运行此过程时,重复的提交不会彼此相邻。e、 g.对于模板中删除的大多数ClearFix,一个在第4512行,另一个在第6683行。有办法解决这个问题吗?我还担心可能会出现这样的情况,即我们有两个具有相同消息但内容不同的提交,在这种情况下,我们不想挤压。有没有办法检查一下?我不明白你的第一个问题。。。你能更详细地给我解释一下吗?否则,要重命名提交,必须使用“编辑”而不是挤压,保存文件,然后
git commit--amend
。这将打开一个编辑器,您必须使用提交的新名称保存该文件。关于第一个问题,虽然
git log
显示两个提交相邻,但此rebase命令生成的日志文件不会-它们将位于日志文件中非常不同的位置。对于第二个问题,在历史进程中,我们对同一消息进行了不同更改的提交-例如,合并提交通常具有相同的消息。我对重命名它们不感兴趣,而是检查哪些是多余的。有没有一种方法可以显示日志文件中的更改摘要?我想到的是,您可以先更改提交顺序,以聚集那些想要进行挤压的人。要更改顺序,只需在打开
git-rebase-i
的文件中交换提交的行。另一方面,为了查看提交是否相等,我将使用
gitg
工具检查具有相同名称的提交,并验证这些提交是否具有相同的更改。我不知道是否有任何工具可以自动比较。你的用户名也是+1:D。是的,你应该非常小心地选择挤压和放下,并且使用提交的数量来开始挤压。头~10或类似的东西。
 pick h
 pick g
 pick f
 d c~ (having changes of a~ and b~)
 pick e
 pick d
 pick c
 pick b
 pick a