2013-04-26 56 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

相關問題