首页 > 解决方案 > git 1.7.1 提交出现乱序

问题描述

以下帖子适用于可追溯到 2010 年的过时版本的 Git(版本 1.7.1——Centos 6 上的默认版本)。虽然显而易见的答案是简单地升级 git(我赞成这种做法),但我刚刚加入这个项目,团队负责人很关心稳定性。我怀疑 Git 1.7.1 已经严重损坏,并希望为升级提供理由。

我刚刚对我刚刚加入的一个项目进行了第一次提交,并且惊讶地发现 git log在我最近提交的内容之前插入了我的更改(SA)——另外还有一个复杂的问题是 TortoiseGit 属性更改由其他人(MH)对我来说。

git log --graph --oneline --decorate --pretty=format:"%cn committed %h on %cd"

结果:

* SA committed 3d67c9dd4 on Mon Feb 18 12:42:24 2019 +0000      ## SECOND COMMIT
*   SA committed d6f0c4712 on Mon Feb 18 10:55:42 2019 +0000    ## FIRST PUSH (2 mins after FIRST COMMIT)
|\
| * MH committed c1ad3c336 on Thu Feb 14 17:07:01 2019 +0000
| * MH committed 7442f95dd on Thu Feb 14 15:03:46 2019 +0000
| * MH committed 417dc55e2 on Thu Feb 14 11:28:40 2019 +0000
| * MH committed 0eea851b1 on Thu Feb 14 11:27:01 2019 +0000
| * MH committed 72e0fa612 on Wed Feb 13 17:15:22 2019 +0000
| * MH committed 0e80cc9d6 on Wed Feb 13 17:06:50 2019 +0000
| * MH committed ac37fdf64 on Wed Feb 13 17:04:46 2019 +0000
| * MH committed cb1b84489 on Wed Feb 13 17:04:18 2019 +0000
| * MH committed f5026eee5 on Wed Feb 13 15:03:50 2019 +0000
| * MH committed 1ca37588f on Wed Feb 13 15:01:55 2019 +0000
| * MH committed cedcefd36 on Wed Feb 13 12:23:03 2019 +0000
| * MH committed 0bbd26524 on Wed Feb 13 08:39:33 2019 +0000
| *   MH committed db8b7672c on Thu Feb 7 17:41:56 2019 +0000
| |\
| | * MH committed fca13dfe3 on Thu Feb 7 17:36:05 2019 +0000
| | * MH committed 704e2f3ff on Thu Feb 7 17:35:30 2019 +0000
| * | MH committed 1b34e745c on Thu Feb 7 17:41:20 2019 +0000  #### out of place
| |/
| * MH committed f77456930 on Wed Feb 6 11:43:29 2019 +0000
| * MH committed eb9849449 on Tue Feb 5 17:52:17 2019 +0000
| * MH committed 889f94b00 on Tue Feb 5 15:45:19 2019 +0000
| * MH committed ae4505a10 on Tue Feb 5 13:47:42 2019 +0000
| * MH committed 561c703b6 on Tue Feb 5 13:47:07 2019 +0000
| * MH committed 43b4941f8 on Tue Feb 5 13:45:01 2019 +0000
* | SA committed 2336ac0c7 on Mon Feb 18 10:53:49 2019 +0000  ## FIRST COMMIT -- sandwiched BETWEEN earlier commits!!!
|/
* MH committed 87fcf83a2 on Mon Feb 4 11:25:38 2019 +0000
* MH committed ea096edd3 on Fri Feb 1 17:12:01 2019 +0000
* MH committed c51cd83d3 on Fri Feb 1 10:27:52 2019 +0000

这是 git 1.7.1 的已知问题吗?

更新:我刚刚注意到 MH 所做的提交也不合适,树上看起来像树枝的东西完全是个谜。所有更改都在同一个分支上进行。

更新 2看似归因于我的令人困惑的提交(由 TortoiseGit 在 d6f0c4712 上)实际上是“与父 1 的差异”(无论这意味着什么)。我的实际提交在下面列出为“与父 2 的差异”。

标签: git

解决方案


TL;博士

git log --date-order

或者

git log --date-order --graph --oneline --decorate --pretty=format:"%cn committed %h on %cd"

细节

我能够使用 Git 1.7.1 在 CentOS 6 机器上重现您的场景。(我们也有更新的 Git,但 1.7.1 版本仍然存在。)

当有合并提交时,Git(新旧)似乎认为被合并的分支更“新”,如果你这样想是有道理的:我对我的分支进行了更改,然后我合并了在别人的改变中,所以这是最后发生的事情。

简单的解决方案是提供--date-ordergit log.

日期顺序:

$ git log --date-order --graph --oneline --decorate --pretty=format:"%cn committed %h on %cd"
*   j committed c767018 on Tue Feb 19 06:40:26 2019 -0500
|\
* | j committed f0fe88c on Tue Feb 19 06:40:10 2019 -0500
| * j committed 29b783b on Tue Feb 19 06:39:55 2019 -0500
|/
*   j committed c592f81 on Tue Feb 19 06:34:38 2019 -0500

不是日期顺序:

$ git log --graph --oneline --decorate --pretty=format:"%cn committed %h on %cd"
*   j committed c767018 on Tue Feb 19 06:40:26 2019 -0500
|\
| * j committed 29b783b on Tue Feb 19 06:39:55 2019 -0500
* | j committed f0fe88c on Tue Feb 19 06:40:10 2019 -0500
|/
*   j committed c592f81 on Tue Feb 19 06:34:38 2019 -0500

关于所有这些合并气泡的注释

在我的工作流程中,我不喜欢在历史中看到所有这些合并气泡。当我合并功能分支或错误分支时,我希望将其视为合并,但是当它只是master我尚未推送的更改时,我会尽量避免它。您在“更新”下的注释表明您也不喜欢它,所以这是我的看法。

当您执行 agit pull并且有尚未推送的本地提交时,默认情况下,Git(旧的和新的)会将远程更改合并到您的本地分支中,像我在上面重新创建的那样创建一个气泡,就像您的历史记录显示的那样。

为了避免这些,请git pull --rebase改用。

我首选的工作流程:使用git fetch,然后检查本地分支之间的差异,并origin通过添加--all到您的git log命令中,然后git rebase origin当您满意时,可以这样做。

git fetch
git log --all --date-order --graph --oneline --decorate ...

或者

git log master origin/master --date-order --graph  --online --decorate ...

然后

git rebase origin

关于变基的通常警告适用:避免变基你之前推送的任何内容。对于仅存在于您的沙箱中的本地提交,这是一个好主意。


推荐阅读