[英]Why after merge does GIT say “Already up-to-date”, but differences between branches still exist?
[英]How to create merge conflict between up-to-date - but differing - branches?
我想將舊代碼恢復到當前代碼中。
舊代碼段位於舊提交中,該提交是當前提交的遠父級。 因此,這些提交之間沒有合並沖突,合並結果為“Already up-to-date.”。
我想要:
使用git checkout [--merge]
我只能成功獲取給定文件的舊版本或新版本。
實現此目標或類似目標的最佳方法是什么? 我應該使用 git 以外的工具嗎?
編輯:合並沖突會在工作樹中產生一種差異視圖。 這很容易編輯。 如何重現這個? 最好的是,如果在此過程之后,生成的提交具有作為父母的兩個提交的興趣,因此允許 git 追溯歷史記錄中的更改。
提前致謝!
正如mkrieger1 在此評論中所說或 jthill 在此評論中所說,您想要git checkout -p
或git 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 -p
或git 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 switch
和git restore
。為了避免只有一個既應用創可貼又替換你整個身體的設備,Git 的人最終將其分成兩個單獨的命令。)
我認為您需要將合並提交和文件作為單獨的操作來制作。
要制作提交,您可以構建所需的合並,保留較新的文件,然后使用對文件的更改來修改提交。
要創建對文件的更改,您可以使用git diff
查看文件在提交范圍內的變化情況,然后修補文件或手動編輯它。
如果你想挑選很多更改,你可以在分支上有一個新的引用,然后挑選你不想要的提交。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.