所以,情況是這樣的:如何在不連續的提交之間移動更改?
Commit A
**Commit B**
Commit C
Commit D
**Commit E**
是否有可能從挑一個文件的變化提交é並將其移動到提交乙?提交C和D沒有與該特定文件相關的任何內容,所以我希望這是可行的。
所以,情況是這樣的:如何在不連續的提交之間移動更改?
Commit A
**Commit B**
Commit C
Commit D
**Commit E**
是否有可能從挑一個文件的變化提交é並將其移動到提交乙?提交C和D沒有與該特定文件相關的任何內容,所以我希望這是可行的。
您可以檢出文件,因爲它在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分支回到它來自的地方)
所有艱難重組可能是更直接的選擇,最終結果應該與目標文件類似。
嘗試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,但在新的順序相同的變化。根據順序,或者如果您刪除了一些提交,可能會發生衝突。小心。
嘗試使用git-cherry-pick'git-scm.com/docs/git-cherry-pick' –