在我的項目中,其中一個提交引入了一個我找不到的錯誤。我想忽略其中的所有內容並繼續其他提交。 :跳過提交併在Git中
Commit1:工作正常。
提交2:不起作用。引入了一個錯誤。
Commit3:不會因爲工作的錯誤犯2
我的問題是我怎麼籤承諾3不做出承諾2的變化?
在我的項目中,其中一個提交引入了一個我找不到的錯誤。我想忽略其中的所有內容並繼續其他提交。 :跳過提交併在Git中
Commit1:工作正常。
提交2:不起作用。引入了一個錯誤。
Commit3:不會因爲工作的錯誤犯2
我的問題是我怎麼籤承諾3不做出承諾2的變化?
您可以使用互動變基除去從提交歷史的commit2
。如下具體步驟(假設3個提交上master
分支):
git checkout master
git rebase -i HEAD~3
這時會顯示交互窗口。輸入i
並改變有承諾爲:
pick <commit1 sha-1> commit1 message
drop <commit2 sha-1> commit2 message
pick <commit3 sha-1> commit3 message
然後輸入Esc鍵按鈕,輸入:wq
。
現在commit2
被刪除,你會發現commit3
的更改塊是基於commit1
。
如果這是沒有記錄的歷史記錄,則可以使用git rebase --onto commit1 commit2 commit3
從歷史記錄中刪除commit2。如果這是已發佈的歷史記錄,則應該僅使用git revert commit2
恢復來自commit2的更改。或者,如果您只想在本地臨時擁有它,則可以簽出commit3,然後執行git revert commit2 -n
,該操作也可以取消更改,但不會創建提交。
最喜歡在Git中的操作,你可以用幾種方法做到這一點:
還原錯誤犯
git revert <commit2>
如果這個錯誤提交尚未推到遠程服務器(否則你最好還原並立即修復它!=),並且你想保留你的工作並稍後修復它,你也可以創建一個新的本地分支,cherrypick正確的提交併繼續你的工作
git checkout -b "myNewBranch" <commit1>
git cherry-pick <commit3>
,如果你有一個以上的承諾摘櫻桃,重訂更方便
###create your branch but do not check it out yet.
git branch "myNewBranch" <commit1>
git rebase <commit2> --onto "myNewBranch"
這將採取所有承諾從commit2(不含)開始,由一個在應用這些都是一個你新的分支。
如果你不熟悉git命令行並使用gui,可以使用gitk輕鬆完成。這將適用於簡單的操作,如恢復和櫻桃。
最後一個建議,使用Git啓動時: 你可能做的事情錯了,搞砸你的工作區,你可以隨時恢復到以前的狀況,一旦它已被versionned提交,使用:
git reflog
//locate your commit and copy the sha key
git reset --hard mykey
知道了這一點,用命令玩的時候不要猶豫,只要你不推,你是安全的;)
你可以恢復提交2. – CoryKramer
但是如果我這樣做,我會失去提交的更改,不是嗎? –
@TheCook - 不,你不會的。 (或者更清楚一點:除了你剛剛說過的你不想要的東西外,你不會失去其他變化;即使這些變化仍然可以在歷史中看到。) –