我們難免會因為種種原因執行一些錯誤的commit / push,git提供了revert命令幫助程序員修復這樣的錯誤。
舉個例子,下圖是git commit 的歷史記錄
git revert 命令會通過一個新的commit 來使倉庫倒退一個commit,在上例中,如果程序員想要revert 最新的那次commit (Updated to Rails 2.3.2 and edge hoptoad_notifier)
$ 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,這時的歷史記錄如下
當然,如果revert不順利的話,程序員需要手動解決conflict的問題。
通常情況下,上面這條revert命令會讓程序員修改注釋,這時候程序員應該標注revert的原因,假設程序員就想使用默認的注釋,可以在命令中加上--no-edit參數。另一個重要的參數是-n或者--no-commit,應用這個參數會讓revert 改動只限於程序員的本地倉庫,而不自動進行commit,如果程序員想在revert之前進行更多的改動,或者想要revert多個commit,這個參數尤其好用。
相比於revert commit,revert merge更麻煩一些,在上例中,revert commit之后,歷史記錄里面最近的一次即為merge,如果簡單使用下面這條revert命令,就會出現錯誤
$ git revert HEAD~1 fatal: Commit 137ea95 is a merge but no -m option was given.
對於revert merge的情況,程序員需要指出revert 這個merge commit中的哪一個。通過-m或者--mainline參數,以及配合一個整數參數,git就知道到底要revert哪一個merge。我們先來看一下要revert的這個merge commit:
$ 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
如果使用git revert HEAD~1 -m 1命令,也就是5f576a9,使用-m 2會revert第二個commit,也就是62db4af。
$ 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。
直接revert一次merge提交:
git revert f67024f9df95bb8fb01228ce596e7c33ccef1753 -m 1