git reset與git revert比較


git reset

git reset的作用是還原Index的狀態或修改本地分支HEAD的位置。這個命令適合用於從某個提交點重新開新的分支。比如,如果某個提交之后的代碼我們都不要了,就可以在本地reset至指定commit,然后開一個新的branch繼續新的開發(原來分支在遠程上沒有發生任何變化的)。

使用git reset是不影響遠程分支的,一切都在本地發生。如果回退需要很快影響遠程分支的,應該使用git revert。

git revert

 

假如某些舊提交我們不想要了,而又不願通過自己修改代碼重新提交的方式來完成,這個時候我們就可以把這項工作交給revert命令。

Git Revert原理:根據你要回退的提交所做的改動做相反的改動,然后重新提交代碼,使代碼達到沒有這些舊提交所能達到的狀態。

如果對於git revert的回退策略還沒理解,這樣講也許你就能理解了:回退舊的提交必然會導致當前最新代碼發生變化,比如之前某個提交加了一行代碼,那么回退就是在相同位置減一行代碼。Git不會真的把舊提交拋棄,如果直接拋棄,歷史記錄就追蹤不到了。因此,舊提交其實是沒動的,Git只是根據舊提交反着做了一遍,這才導致最新的代碼發生了改變。只有把revert命令回退導致的改動重新提交,revert命令才算真的完成並生效,否則效果只相當於修改了工作樹的文件而已。

注意:revert之后需要push到遠程分支上其他用戶才能看到回退發生的改動。

使用git revert會出現的問題

因為git revert是用新提交覆蓋舊提交,因此,被覆蓋的提交等於不會被采用了。如果兩個分支(假設是master和A分支)先合並再用revert回滾,之后又合並(A合並到master),就會發現在master分支上,A分支第一次合並之前的修改大部分不見了。這是因為從時間的發生順序來看,A分支第一次合並之前的修改發生在revert之前,revert發生在后,而 revert拋棄了A第一合並之前的修改,那么再合並Git就認為你永遠拋棄了A第一次之前的修改。

要解決這個問題,需要把revert產生的提交再revert一次。

 

原文章:http://blog.csdn.net/woxueliuyun/article/details/51121527


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM