为什么我在具有不同哈希值的两个分支中具有相同的提交

And*_*iih 10 git github github-for-windows

我对此有点疑惑......

我有两个分支,它们都有相同的提交系列.

真实的历史是他们是由我的同事创作的,他们被提交并推送到分支A上的github.在某个阶段,我将分支A与我的B分支合并.

什么混帐现在似乎显示是他在分公司一提交,与他们的哈希值,并在我的(分歧)分支相同的提交,显示我作为作者,和不同的散列集,与我在做我的分支工作间杂.

这感觉就像某种rebase问题,(我们都在某些时候使用GitHubForWindows作为同步的一部分进行rebase)但是我不知道向我们任何一个人报告了一个问题.

关于导致这种情况的原因,或者如何直截了当的任何想法将不胜感激.

bsb*_*bsb 6

在重新调整串联的两个分支后,我遇到了这个“git diff diff”问题。相同的提交应用于相同的分叉点,因此我很困惑地看到分支分歧。甚至补丁 ID 都是一样的。

查看原始差异发现差异在于“提交者时间”:

$ diff <(git show --format=raw $COMMIT1) \
       <(git show --format=raw $COMMIT2)
1c1
< commit $COMMIT1
---
> commit $COMMIT2
5c5
< committer $ME <me@work.com> 1470128045 +0200
---
> committer $ME <me@work.com> 1470129095 +0200
Run Code Online (Sandbox Code Playgroud)

在 git rebase 上重做 rebase--committer-date-is-author-date修复了一些分歧,但不是全部。(我不确定为什么......?我认为分歧发生在第一次 rerere 合并时)

然后我使用过滤器分支作为大锤:

git filter-branch --env-filter \
'export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'\
origin/master..HEAD
Run Code Online (Sandbox Code Playgroud)

这足以使该系列保持一致:

$ git show --format=raw HEAD | egrep 'author|committer'
author $ME <me@work.com> 1470065063 +0200
committer $ME <me@work.com> 1470065063 +0200
Run Code Online (Sandbox Code Playgroud)

  • 用于比较几乎相同提交的更好命令: `gitshow="git show --color --format=fuller" ;diff -u &lt;($gitshow $commit1) &lt;($gitshow $commit2) | less -R` 通过此命令,我们可以获得可读的 CommitDate (可以不同)和彩色差异。 (2认同)

GoZ*_*ner 5

如果git rebase是您工作流程的一部分,那么您描述的内容很常见。例如:

$ git log --graph --oneline --all
* 76af430 fc           # branch: foo
| * 7c495ad mb         # branch: bar, master
|/  
* 74cbb35 a

$ git rebase foo       # while on branch master
First, rewinding head to replay your work on top of it...
Applying: mb

$ git log --graph --oneline --all
* 6810e67 mb           # branch: master
* 76af430 fc           # branch: foo
| * 7c495ad mb         # branch: bar
|/  
* 74cbb35 a
Run Code Online (Sandbox Code Playgroud)


kos*_*tix 5

你应该得到一些动力工具(平原gitk应该做的很好),并仔细检查匹配(但不同的哈希值)的提交-寻找在分歧Author,CommitterDate领域.还要比较父提交的哈希值,因为提交对象还记录其父提交的哈希值,因此引用不同父SHA-1提交名称的相同提交将是不同的.

您还可以详细说明您的提交与您的同行创作的"混合"的准确程度吗?所有这些提交是否形成线性历史或是否有合并点?

前者表明使用了变基.

根据目前可用的信息,我会这样做:

  1. 停止使用"Github for Windows"进行简单易用的解决方案往往会造成你现在面临的情况:当出现问题时,你不知道它为什么会破坏以及如何破坏.
  2. 获得Windows的 "常规" Git(如果你想要花哨的GUI而不是试图超越用户,可能是Git Extensions).
  3. 通过分支另一个分支来保存当前功能分支.
  4. (硬)将您的功能分支重置为您的功能分支.
  5. 樱桃 -从您保存的分支中选择从最旧到最新的更改.

    这可能会产生冲突(因为这些提交将被植入到最初创建的不同代码状态).

在结果中,您将拥有一个没有"虚假相同"提交的分支.

那么你和你的同伴都应该阅读合并和重新定位工作流程,采用其中一个,然后在处理功能分支时,合理地进行合并和/或重新定位 ,理解你为什么这样做以及结果会发生什么.我建议你不要盲目依赖工具来做正确的事情™.