分佈式版本控制系統 Git | 四

分佈式版本控制系統 Git | 四


Git 基礎 | 撤銷修改


在工做過程當中,頗有可能會遇到須要撤銷某些操做的時候。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 中,已經提交的東西,一些誤操做每每可以恢復。可是,未提交的東西,每每丟失後就沒法再恢復了。因此要慎重使用撤銷操做。


以上就是本篇的主要內容

未完待續

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索