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

时间:2013-04-26 14:35:37

标签: git github github-for-windows

我有点困惑......

我有两个分支在两个分支中具有相同的提交系列。

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

现在看来显示的是他在分支A中的提交,他们的哈希,以及我(分歧)分支中的相同提交,显示我作为作者,以及一组不同的哈希,与我正在做的工作混合在一起在我的分支上。

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

任何关于导致这种情况的想法,或者如何直截了当都会受到赞赏。

4 个答案:

答案 0 :(得分:5)

你应该得到一些电动工具(普通gitk应该做得很好)并仔细检查匹配(但是哈希值不同)提交 - 寻找AuthorCommitter中的差异和Date字段。还要比较父提交的哈希值,因为提交对象也记录了其父提交的哈希值,因此引用不同父SHA-1提交名称的相同提交将是不同的。

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

前者表示使用了变基。

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

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

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

  6. 在结果中你将拥有一个没有“虚假相同”提交的分支。

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

答案 1 :(得分:4)

如果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

答案 2 :(得分:3)

我遇到了这个" git diff diff"在重新定位两个串联的分支后发出问题。相同的提交应用于同一个fork-point,所以我很困惑地看到分支发散。甚至补丁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

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

然后我使用filter-branch作为大锤:

git filter-branch --env-filter \
'export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE'\
origin/master..HEAD

这足以使系列保持一致:

$ git show --format=raw HEAD | egrep 'author|committer'
author $ME <me@work.com> 1470065063 +0200
committer $ME <me@work.com> 1470065063 +0200

答案 3 :(得分:0)

我从不同的哈希ID的远程分支和本地分支提交了相同的提交。 似乎git pull --rebase解决了我的问题。