無廢話Git——本地伺服器提交撤銷

oscar999發表於2020-04-06

無廢話Git——概念與本地伺服器提交

上一篇有提到, add 到暫存區的改動可以撤銷,同樣已經Commit的改動同樣有可能有要撤銷回退的狀況。

暫存區回退

命令列:
git reset HEAD – filename

Git GUI 介面操作
1. 選中需要unstage的檔案
2. 選單 Commit–>Unstage From Commit

以上一篇的project 1的 file1.txt檔案為例,
1. 改動檔案: 新增一行:second Line
2. 新增到暫存區
3. 回退: git reset HEAD – file1.txt

從暫存區撤回,之前檔案做過的修改還會保持。

Git reset

以上只是Git 撤銷的一種用法, Git Rest有三種模式:
mixed - 預設
soft
hard

mixed 模式, 預設模式

git reset 如果不加其他引數或是加上 mixed使用的都是這種模式。

  1. 準備工作
    將project1的file1檔案提交三次, 使用:
    git log –graph –one
    命令檢視一下提交記錄 (單行,圖形化顯示)

D:\gitworkspace\project1>git log –graph –oneline
* c51c220 third commit
* 7e6fea3 second commit
* 6661de3 file1 add

  1. 修改檔案,新增一行: four Line
    並add 到暫存區。

  2. 現在要回退到第二次提交
    git reset –mixed 7e6fea3
    這裡的版本號也可以使用 HEAD^替代。(不過筆者的使用好像是有點問題)
    HEAD指向當前版, HEAD^ 上一版, HEAD^^上上一版…
    使用git show HEAD , HEAD已經指向第二次提交了。

  3. 執行完成之後,變化如下:

    • 暫存區的內容撤銷了
    • 工作區的檔案沒有變化, 也就是新增的那一行還在
    • 使用git log 檢視, 只有兩條提交的記錄了。
    • 使用git diff 比較差異,版本庫是使用第二版和本地檔案進行比較。
  4. 刪除第三行後, add後提交。再看一下log

D:\gitworkspace\project1>git log –graph –oneline
* db34463 four commit
* 7e6fea3 second commit
* 6661de3 file1 add

第三次的提交就從版本庫中去掉了。

soft 模式

  1. 準備工作
    在file1.txt 新增一行: five line

  2. git add 到暫存區

  3. 執行: git reset –soft 7e6fea3
    也就是回退一個版本。
  4. 執行完成之後:

    • 暫存區的內容還在(不同與mixed 模式)
    • 使用git diff –cached 比較一下暫存區與版本庫的差別。
      版本庫使用的是回退的版本(與mixed相同)
      D:\gitworkspace\project1>git diff –cached
      diff –git a/file1.txt b/file1.txt
      index 68d1742..80554e6 100644
      — a/file1.txt
      +++ b/file1.txt
      @@ -1,2 +1,4 @@
      first Line
      -second Line
      \ No newline at end of file
      +second Line
      +four line
      +five line
      \ No newline at end of file
  5. 提交更改
    git commit -m “five commit”

6.看一下記錄, 庫中上一版的記錄沒有了。
git log –graph –oneline

hard 模式

  1. 準備工作
    修改file1.txt , 新增 six Line, 並add到暫存區

  2. 回退上一版,執行
    git reset –hard 706fea3

  3. 執行效果

    • 快取區內容沒有了(與mixed同)
    • 工作區的內容也被回退的版本替換了。
      也就是說, 使用庫的指定版本完全替換。

總結

git reset –soft : 不改變暫存區, 僅僅將Commit回退
git reset –mixed : 不改變工作區,覆蓋暫存區
git reset –hard : 改變工作區,覆蓋暫存區

相關文章