为什么git在合并后会丢失日志提交?

时间:2016-07-27 06:00:48

标签: git merge git-log

我试图将开发分支合并到主服务器中。但它似乎撤消了在master中提交的提交,只要特定提交不再出现在文件的git log中。

当我在主分支上时,我可以在7月14日看到提交2d1b9af

c:\src>git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

c:\src>git log server\Fitnesse\FitNesseRoot\APITest\content.txt
commit 88a68b11b273b98531ae686b85b5733b86706bda
Author: charles
Date:   Fri Jul 15 00:56:44 2016 +0000

    XX-338 Add IsDeleted to Place table

commit 2d1b9afdabd7fbbf970d697bd0c15957a8fd288a
Author: charles
Date:   Thu Jul 14 23:15:28 2016 +0000

    fix FitNesse test which are broken by renaming

commit f1616fed48bb15c1c120cfe016e571f49aae6244
Author: charles
Date:   Tue Jun 21 11:04:53 2016 +1200

    modify fitNesse Test for new API changes.

然后我合并了我的大分支。

c:\src>git merge origin/myLargeBranch
Removing server/Database/355_UnitTest.sql
Merge made by the 'recursive' strategy.
 .../packages.config                                |   2 +-
 .../Utilities/Extensions/StringExtensions.cs       |  10 +
 .../Utilities/Throttle.cs                          |  45 ++++

 [ ... etc ]

 .../FitNesseRoot/APITest/content.txt         |  37 +--
 128 files changed, 3705 insertions(+), 481 deletions(-)
 create mode 100644 [ ... ] 

c:\src>git status
On branch master
Your branch is ahead of 'origin/master' by 32 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

我在这里注意到它改变了我正在看的文件。自从我拿到分支以来,我还没有真正修改过这个文件。这可能与我的问题有关,但并不是我特别提出的问题。

现在对我来说最重要的是,他从7月14日起就不再在我的日志中了:

c:\src>git log server\Fitnesse\FitNesseRoot\APITest\content.txt
commit f1616fed48bb15c1c120cfe016e571f49aae6244
Author: charles
Date:   Tue Jun 21 11:04:53 2016 +1200

    modify fitNesse Test for new API changes.

commit 16b7beb9d1045f5fe7354c0fdbe637a49bb48ce0
Author: charles
Date:   Tue May 10 10:54:13 2016 +1200

所以我担心最终会得到错误的代码。这是一个担心的

但我真的更担心git现在没有在其中显示有关更改的日志。

我错过了什么?

更新在@ tim-biegeleisen的评论之后,我已经跟踪了实际的提交,但仍然感到困惑。

罪魁祸首似乎是从主人到我的开发分支的合并:

c:\src>git show b5637f9
commit b5637f9a65e415f1b415fad99c9e7a4e6b46ab1a
Merge: cb8ed90 6b5c0e1
Author: GregH <GregH@GREGH-LT001>
Date:   Tue Jul 26 04:25:40 2016 +0000

    Merge from master
[ ... ] 

cb8 ...是我的分支:

c:\src>git checkout cb8ed90
Previous HEAD position was 6b5c0e1... PR 93: Merge DeletePlace to master
HEAD is now at cb8ed90... Added tests for apple messages


c:\src>git log server\Fitnesse\FitNesseRoot\APITest\content.txt
commit f1616fed48bb15c1c120cfe016e571f49aae6244
Author: charles
Date:   Tue Jun 21 11:04:53 2016 +1200

6b5 ...是主人

c:\src>git checkout 6b5c0e1
Previous HEAD position was cb8ed90... Added tests for apple messages
HEAD is now at 6b5c0e1... PR 93: Merge DeletePlace to master

c:\src>git log server\Fitnesse\FitNesseRoot\APITest\content.txt
commit 88a68b11b273b98531ae686b85b5733b86706bda
Author: charles
Date:   Fri Jul 15 00:56:44 2016 +0000

合并后,我已于7月14日和15日失去了提交。

c:\src>git checkout b5637f9
Previous HEAD position was 6b5c0e1... PR 93: Merge DeletePlace to master
HEAD is now at b5637f9... Merge from master

c:\src>git log server\Fitnesse\FitNesseRoot\APITest\content.txt
commit f1616fed48bb15c1c120cfe016e571f49aae6244
Author: charles
Date:   Tue Jun 21 11:04:53 2016 +1200

**更新:**由VonC建议,git log --all显示提交仍在历史记录中。

没有--all,如上所示,显示最新更新jun 21     git log server \ Fitnesse \ FitNesseRoot \ APITest \ content.txt (没点重复)。

--all他们会在那里:

c:\src>git log --all server\Fitnesse\FitNesseRoot\APITest\content.txt
commit 88a68b11b273b98531ae686b85b5733b86706bda
Author: charles
Date:   Fri Jul 15 00:56:44 2016 +0000

    XX-338 Add IsDeleted to Place table

commit 2d1b9afdabd7fbbf970d697bd0c15957a8fd288a
Author: charles
Date:   Thu Jul 14 23:15:28 2016 +0000

    fix FitNesse test which are broken by renaming

commit f1616fed48bb15c1c120cfe016e571f49aae6244
Author: charles
Date:   Tue Jun 21 11:04:53 2016 +1200

    modify fitNesse Test for new API changes.

那么他们怎么会在合并期间撤消?

1 个答案:

答案 0 :(得分:1)

git log获得的输出实际上相当棘手。你可以触发很多陷阱。在这种情况下你要打的那个被称为“历史简化”。引自the documentation

  

有时您只对历史记录的某些部分感兴趣,例如修改特定&lt;路径&gt;的提交。但历史简化有两个部分,一部分是选择提交,另一部分是如何做,因为有各种简化历史的策略。

     

以下选项选择要显示的提交:

     

<paths>

     

提交修改给定的&lt;路径&gt;被选中。

     

--simplify-by-decoration

     

选择某些分支或标记引用的提交。

     

请注意,可以显示额外的提交以提供有意义的历史记录。

     

以下选项会影响简化的执行方式:

     

默认模式

     

将历史简化为最简单的历史,解释树的最终状态。最简单的,因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧枝

     

--full-history

     

与默认模式相同,但不会修剪某些历史记录。

     

[剪断]

在合并之前,Git简化了所查看的历史记录,而没有查看合并的路径。

合并后,Git简化了查看历史记录,同时查看合并的路径(或者更确切地说,“两条路径”)。由于你使用默认模式,这允许Git“修剪一些侧枝”,正如文档所说(没有详细介绍哪些侧枝被修剪,尽管后来还有更多在使用单词TREESAME的部分中:未明确说明,除了列出的&lt;路径&gt;中的文件之外,在删除每个文件后都会对TREESAME进行测试。

如果您添加--full-history,您应该会看到您的提交返回。

请注意,如果您未指定某些路径,则会启用历史记录简化,除非您添加一些特定的简化选项(在我剪切的部分中)。