簡體   English   中英

如何搜索git存儲庫歷史記錄以查找合並錯誤?

[英]How to search a git repository history to find a merge error?

在我們過去的某些時候,git的開發分支被合並了。 但是,做出了錯誤的合並決定,因此有些代碼沒有進入我們預期會出現的主分支。 (在最終合並到主分支之前,有多個不同分支的合並。因此分支和合並歷史相當復雜。)

有沒有一種簡單的方法來搜索git存儲庫以確定哪個合並做出了“錯誤”的決定?

(我已經知道這個特例的答案,但找到它的過程有點乏味。)

編輯:git blame證明不合適的原因是在合並錯誤后的某個時間觸及了行。

沒有更多細節,我只能暗示可能的解決方案。 如果您知道受影響的文件或行,您可以嘗試git-blamegit blame *file*git blame *revision* *file* ),或者您可以使用git-log嘗試所謂的' pickaxe search',即git log -S'*line*試圖找到引入給定行或刪除給定行的修訂版。 您可以查找並檢查所有合並,例如通過git log -p -m --grep=Merge ,並檢查它們與父項的關系( -m顯示所有父項的差異;或者-c顯示組合差異但不顯示顯示瑣碎的合並變化,即如果一方被采取)。

在您的案例中可以git-bisect幫助嗎?

Git日志具有強大的搜索選項。 由於有跡象表明您可能知道一大塊代碼消失了,您可以搜索該代碼串

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

將從HERE搜索到-S之后的字符串以及僅修改(添加或刪除)行的位置

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

如果您知道由git branch merge修改的文件中的一行,您可以執行'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中消失。

繼續將修訂版切成兩半,直到找到罪魁禍首。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM