這其實是個非常簡單的指令,甚至用AS,直接右鍵操作不需要兩秒鍾
但今天使用命令行的方式操作的時候居然發現了點不一樣的地方:
如下我希望revert某個commit,找到了它的id,跑一下命令之后居然發現報錯了,如下
$ git revert d2e4217b332e8bf1
error: commit d2e4217b332e8bf1 is a merge but no -m option was given.
fatal: revert failed
然后看了下help發現,你需要用 -m 指定1或是2:git revert [id] -m [1|2]
為什么呢,不是直接反向執行下這個commit進行的修改嗎,commit加一行revert就減一行嗎?為什么還要選1還是2模式
這正好就觸及到你對git實現原理的本質理解了,git並不是基於diff進行管理的(有這樣的版本管理系統),git的每個commit都是一個當前版本的快照,簡單說每個commit都是一個完整的倉庫版本,所以當你需要revert某個commit的時候,GIT需要知道你到底是希望revert哪個commit與這個commit間的改動
不過其實並沒有那么復雜,你要revert一個commit,就是revert掉這個commit和它上個commit間的改動,所以大部分時候,你直接revert就好了,不用指定-m參數
不過當你要revert的的commit的上面有兩個commit節點的時候,問題就來了
A -> B ->
E -> F
C -> D ->
比如這里的E節點,它是AC兩個分支合並的節點,這里假設是你在A分支使用命令merge C
,那么E就有兩個上游節點了,當你在新的分支F(其實就是之前的A分支)revert E 時,你就需要加上-m參數了,當你指定1時,就是revert 掉 B到E的改動,當你指定2時,你也可以revert 掉 D到E的改動,其實大部分時候我們都是選1就好了~