2010-11-29 57 views
274

我忽略了自己的歷史,想對它做一些改變。問題是,我提交了兩個不相關的更改,並且此提交被本地(未推送)歷史記錄中的其他更改所包圍。如何分解歷史中的Git commit?

我希望在推出之前拆分這個提交,但是我看到的大多數指南都與拆分最近的提交或未提交的本地更改有關。對於一個埋在歷史中的提交來說,這樣做是否可行,而不必從那時起「重新執行」我的提交?

+1

可能的副本[將副本提交+修改爲副本提交併使用git修改提交](http://stackoverflow.com/questions/2118042/split-a-commit-of- a-copymodify-into-a-copy-commit-and-a-modify-commit-using-git) – 2013-07-14 19:20:49

回答

421

有一個拆分承諾in the rebase manpage指南。的快速摘要是:

  • 執行交互式底墊包括目標提交(例如git rebase -i <commit-to-split>^ branch)並標記它被編輯。

  • 當rebase達到該提交時,使用git reset HEAD^重置爲提交之前,但保持工作樹完好無損。

  • 遞增添加更改並提交它們,根據需要進行儘可能多的提交。 add -p可用於僅添加給定文件中的某些更改。如果您想要將原始提交消息重新用於某個提交,請使用commit -c ORIG_HEAD

  • 如果你想測試你犯了什麼(好主意!)使用git stash遁形你有沒有犯的部分(或stash --keep-index之前,你甚至提交它),測試,然後git stash pop返回休息到工作樹。繼續提交,直到你完成所有修改,即有一個乾淨的工作樹。

  • 運行git rebase --continue繼續在現在分離的提交之後應用提交。

-1

如果您還沒有推送,請使用git rebase。更好的是,使用git rebase -i以交互方式移動提交。您可以將違規提交移到前面,然後按需要將其拆分,然後將補丁移回(如果需要)。

+13

沒有必要將它移動到任何地方。將其拆分到原來的位置。 – Cascabel 2010-11-29 19:15:22

+1

不幸的是,這對我不起作用,因爲提交後的一些歷史記錄依賴於它,所以我有點受限制。但是,這將是我的第一選擇。 – Ben 2010-11-29 19:48:59