[英]How do i move partial changes (hunks) between commits?
如果我有兩個提交,並且它們之間有很多提交,並且在兩個提交中都有很多文件,那么如何最好將一個塊從一個移動到另一個,例如:
在提交100中:我有很多文件更改,並且在文件“ aa.txt”中也有很多更改,還有一個: - aaaa - bbbb + cccc
10次提交后,我又進行了一次提交,更改了很多文件,並且還添加了“ aa.txt”: +dddd
我想將線更改-aaaa
從前者移到后者。
是否有任何CLI / UI工具可幫助您輕松實現? (我顯然對歷史記錄沒有問題)
交互式基礎庫可能會起作用。 但是,許多因素可能會使這一情況復雜化。 所以您已經描述了很多:
x -- x -- A -- B -- C -- D -- x -- x <--(master)
A
某些行已更改,因此B
, C
, D
等中的行也有所不同。但是您需要一個新的歷史記錄,直到D
才更改。 所以你可以說
git rebase --interactive A^ master
(其中A
是先前具有更改的提交的SHA ID,請注意該ID末尾的^
)。 在出現的文本編輯器中,您將看到一個“待辦事項”列表。 第一行說pick
提交A
; 將其更改為edit
。 然后找到D
的行(在本示例中為3次提交,但在您聲明的示例中為10次以后提交)。 同時標記它以進行edit
。
重新設置將開始,但是在臨時重新應用A
,它將暫停,因此您可以編輯提交。
現在,如果您無法輕松撤消有問題的更改,可以手動/從內存中進行,那么您可以取消對該文件的更改
git reset HEAD^ -- aa.txt
然后將它們再次置於“補丁模式”。
git add --patch -- aa.txt
系統將提示您如何處理每個變更請求。 如果您要刪除的更改與其他更改顯示在相同的塊中,則可以用e
回答提示並編輯更改塊(然后將-
替換為不再要刪除的行之前的-
)。
現在將您的(暫存)編輯內容提交
git commit --amend
您從索引還原的更改仍在工作樹中。 擺脫它,並告訴rebase恢復工作。
git stash
git rebase --continue
隨着rebase繼續致力於提交D
,介入的提交可能會發生沖突(如果它們對aa.txt的編輯過於接近您還原的更改)。 這些沖突應易於解決。 (沖突的HEAD
端將包含您不再刪除的行;除了該行之外,您可能還希望沖突的“另一端”。)
提交D
也可能會引起沖突。 如果是這樣,您的工作就很容易:只需保留沖突的“另一側”(包括刪除有問題的行,因為這是您最終要執行的操作)來解決該問題。 然后,當分別提示您編輯D
(因為您在TODO列表中將其標記為edit
)時,您可以立即將rebase告知--continue
。
如果D
不沖突,那么沒什么大不了的。 系統將提示您進行編輯。 彈出您先前創建的存儲,以重新應用從A
提交延遲的更改; add
; commit --amend
現在,這種方法存在問題:如果有多個引用可以到達A
,則只會更新一個(在上面的示例中為master
)。 所以舉個例子
x -- A -- B -- C -- D -- x <--(master)
\
x -- x <--(branch)
在這種情況下, branch
仍然可以看到舊的歷史記錄。 你最終得到
x -- A' -- B' -- C' -- D' -- x <--(master)
\
A -- B -- x -- x <--(branch)
您可以通過執行類似的操作來解決此問題
rebase --onto B' B branch
如果要處理很多分支,這將很快變老。
另一個問題是,如果變基將遇到合並提交。 在某種程度上,您可以使用--preserve-merges
來緩解這種情況,但是如果合並是“邪惡的”(即可以使用默認的合並策略自動解決,但在其中進行了編輯),它仍然會引起問題(可能默默地破壞歷史記錄)某種方式)。 在這種情況下,您最能做的就是在各個步驟中重新建立段基礎並仔細地復制合並。
使用git format-patch
導出更改
而不是編輯所需的補丁並使用apply
或am
應用它
$ git format-patch HEAD~10
$ git am ...
如果要創建一個文件,可以使用--stdout
並將其打印到文件中:
$ git format-patch master --stdout > changes.patch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.