2009-02-16 93 views
8

在我們過去的git開發分支中的某個時候被合併。然而,錯誤的合併決定已經完成,因此一些代碼並沒有將其納入我們預期的主分支中。 (在最終合併到一個主分支之前有不同分支的多個合併,因此分支和合並歷史相當複雜。)如何搜索git存儲庫歷史記錄以查找合併錯誤?

是否有一種簡單的方法來搜索git存儲庫以確定在哪個合併「錯誤「做出了決定?

(我已經知道了這種特殊情況下的答案,但發現它的過程是有點乏味)

編輯:原因git的怪證明是不夠爲該線在提交某個時候觸及後合併錯誤。

回答

7

如果你知道被git分支合併修改過的文件中的一行,你可以做'git blame file.txt'並確定文件中該行的提交散列號和提交作者。然後,你可以通過git日誌並拉起與壞分支合併相關的確切提交。

編輯: 爲了迴應作者的評論,如果你正在尋找某一行的消失,那麼'git diff'結合grep和二進制搜索可能就是你想要的。假設你已經提交了數字0,1,2,3,4,5,6。你知道該行存在於版本0中,但在版本6中消失了。使用'git diff'加上grep來搜索失蹤。

git diff 0 6 | grep '- line I care about' 

第一次迭代,你會看到你關心的行消失。然後,你砍版本號的一半,然後再試一次

git diff 0 3 | grep '- line I care about' 

如果grep的仍顯示線消失(與「 - 」符號),那麼你就知道行版本0消失了3.如果grep 沒有顯示行消失,則行在修訂4-6中消失。

繼續剪裁修改一半,直到找到罪魁禍首。

+0

問題是該行在「合併錯誤」後的某個時候被觸及。我知道補丁什麼時候推出,但不知道它何時首次退出。 – Atlas1j 2009-02-17 01:43:46

+1

然後使用git log提供的選項來進行git diff和search。特別是,嘗試`git log .. -S「我關心的行」--diff-filter = M` – 2011-08-12 04:34:06

10

沒有更多的細節我只能暗示可能的解決方案。如果你知道影響了文件或行,你可以嘗試要麼git-blamegit blame *file*,或git blame *revision* *file*),或者你可以嘗試所謂的「搜索」與git-log,即git log -S'*line*試圖找到其介紹給定的行或刪除特定的修訂線。您可以找到並檢查所有合併,例如通過git log -p -m --grep=Merge,並檢查它們與父母的關係(-m向所有父母顯示差異;或者-c顯示合併差異,但不顯示合併差異的輕微變化,即如果採用一方) 。

0

對於其他尋找更簡單的解決方案的人,請啓動gitk(或者從Git GUI轉到Repository> Visualize X History)並使用其查找工具。

9

Git日誌具有強大的搜索選項。因爲有你可能知道的那個消失了的代碼塊中的指示,你可以搜索的代碼串

git log <HERE>..<THERE> -S"line I care about" --diff-filter=M

將從這裏-S後搜到那裏的字符串,只有當行修改(添加或刪除)

如果您使用-G而不是-S,則可以在搜索中實現更高的精度。 -G提供正則表達式搜索,而不是使用-S進行字符串文字搜索。

相關問題