Git 系列教程(7)- 撤銷操作

小菠蘿測試筆記發表於2021-05-16

撤銷操作

  • 在任何一個階段,你都有可能想要撤銷某些操作
  • 有些撤銷操作是不可逆的

 

--amend 修補提交

有時候我們提交完了才發現漏掉了幾個檔案沒有新增,或者提交資訊寫錯了。 此時,就可以執行帶有 --amend 選項的提交命令來重新提交

git commit --amend

 

會再次提交暫存區的內容,但會覆蓋最後一次提交的資訊

git commit -m 'initial commit'
git add forgotten_file
git commit --amend -m "second commit" 
  • 最終只會有一個提交歷史,第二次提交將代替第一次提交的結果
  • 如果檢視提交歷史 git log,只會發現第二次提交的 second commit,而不會出現第一次提交的 initial commit
  • 優勢:可以稍微改進最新的提交資訊,而不會打亂程式碼倉庫的提交歷史,每修改一小塊就提交一次,提交歷史就會特別臃腫

 

取消暫存的檔案

目前我用最新版的 git(2.31.1) ,它會提示用 git restore 來取消暫存,但是官方文件會用 git reset

  • git restore
  • git reset

 

restore

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    刪除:     test1.txt
    刪除:     ttrtt.txt

 

執行 git restore

polo@B-J5D1MD6R-2312 watermarker % git restore --staged test1.txt
polo@B-J5D1MD6R-2312 watermarker % ls
README.md    font        markers.py    test.py        venv
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    刪除:     ttrtt.txt

尚未暫存以備提交的變更:
  (使用 "git add/rm <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
    刪除:     test1.txt

 

這裡未追蹤的檔案還能繼續使用 git restore,會直接丟棄之前的改動,比如這裡是刪除檔案,執行後它會恢復檔案

polo@B-J5D1MD6R-2312 watermarker % git restore test1.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    刪除:     ttrtt.txt

polo@B-J5D1MD6R-2312 watermarker % ls
README.md    font        markers.py    test.py        test1.txt    venv

可以看到上面的 ls 和下面的 ls 對比,很明顯 test1.txt 回來了

 

reset

git reset HEAD <檔名>

 

具體栗子

olo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    刪除:     test1.txt
    刪除:     ttrtt.txt

polo@B-J5D1MD6R-2312 watermarker % git reset HEAD test1.txt
重置後取消暫存的變更:
D    test1.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    刪除:     ttrtt.txt

尚未暫存以備提交的變更:
  (使用 "git add/rm <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
    刪除:     test1.txt

能看到 test1.txt 已經撤銷暫存區了

 

reset 同時撤銷所有暫存區的提交

git reset 

高危操作,不加任何引數,直接把所有提交都撤銷

 

具體栗子

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    重新命名:   test1.txt -> test22.txt
    重新命名:   ttrtt.txt -> test3.txt
    新檔案:   testt.txt

polo@B-J5D1MD6R-2312 watermarker % git reset
重置後取消暫存的變更:
D    test1.txt
D    ttrtt.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

尚未暫存以備提交的變更:
  (使用 "git add/rm <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
    刪除:     test1.txt
    刪除:     ttrtt.txt

未跟蹤的檔案:
  (使用 "git add <檔案>..." 以包含要提交的內容)
    test22.txt
    test3.txt
    testt.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
polo@B-J5D1MD6R-2312 watermarker % ls
README.md    markers.py    test22.txt    testt.txt
font        test.py        test3.txt    venv
polo@B-J5D1MD6R-2312 watermarker %

本來有三個提交,執行完 git reset 直接都撤銷出暫存區,需要重新提交了

 

撤銷對檔案的修改

不想保留對某個檔案的修改怎麼操作?就是將它還原成上次提交時的樣子(或者剛 clone 下來的樣子)

git 也有對應的提示(新版暫時沒發現有這提示)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

 

重點記住這個 checkout 命令

git checkout -- <file>...

 

具體栗子

polo@B-J5D1MD6R-2312 watermarker % git add .
polo@B-J5D1MD6R-2312 watermarker % echo 12344 >> test3.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    重新命名:   test1.txt -> test22.txt
    新檔案:   test3.txt
    重新命名:   ttrtt.txt -> testt.txt

尚未暫存以備提交的變更:
  (使用 "git add <檔案>..." 更新要提交的內容)
  (使用 "git restore <檔案>..." 丟棄工作區的改動)
    修改:     test3.txt

polo@B-J5D1MD6R-2312 watermarker % git checkout -- test3.txt
polo@B-J5D1MD6R-2312 watermarker % git status
位於分支 master
您的分支領先 'origin/master'5 個提交。
  (使用 "git push" 來發布您的本地提交)

要提交的變更:
  (使用 "git restore --staged <檔案>..." 以取消暫存)
    重新命名:   test1.txt -> test22.txt
    新檔案:   test3.txt
    重新命名:   ttrtt.txt -> testt.txt

可以看到 test3.txt 的修改已經被撤銷了

 

重點

  • 它也是一個高危命令
  • 執行 git checkout 命令後,對那個檔案在本地的任何修改都會消失,而 Git 會用最近提交的版本來覆蓋掉它

相關文章