在工做過程當中,頗有可能會遇到須要撤銷某些操做的時候。Git 也提供這樣的命令幫助撤銷所作的修改。可是有一點須要注意,某些撤銷操做是不可逆的。這也是爲數很少可能由於操做失誤致使工做進度丟失的操做。git
工做過程當中,可能會遇到下面的情況。完成修改提交以後,發現有文件未添加,或者提交信息錯誤。這裏,可使用 git commit
配合 --amend
選項的命令嘗試從新提交:微信
$ git commit -m "Something different" [master d888984] Something different 1 file changed, 1 insertion(+) $ git status On branch master nothing to commit, working tree clean $ git commit --amend [master bc3e952] Use option --amend Date: Wed Feb 5 17:07:24 2020 +0800 1 file changed, 1 insertion(+)
上面這個命令會將暫存區的文件提交。但若是上次提交文件未作任何修改,馬上使用命令,那麼快照保持不變,會啓動編輯器,這時修改裏面的提交信息就會覆蓋上次的提交的信息。編輯器
在上面使用的命令中,第一次使用 git commit
提交的信息是 Something different
。使用 git commit --amend
命令後,這裏因爲在提交後,沒有進行更改,因此使用命令後直接打開編輯器修改了提交信息,更改成 Use option --amend
。分佈式
$ git log commit ddcba794e7a6b4bed818425b16b6a40a6565a975 (HEAD -> master) Author: 大夢三千秋 <yiluolion@gmail.com> Date: Wed Feb 5 17:07:24 2020 +0800 Use option --amend commit 102a4a4f950cffae0acfb53a634012182fb8e8a1 Merge: d4a2555 0470264 Author: 大夢三千秋 <yiluolion@gmail.com> Date: Tue Feb 4 21:53:59 2020 +0800 Fix conflict
使用 git log
查看提交日誌時,發現先提交的信息 Something different
並無顯示在提交日誌中。版本控制
這就是上面說起的選項 --amend
的做用之一。未作修改時,使用搭配該選項的 git commit
命令,修改的只是提交信息。日誌
使用該命令的還有另一種狀況。提交以後,發現未暫存某些須要的修改。例如:code
$ git commit -m "initial commit" [master 668ee3f] initial commit 1 file changed, 1 insertion(+) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) forgotten_file $ git add forgotten_file $ git commit --amend [master 34cec72] initial commit Date: Wed Feb 5 18:31:19 2020 +0800 2 files changed, 2 insertions(+) create mode 100644 forgotten_file $ git status On branch master nothing to commit, working tree clean $ git log commit 34cec724a319c5797a834c0e4b698029c3ba5994 (HEAD -> master) Author: 大夢三千秋 <yiluolion@gmail.com> Date: Wed Feb 5 18:31:19 2020 +0800 initial commit commit ddcba794e7a6b4bed818425b16b6a40a6565a975 Author: 大夢三千秋 <yiluolion@gmail.com> Date: Wed Feb 5 17:07:24 2020 +0800 Use option --amend
上述 Git 命令中,提交以後,發現 forgotten_file
未暫存,使用命令暫存提交後,使用 git status
確認工做區乾淨,意味着遺漏的文件也從新放到暫存區,這個時候使用 git log
查看提交日誌能夠發現,只有一次提交,由於第二次提交代替第一次提交的結果。get
假設模擬場景是這樣的:工做中修改了兩個文件,初衷是將兩個文件做爲獨立的修改提交,可是卻使用了 git add *
命令,將兩個文件同時放入了暫存區。這時想將其中一個文件取消暫存?使用 git status
命令也可以獲得提示:it
$ git add * $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: about_git.txt renamed: readme.txt -> readme.md
這裏會發現 Changes to be committed
文字下方,提示使用 git reset HEAD <file> ...
來取消暫存。如今嘗試使用該命令進行取消暫存操做:io
$ git reset HEAD about_git.txt Unstaged changes after reset: M about_git.txt $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: readme.txt -> readme.md 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: about_git.txt
如今,使用 git status
能夠看到,about_git.txt
已是修改未暫存的狀態。
這就是 git reset
命令目前須要瞭解且可以達到的效果。至於關於 reset
更多的細節以及它可以完成其餘什麼效果,能夠查看下面的連接,進一步瞭解:
https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified
假設如今不想保留對 about_git.txt
的修改?假如想回退到上次提交的版本(或者剛克隆下來的版本等等),git status
的命令一樣也提示了使用哪一個命令可以達到這樣的效果。
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: readme.txt -> readme.md 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: about_git.txt
這裏咱們按照提示,使用 git checkout -- <file>
來實現這個需求:
$ git checkout -- about_git.txt $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: readme.txt -> readme.md
這裏能夠看到,再次使用 git status
可以發現對於 about_git.txt
的修改已經被撤銷,版本回退到未對 about_git.txt
進行修改的版本。
注意:
git checkout -- <file>
這個命令有風險。使用以前須要再三確認是否不須要這個文件。由於這個命令會使文件的任何修改都消失。
若是文件須要保留,可是仍然須要撤銷,這裏能夠考慮 Git 分支,用以保存進度與分支。後續將會介紹 Git 分支
。
在 Git 中,已經提交的東西,一些誤操做每每可以恢復。可是,未提交的東西,每每丟失後就沒法再恢復了。因此要慎重使用撤銷操做。
以上就是本篇的主要內容
未完待續
歡迎關注微信公衆號《書所集錄》