另一種選擇是git rebase -i
。它比git revert
涉及更多,但您也有更多的選擇。
比方說,你有一個混帳回購協議只包含一個README文件:
$ cat README
This is line alpha.
Line Beta.
Line Gamma.
然後你刪除線測試並提交您的更改:
(make changes)
$ git commit -am 'removed beta'
現在,添加一些行,犯一路上:
(make changes)
$git commit -am 'added delta'
(make changes)
$git commit -am 'added epsilon'
現在我們的README文件和git的日誌是這樣的:
$ cat README
This is line alpha.
Line Gamma.
Line Delta.
Line Epsilon.
$ git log --pretty=oneline
56ae2db58905607270434045b2a7218237d3716e added epsilon
058ec4b92fb279370f6e5b81c4aebb6250f93c6b added delta
19801b380956b60f36b4922796ea86935a75e569 removed beta
bc9057cebf05352eb5596eaf753708a14de589d2 initial commit
現在我們決定不應該刪除測試版。 git rebase
來拯救!每當我做任何重塑我喜歡使用臨時分支,因爲我正在改變歷史。
$ git checkout -b fixingthings
現在我們想要重新佈置自我們初次提交以來發生的所有事情。看着日誌,這是提交bc9057c...
。現在
$ git rebase -i bc9057c
,你會在你的編輯器中看到這一點:
pick 19801b3 removed beta
pick 058ec4b added delta
pick 56ae2db added epsilon
# Rebase bc9057c..56ae2db onto bc9057c
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
底部的意見是有益的。只需要刪除與你想要擺脫提交的行,保存並退出,git會照顧其餘的。現在您的自述文件如下所示:
$ cat README
This is line alpha.
Line Beta.
Line Gamma.
Line Delta.
Line Epsilon.
這就像魔法!
如果你願意,你現在可以合併回你的主分支並刪除你的臨時分支。
$ git checkout master
Switched to branch "master"
$ git merge fixingthings
Auto-merging README
Merge made by recursive.
$ git branch -d fixed
Deleted branch fixingthings (was 1247141).
git rebase
做什麼是考慮每提交一個補丁,並重播它們按順序(或沒有,因爲你告訴它)。這意味着你可以合併衝突。如果這發生在你身上,rebase會暫停並讓你解決衝突。有很多關於在這種情況下做什麼的教程。 This one looked good to me.