git reset & git revert 區別:
2. 在回滾這一操作上看,效果差不多。但是在日後繼續merge以前的老版本時有區別。因爲git revert是用一次逆向的commit“中和”之前的提交,因此日後合併老的branch時,導致這部分改變不會再次出現,但是git reset是之間把某些commit在某個branch上刪除,因而和老的branch再次merge時,這些被回滾的commit應該還會被引入。
3. git reset 是把HEAD向後移動了一下,而git revert是HEAD繼續前進,只是新的commit的內容和要revert的內容正好相反,能夠抵消要被revert的內容。
新的提交 ^M
與 C6
有完全一樣的內容,所以從這兒開始就像合併從未發生過除了“現在還沒合併”的提交依然在 HEAD
的歷史中。
如果你嘗試再次合併 topic
到 master
Git
會感到困惑:
$ git merge topic
Already up-to-date.
topic
中並沒有東西不能從 master
中追蹤到達。 更糟的是,如果你在 topic
中增加工作然後再次合併,Git 只會引入被還原的合併 之後 的修改。
解決這個最好的方式是撤消還原原始的合併,因爲現在你想要引入被還原出去的修改,然後 創建一個新的合併提交:
$ git revert ^M
[master 09f0126] Revert "Revert "Merge branch 'topic'""
$ git merge topic
在本例中,M
與 ^M
抵消了。 ^^M
事實上合併入了 C3
與 C4
的修改,C8
合併了 C7
的修改,所以現在 topic
已經完全被合併了。