簡體   English   中英

如何在最新但不同的分支之間創建合並沖突?

[英]How to create merge conflict between up-to-date - but differing - branches?

我想將舊代碼恢復到當前代碼中。

舊代碼段位於舊提交中,該提交是當前提交的遠父級。 因此,這些提交之間沒有合並沖突,合並結果為“Already up-to-date.”。

我想要:

  • 使用合並沖突視圖來區分提交之間的差異,並使用沖突解決來跟蹤我想要保留的當代更改以及我想要恢復的舊代碼。
  • 如果可能 - 保留 git 提交歷史:不相關代碼的最近提交和我要恢復的這個舊片段的舊提交歷史。

使用git checkout [--merge]我只能成功獲取給定文件的舊版本或新版本。

實現此目標或類似目標的最佳方法是什么? 我應該使用 git 以外的工具嗎?

編輯:合並沖突會在工作樹中產生一種差異視圖。 這很容易編輯。 如何重現這個? 最好的是,如果在此過程之后,生成的提交具有作為父母的兩個提交的興趣,因此允許 git 追溯歷史記錄中的更改。

提前致謝!

正如mkrieger1 在此評論中所說或 jthill 在此評論中所說,您想要git checkout -pgit cherry-pick 我的猜測是后者可能會更好地為您服務,但對於這兩種操作,您應該了解以下內容:

  • Git 是關於提交的,每次提交都包含所有文件的完整快照 (除此之外還有更多,但這是這里的關鍵項目。)這些文件一直被凍結,否則就像你(或任何人)在你運行git commit . 它們特殊的、壓縮的、只讀的、Git-only、去重的格式存儲,所以它們不會占用額外的空間,盡管大多數快照大多重復使用以前快照中的大部分文件,但它們仍然是所有文件的完整快照。

  • Git 通過將提交中的快照與其父提交中的快照進行比較來顯示提交。 也就是說,假設提交b789abc有父a1234546 (每個提交都有一個唯一的編號,表示為一個大丑陋的十六進制hash ID;這些是 hash ID 的縮寫。)這兩個提交有兩個快照。 由於這些快照中的文件經過去重,Git 可以非常快速且輕松地從顯示中丟棄所有 100% 相同的文件。 對於剩余的(不相同的)文件,Git 會比較它們,就像玩找不同游戲一樣,並向您顯示哪些行不同

這就是為什么提交看起來像是包含更改,但實際上並沒有。 (這對於合並提交尤其重要,它有兩個父級,但只有一個快照。提交顯示代碼在這里有問題,因為沒有明顯的父級可用於進行比較,所以默認情況下, git log -p只是不不要費心顯示任何關於合並的信息。默認情況下git show命令顯然做得更好,但可以說仍然是錯誤的或誤導的。)

Git的差異引擎非常高效和強大,可以比較任意兩個提交快照 例如,它還可以處理提交快照和檢出樹,以及其他一些重要情況,但我們只關注這里的快照。

這意味着您可以運行:

git diff <hash1> <hash2>

和 Git 將產生一個 diff(一種更改配方),如果將其應用於hash1的快照,將在hash2中產生快照。 如果您願意,您可以獲取此快照並將其編輯為一小部分更改並將其提供給git apply

但你不必那樣做。 git cherry-pick命令將接受任何給定的單親提交——由於顯而易見的原因,它在合並提交方面存在問題——並將其與其父提交進行比較,就像git log -pgit show所做的那樣,看看發生了什么變化 然后它將嘗試將相同的更改應用於當前提交 因此,您只需檢查要修改的內容,然后git cherry-pick進行該更改的原始提交,現在您再次進行了相同的更改。 cherry-pick 命令甚至可以為您復制原始提交的日志消息(和作者)。 您可以使用--edit編輯消息並使用--reset-author重置作者。

如果您想要的更改與其他更改混合在一起,和/或需要挑選許多提交,您可以改為讓 Git 運行一個文件的差異——相當於:

git diff <hash> -- my/one/file.ext

- 然后以交互方式讓您選擇此處顯示的每個更改到一個選定的文件。 為此,您只需運行:

git checkout -p my/one/file.ext

或者:

git restore -p my/one/file.ext

(這兩個命令在這里做同樣的事情; git restore只是一種新的、不易出錯的方法。舊的git checkout命令做了太多的工作:它同時實現了git switchgit restore 。為了避免只有一個既應用創可貼替換你整個身體的設備,Git 的人最終將其分成兩個單獨的命令。)

我認為您需要將合並提交和文件作為單獨的操作來制作。

要制作提交,您可以構建所需的合並,保留較新的文件,然后使用對文件的更改來修改提交。

要創建對文件的更改,您可以使用git diff查看文件在提交范圍內的變化情況,然后修補文件或手動編輯它。

如果你想挑選很多更改,你可以在分支上有一個新的引用,然后挑選你不想要的提交。

暫無
暫無

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

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