撤銷操作
- 在任何一個階段,你都有可能想要撤銷某些操作
- 有些撤銷操作是不可逆的
--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 會用最近提交的版本來覆蓋掉它