簡體   English   中英

Git 合並而不進行分段更改

[英]Git merge without staging changes

我想在分支中合並,而不將自動合並的文件暫存以進行提交。 我預計合並會很混亂,我想在提交之前使用git diff來查看所有更改。 --no-commit標志阻止提交完成,但文件仍處於暫存狀態。 有沒有辦法在不暫存文件進行提交的情況下進行合並?

如果只是審查,您可以使用git diff --cached查看階段性更改。 這對你的情況有用嗎?

不。

這樣做的技術原因是 Git 的合並實際上發生在 index 中,該 index 被臨時擴展,以保存所有三個輸入提交。 隨着每個文件成功合並(無沖突),Git 將該特定索引條目縮小回一個單一的零槽條目,因此將其暫存以進行提交。 對於沖突文件,Git 將該索引條目保留為三個占用的插槽,編號為 1(合並基)、2( --ours或 HEAD 提交版本)和 3( --theirs )。

在合並期間,工作樹文件大多只是虛擬/暫存器,除了 Git 更新它們以保持合並嘗試的事實。 所有真正的行動都在索引中。 如果一切順利,所有工作樹文件都會更新以匹配最終的零槽副本,即看起來 Git 已將它們上演。 但它實際上是另一種方式:正確的版本進入了零槽的索引,然后 Git 執行了git checkout-index樣式操作,將索引文件復制到工作樹中。

正如EncryptedWatermelon 在評論中所說,您可以在此處使用git reset

git reset HEAD -- <filename>

告訴 Git 將文件的HEAD提交條目復制到該文件的索引條目。 使用git reset --mixed HEAD ,可以拼寫為git reset沒有選項,告訴 Git 為每個文件執行此操作。 1像這樣使用git reset沒有直接/直接的價值,因為您可以使用git diff --cached來比較HEAD與索引,如果您想查看文件的更新索引副本發生了什么。 但是,如果您願意,您可以這樣做,並且如果您想取消暫存所有內容,然后只暫存一些內容,無論出於何種原因,它都是可用的。


1 This --mixed form of git reset also directs Git to update the current branch name so that its stored hash ID is its current stored hash ID. If you spelled it git reset --mixed hash , you'd reset the index from the specified hash ID and write the specified hash ID into the current branch name. 通過使用HEAD ,我們強制將分支名稱的“更改”設置為“將其設置為當前值”,即根本不移動它。 這使得索引內容的覆蓋成為唯一可見的效果。

暫無
暫無

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

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