這是可以做到,但要注意,如果你已經發布的提交(因爲它聽起來像你有),那麼不建議任何編輯歷史。所以有一些可能的程序。爲了這些解釋的目的,我將假定這些變化在分支my_branch
上。 (它工作正常,如果有問題的分支是master
;我只需要承擔東西與寫命令)
簡單,但笨重的
你可以回到以前的承諾,創建臨時分支,並在該分支上創建您的中間提交。然後告訴審閱者首先檢查臨時分支上的更改,然後將您的my_branch
與臨時分支區別開。如果你的評論者會爲此付出代價,那麼它就會給他們更簡單的差異而不會混亂。但也許它不會以最好的方式保存歷史。
隨着歷史重寫
如果你能做到這一點,這將讓您有一個更清潔的歷史。但它涉及歷史重寫,並且如上所述,這可能會導致其他用戶推出更改的任何回購問題。見git rebase
文檔重:從上游恢復變基
如果這不是一個問題,或者如果您發現該恢復過程是可以接受的,那麼你可以這樣做:
首先,收銀臺前提交到變化。我假設這是
git checkout my_branch^
現在你處於分離頭狀態。也許好創建一個臨時分支:
git checkout -b temp_branch
複製main
到aux
和承諾。
接下來,您需要一個與my_branch
HEAD類似的提交,但您希望其父代爲temp_branch
HEAD。如果aux
是在改變的唯一承諾:
git checkout my_branch -- aux
git commit
git branch -f my_branch
如果在提交的其他變化,那麼它可能會更容易重新家長它。還有如何在這一點上,你可以清理temp_branch
做到這一點的文檔中的git filter-branch
(https://git-scm.com/docs/git-filter-branch)
當然股票的例子。您可能需要「強制推送」my_branch
(如果它已經發布)。
git checkout my_branch
git push -f
而這所有其他的開發人員可能需要恢復,如果他們也有提及my_branch
信號。
沒有歷史重寫
如果沒有以上可以正常工作,那麼你可以嘗試這樣的:首先,使用git revert
回去變化之前。然後,分兩個階段重新應用提交。
再次,中間提交很容易做出(與重寫的情況相同)。如果對main
和aux
的更改是提交中的唯一更改,那麼您可以再次從原始提交中提取aux
以簡化創建最終提交。但是,這一次的命令將
git checkout HEAD^ -- aux
因爲HEAD
是復歸犯這樣HEAD^
是一個與它的變化。
如果提交有其他修改,然後一個braoder
git checkout HEAD^ -- .
可能會做,但我會先傾向於rm -r
工作樹剛走出偏執。你嘗試的任何步驟,您就可以驗證你與
git diff HEAD^
正確地重建了最終的樹那麼現在你有這個奇怪的背部和反覆詮釋他的歷史,但沒有改寫,並沒有「第二支」參與了簡化驗證。當然,您可能還需要分兩步進行驗證:首先顯示HEAD^
等於先前驗證的狀態,然後驗證從HEAD^
到HEAD
的補丁。
您是否將此舉作爲單獨提交進行提交,或者您是否移動了內容,然後進行編輯,然後進行提交? (關於你已經做了什麼) –
不,不幸的是,我有移動和編輯作爲一個單一的提交。 –