2013-04-26 58 views
9

我有点这个疑惑...为什么我有两个分支同样提交与不同的散列

我有在他们两人同系列的提交两个分支。

真实的历史是他们是由我的同事撰写的,承诺并推送到分支A上的github。在某个阶段,我将分支A和B分支合并。

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

这感觉就像某种rebase问题,(我们都使用GitHubForWindows的一些时间做rebase作为同步的一部分),但我不知道有问题被报告给我们任何一个。

任何想法是什么造成了这一点,或如何让它直,将不胜感激。

+2

是否使用过“cherry-pick”? – GoZoner 2013-04-26 14:44:39

+0

在过去的某个时候,是的,但不是在这一点的历史。 – Andiih 2013-04-26 14:47:11

回答

4

你应该得到一些动力工具(普通gitk应该做的很好),并仔细检查匹配(但在哈希不同)款—寻找在AuthorCommitterDate领域的差异。还要比较父提交的哈希,因为提交对象还会记录其父提交的哈希值,否则引用不同父级SHA-1提交名的相同提交将会不同。

你还可以详细说明你的提交与你的同行创作的内容“混杂”吗?所有这些提交都构成线性历史还是有合并点?

前者表示使用重新印刷。

可用到目前为止,我会做这样的信息:

  1. 使用“Github上的Windows”为没有脑子的解决方案往往造成你面对现在的情况下停止:当东西坏了,你有没有想法为什么它打破以及如何破解。
  2. 获取“常规”Git for Windows(如果您想要花哨的图形用户界面(GUI)不会试图超越用户的话,可能会得到Git Extensions)。
  3. 通过将另一个分支关闭来保存当前的功能分支。
  4. (硬 - )重置您的功能分支到您的同伴。
  5. Cherry-pick您保存的分支从最旧到最新的更改。

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

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

然后你和你的同伴应在合并和基础重建工作流程阅读起来,采用其中的一个,然后,在功能分支工作时,请执行合并和/或重订基理智,理解为什么你这样做结果会发生什么。我建议你不要盲目依靠工具来做正确的事情™。

+0

我很少使用Github的窗口 - 所有分支,合并push和pull,以及我通过poshgit外壳执行的大部分提交。大多数情况下,我使用它来首先设置身份验证,打开正确的文件夹中的shell,并查看基本历史记录。但是,项目中的其他人对此更加依赖。我们做了樱桃选择和硬重置。排序。谢谢。 – Andiih 2013-04-27 15:44:48

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 
+0

谢谢,这是我们上述场景造成的。 因此,如果您将分支X重新分支到分支Y,并且它具有来自另一分支(不是X和Y但是另一个分支X)的提交,它将创建不同的哈希(从X上的哈希)。为什么会发生?有没有什么方法可以防止这种情况发生(意思是 - 确定这些不是'本地'提交)在预先重定义钩子? – Kemeia 2017-12-20 15:18:27

2

在重新绑定串联的两个分支后,我遇到了这个“git diff diff”问题。同样的提交被应用于同一个分支点,所以我很困惑地看到分支分支。即使是patch-id也是一样的。

望着原料差异显露了它是“提交者的时间”这就是区别:

$ diff <(git show --format=raw $COMMIT1) \ 
     <(git show --format=raw $COMMIT2) 
1c1 
< commit $COMMIT1 
--- 
> commit $COMMIT2 
5c5 
< committer $ME <[email protected]> 1470128045 +0200 
--- 
> committer $ME <[email protected]> 1470129095 +0200 

--committer-date-is-author-date上修复了一些分歧的git的重订重做底垫,但不是全部。 (我不知道为什么。我觉得分歧发生在第一rerere合并?)

然后我用滤波器分支的大锤:

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 <[email protected]> 1470065063 +0200 
committer $ME <[email protected]> 1470065063 +0200 
+1

比较几乎相同的提交更好的命令:'gitshow =“git show --color --format = fuller”; diff -u <($ gitshow $ commit1)<($ gitshow $ commit2)|少-R' 通过这个命令我们有可读的CommitDate(可以是不同的)和彩色差异。 – ruvim 2017-08-22 10:36:34

相关问题