[Git] git revert ( revert commit 和 revert merge)

轉載自:http://blog.csdn.net/qinjienj/article/details/7621887git

咱們不免會由於種種緣由執行一些錯誤的commit / push,git提供了revert命令幫助程序員修復這樣的錯誤。程序員

舉個例子,下圖是git commit 的歷史記錄spa

git revert 命令會經過一個新的commit 來使倉庫倒退一個commit,在上例中,若是程序員想要revert 最新的那次commit (Updated to Rails 2.3.2 and edge hoptoad_notifier).net

$ git revert HEAD
Finished one revert.
[master]: created 1e689e2: 
"Revert "Updated to Rails 2.3.2 and edge hoptoad_notifier""

git 會自動生成一個 Revert 「Updated to Rails 2.3.2 and edge hoptoad_notifier」 爲註釋的新 commit,這時的歷史記錄以下3d


固然,若是revert不順利的話,程序員須要手動解決conflict的問題。code

一般狀況下,上面這條revert命令會讓程序員修改註釋,這時候程序員應該標註revert的緣由,假設程序員就想使用默認的註釋,能夠在命令中加上-n或者--no-commit,應用這個參數會讓revert 改動只限於程序員的本地倉庫,而不自動進行commit,若是程序員想在revert以前進行更多的改動,或者想要revert多個commit,這個參數尤爲好用。blog

相比於revert commit,revert merge更麻煩一些,在上例中,revert commit以後,歷史記錄裏面最近的一次即爲merge,若是簡單使用下面這條revert命令,就會出現錯誤it

$ git revert HEAD~1
fatal: Commit 137ea95 is a merge but no -m option was given.

對於revert merge的狀況,程序員須要指出revert 這個merge commit中的哪個。經過--mainline參數,以及配合一個整數參數,git就知道到底要revert哪個merge。咱們先來看一下要revert的這個merge commit: io

 

$ git log HEAD~1 -1
commit 137ea95c911633d3e908f6906e3adf6372cfb0ad
Merge: 5f576a9... 62db4af...
Author: Nick Quaranto <nick@quaran.to>
Date:   Mon Mar 16 16:22:37 2009 -0400

    Merging in rails-2.3 branch

 

若是使用-m 2會revert第二個commit,也就是62db4af。ast

 

$ git revert HEAD~1 --no-edit --mainline 2
Finished one revert.
[master]: created 526b346: "Revert "Merging in rails-2.3 branch""

$ git log -1
commit d64d3983845dfa18a5d935c7ac5a4855c125e474
Author: Nick Quaranto <nick@quaran.to>
Date:   Mon Mar 16 19:24:45 2009 -0400

    Revert "Merging in rails-2.3 branch"

    This reverts commit 137ea95c911633d3e908f6906e3adf6372cfb0ad, reversing
    changes made to 62db4af8c77852d2cc9c19efc6dfb97e0d0067f5.

 

自動生成的comment也會標示revert的是merge裏的哪個commit。

相關文章
相關標籤/搜索