在我們過去的git開發分支中的某個時候被合併。然而,錯誤的合併決定已經完成,因此一些代碼並沒有將其納入我們預期的主分支中。 (在最終合併到一個主分支之前有不同分支的多個合併,因此分支和合並歷史相當複雜。)如何搜索git存儲庫歷史記錄以查找合併錯誤?
是否有一種簡單的方法來搜索git存儲庫以確定在哪個合併「錯誤「做出了決定?
(我已經知道了這種特殊情況下的答案,但發現它的過程是有點乏味)
編輯:原因git的怪證明是不夠爲該線在提交某個時候觸及後合併錯誤。
在我們過去的git開發分支中的某個時候被合併。然而,錯誤的合併決定已經完成,因此一些代碼並沒有將其納入我們預期的主分支中。 (在最終合併到一個主分支之前有不同分支的多個合併,因此分支和合並歷史相當複雜。)如何搜索git存儲庫歷史記錄以查找合併錯誤?
是否有一種簡單的方法來搜索git存儲庫以確定在哪個合併「錯誤「做出了決定?
(我已經知道了這種特殊情況下的答案,但發現它的過程是有點乏味)
編輯:原因git的怪證明是不夠爲該線在提交某個時候觸及後合併錯誤。
如果你知道被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中消失。
繼續剪裁修改一半,直到找到罪魁禍首。
git-bisect可以幫助你的情況嗎?
對於其他尋找更簡單的解決方案的人,請啓動gitk
(或者從Git GUI轉到Repository> Visualize X History)並使用其查找工具。
Git日誌具有強大的搜索選項。因爲有你可能知道的那個消失了的代碼塊中的指示,你可以搜索的代碼串
git log <HERE>..<THERE> -S"line I care about" --diff-filter=M
將從這裏-S
後搜到那裏的字符串,只有當行修改(添加或刪除)
如果您使用-G而不是-S,則可以在搜索中實現更高的精度。 -G提供正則表達式搜索,而不是使用-S進行字符串文字搜索。
問題是該行在「合併錯誤」後的某個時候被觸及。我知道補丁什麼時候推出,但不知道它何時首次退出。 – Atlas1j 2009-02-17 01:43:46
然後使用git log提供的選項來進行git diff和search。特別是,嘗試`git log .. -S「我關心的行」--diff-filter = M` –
2011-08-12 04:34:06