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