2017-06-02 76 views
0

在我的項目中,其中一個提交引入了一個我找不到的錯誤。我想忽略其中的所有內容並繼續其他提交。 :跳過提交併在Git中

Commit1:工作正常。

提交2:不起作用。引入了一個錯誤。

Commit3:不會因爲工作的錯誤犯2

我的問題是我怎麼籤承諾3不做出承諾2的變化?

+0

你可以恢復提交2. – CoryKramer

+0

但是如果我這樣做,我會失去提交的更改,不是嗎? –

+0

@TheCook - 不,你不會的。 (或者更清楚一點:除了你剛剛說過的你不想要的東西外,你不會失去其他變化;即使這些變化仍然可以在歷史中看到。) –

回答

0

您可以使用互動變基除去從提交歷史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

1

如果這是沒有記錄的歷史記錄,則可以使用git rebase --onto commit1 commit2 commit3從歷史記錄中刪除commit2。如果這是已發佈的歷史記錄,則應該僅使用git revert commit2恢復來自commit2的更改。或者,如果您只想在本地臨時擁有它,則可以簽出commit3,然後執行git revert commit2 -n,該操作也可以取消更改,但不會創建提交。

2

最喜歡在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 

知道了這一點,用命令玩的時候不要猶豫,只要你不推,你是安全的;)