簡體   English   中英

如何在提交之間移動部分更改(大塊)?

[英]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某些行已更改,因此BCD等中的行也有所不同。但是您需要一個新的歷史記錄,直到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導出更改

而不是編輯所需的補丁並使用applyam應用它

$ git format-patch HEAD~10
$ git am ...

如果要創建一個文件,可以使用--stdout並將其打印到文件中:

$ git format-patch master --stdout > changes.patch

暫無
暫無

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

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