paulwong

          Git/EGit | reset 和 revert 的區別

          git的世界里有后悔藥嗎?

          有的。不僅有,還不止一種:Reset 和 Revert。它們有什么區別呢?先說結論吧。

          ResetRevert
          作用 將某個commit之后的push全部回滾 將某個指定的commit回滾
          歷史記錄(軌跡)
          是否可作用于單個文件 否(都是作用于commit,與文件無關)

          下面來說說具體例子。

          Revert

          試驗步驟如下:

          1. 新建兩個空白文件 Revert.txt 和 Common.txt,然后commit&push。
          2. 修改 Revert.txt 文件,內容為“commit 1”,然后commit&push,提交的備注為“commit 1 of Revert”
          3. 修改 Common.txt 文件,內容為“update for Revert(by commit 2)”
          4. 修改 Revert.txt 文件,新增一行,內容為“commit 2”
          5. 3 和 4的修改一起commit&push,提交備注為“commit 2 of Revert(Revert.txt + Common.txt)”

          效果如下:

          git-revert-01

          圖1-revert之前

          目的

          保留3的修改,回滾4的修改。

          操作

          選中“ Revert.txt ”文件,然后在 History 里選中 “commit 2 of Revert…”,右鍵,找到“Revert Commit”菜單,如圖:

          git-revert-02

          圖2-revert操作

          點擊后,效果如圖:

          git-revert-03

          圖3-revert之后

          最后,push即可。

          結果

          未能達到預期效果,Revert.txt 和 Common.txt的修改都被撤銷了。Revert的作用范圍是一個commit(原子),跟文件的個數無關。

          注:對最后一個commit做revert比較簡單,兩步:一,revert;二,push就可以了。對于較早的commit,因為中間間隔了其他的commit,文件會有沖突,需要處理完沖突才可以commit&push。

          Reset

          試驗步驟如下:

          1. 新建空白文件 Reset.txt,然后commit&push。
          2. 修改 Reset.txt 文件,內容為“commit 1”
          3. 修改 Common.txt 文件,內容為“update for Reset(commit 1)”
          4. 2和3的修改一起commit&push,提交的備注為“commit 1 of Reset”
          5. 修改 Reset.txt 文件,新增一行,內容為“commit 2”,然后commit&push,提交的備注為“commit 2 of Reset”
          6. 修改 Reset.txt 文件,內容為“commit 3”
          7. 修改 Common.txt 文件,內容為“update for Reset(commit 3)”
          8. 6和7的修改一起commit&push,提交的備注為“commit 3 of Reset”

          效果如下:

          git-reset-04

          圖4-reset之前

          目的

          將commit 1 之后的(即commit 2 和 3)改動全部回滾。

          操作

          在 History 里找到“commit 1”,選中后,右鍵,找到 Reset 菜單,選擇 Hard 模式。

          git-reset-05

          圖5-reset

          執行后,如下圖所示,HEAD 已經指向里 commit 1,Common.txt 和 Reset.txt 的內容也已改變。注意左側的項目欄,它已落后了服務器(GitHub)2個commit。怎么提交到服務器上呢?直接push,它會提示不是最新的,操作失敗。這里要用到 push 的 force 屬性。

          git-reset-06

          圖6-reset之后

          選中 項目,右鍵 – Team – Remote – Configure Push to Upstream,在打開的小窗口中找到 Advanced,如下圖所示,這里的 Force Update 要勾上,表示強制覆蓋。

          重新push,就可以跟服務器保持同步了。

          git-reset-07

          圖7-push-force

          要特別注意的是,Reset慎用,跟Linux的“rm -rf /”有異曲同工之妙。

          http://www.youngzy.com/blog/2019/08/git-difference-between-reset-and-revert-using-eclipse/

          posted on 2021-08-17 10:37 paulwong 閱讀(219) 評論(0)  編輯  收藏 所屬分類: GIT

          主站蜘蛛池模板: 湖南省| 敖汉旗| 宁南县| 海门市| 鄄城县| 礼泉县| 信宜市| 广德县| 阜平县| 西峡县| 桃园市| 芦溪县| 泾源县| 兴隆县| 安义县| 布拖县| 嘉禾县| 卓尼县| 察哈| 明星| 吴旗县| 新乐市| 贵南县| 亚东县| 小金县| 化州市| 确山县| 北安市| 曲阳县| 万州区| 漠河县| 屏东市| 繁昌县| 旅游| 嘉善县| 昂仁县| 台北市| 讷河市| 万盛区| 晋宁县| 都兰县|