2015-08-28 90 views
0

所以,情況是這樣的:如何在不連續的提交之間移動更改?

Commit A 
**Commit B** 
Commit C 
Commit D 
**Commit E** 

是否有可能從挑一個文件的變化提交é並將其移動到提交乙?提交C和D沒有與該特定文件相關的任何內容,所以我希望這是可行的。

+0

嘗試使用git-cherry-pick'git-scm.com/docs/git-cherry-pick' –

回答

0

您可以檢出文件,因爲它在COMMIT-E
中請注意,這將撤消您對當前分支中的文件所做的任何更改。 但是,您可以輕鬆地編輯出對該文件不需要的更改,因爲它們將落入您的提交差異。

# checkout COMMIT-B, ether check out the commit directly (headless mode), or checkout the relevan branch. 
git checkout COMMIT-B 
git checkout COMMIT-E ./dir/myfile.ext 

該文件現在在您的工作目錄中,您可以單獨提交它或作爲其他提交的一部分提交。如果您直接簽出COMMIT-B(沒有分支),請確保在您離開之前創建分支。

請注意,如果您沒有指定checkout命令的路徑,那麼您的HEAD將發生變化,這是您不想要的。

如果您對當前分支中的特定文件進行了任何更改,並且您希望保留那些文件(如上所述)而不必編輯該文件,則需要選擇commit-E中的更改。

# checkout COMMIT-B, ether check out the commit directly (headless mode), or checkout the relevan branch. 
git checkout COMMIT-B 
git cherry-pick -n COMMIT-E 
# clean up the changes you don't want, then commit the changes you are interested in. 

如果有在其他分支中的文件多的變化,分佈在多次提交,它可能會非常棘手採摘櫻桃所有這些變化。您可以嘗試將當前分支頂部的分支重新綁定,然後再次檢出文件,如上所示。 或者你可以在你當前的分支創建一個臨時分支,在臨時分支中合併另一個分支,結帳COMMIT-B,從臨時分支簽出文件,提交文件(通過刪除臨時分支清理並重置合併-in分支回到它來自的地方)
所有艱難重組可能是更直接的選擇,最終結果應該與目標文件類似。

0

嘗試git-rebase

git rebase -i commitA~1 

這將打開您的默認編輯器,選擇從要重做commitA什麼承諾。

你會看到這樣的事情:

pick SHA1 commitA 
pick SHA1 commitB 
pick SHA1 commitC 
pick SHA1 commitD 
pick SHA1 commitE 

更改它,如你所願。在你的情況下:

pick SHA1 commitA 
pick SHA1 commitE 
pick SHA1 commitC 
pick SHA1 commitD 
pick SHA1 commitB 

這將生成一個新的歷史提交與不同的SHA1,但在新的順序相同的變化。根據順序,或者如果您刪除了一些提交,可能會發生衝突。小心。

+0

我假定提交E有多個文件更改。在這種情況下,rebase不會從提交E中選擇「一個文件更改」,而是將它「移動」到提交B. rebase將重新排序他所做的提交,但會保留提交中提交E所做的更改。如果提交E只有一個文件更改,那麼你可以做這個交互式重定位並壓縮這兩個提交以某種方式將提交E中的唯一文件更改「移動」到提交B.如果提交E具有多個文件更改,則手動根據@ willem-dhaeseleer的建議移動您需要的一個文件更改。 – aag

+0

@aag在你說的情況下,首先,你可以用'git commit -amend'分割commitE。之後,再做一次rebase。 – blashser

相關問題