人非圣賢孰能。所以每個(gè)VCS都提供一個(gè)功能來(lái)修復(fù)錯(cuò)誤,直到Git控制的某一點(diǎn)上。 Git提供了一個(gè)功能,可用于撤消對(duì)本地存儲(chǔ)庫(kù)所做的修改。
假設(shè)用戶意外地對(duì)本地存儲(chǔ)庫(kù)進(jìn)行了一些更改,然后想要撤消這些更改。 在這種情況下,恢復(fù)操作起著重要的作用。
假設(shè)我們不小心修改了本地存儲(chǔ)庫(kù)中的一個(gè)文件,此時(shí)想撤銷這些修改。為了處理這種情況,我們可以使用git checkout命令。可以使用此命令來(lái)還原文件的內(nèi)容。
為了更好的演示,我們首先在 sample/src 目錄下創(chuàng)建一個(gè)文件:string.py ,其代碼如下所示:
#!/usr/bin/python3
var1 = 'Hello World!'
var2 = "Python Programming"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5]) # 切片加索引
并使用以下命令將此文件推送到遠(yuǎn)程存儲(chǔ)庫(kù):
$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git add src/
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git add src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git commit -m "add new file string.py"
[master 44ea8e4] add new file string.py
1 file changed, 7 insertions(+)
create mode 100644 src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git push origin master
Username for 'http://git.oschina.net': 769728683@qq.com
Password for 'http://769728683@qq.com@git.oschina.net':
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 443 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
現(xiàn)在,已經(jīng)將string.py添加到遠(yuǎn)程存儲(chǔ)庫(kù)中了。
假設(shè)我們不小心/或者有心修改了本地存儲(chǔ)庫(kù)中的一個(gè)文件。但現(xiàn)在不想要這些修改的內(nèi)容了,也就是說(shuō)想要撤銷修改。要處理這種情況,那么可以使用git checkout命令。可以使用此命令來(lái)還原文件的內(nèi)容。
$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: src/string.py
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@MY-PC /D/worksp/sample (master)
$ git checkout src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Administrator@MY-PC /D/worksp/sample (master)
$
此外,還可以使用git checkout命令從本地存儲(chǔ)庫(kù)獲取已刪除的文件。假設(shè)我們從本地存儲(chǔ)庫(kù)中刪除一個(gè)文件,我們想要恢復(fù)這個(gè)文件。那么可以通過(guò)使用git checkout命令來(lái)實(shí)現(xiàn)這一點(diǎn)。
$ ls -l
total 1
-rw-r--r-- 1 Administ Administ 57 Jul 7 05:37 README.md
drwxr-xr-x 1 Administ Administ 0 Jul 10 21:16 src
Administrator@MY-PC /D/worksp/sample (master)
$ cd src/
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 1
-rwxr-xr-x 1 Administ Administ 156 Jul 10 21:16 string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ rm string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 0
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status -s
D string.py
Git在文件名前顯示字母D, 這表示該文件已從本地存儲(chǔ)庫(kù)中刪除。
$ git checkout string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ ls -l
total 1
-rwxr-xr-x 1 Administ Administ 156 Jul 10 21:24 string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
注意:可以在提交操作之前執(zhí)行這些操作。
我們已經(jīng)看到,當(dāng)執(zhí)行添加操作時(shí),文件將從本地存儲(chǔ)庫(kù)移動(dòng)到暫存區(qū)域。 如果用戶意外修改文件并將其添加到暫存區(qū)域,則可以使用git checkout命令恢復(fù)其更改。
在Git中,有一個(gè)HEAD指針總是指向最新的提交。 如果要從分段區(qū)域撤消更改,則可以使用git checkout命令,但是使用checkout命令,必須提供一個(gè)附加參數(shù),即HEAD指針。 附加的提交指針參數(shù)指示git checkout命令重置工作樹,并刪除分段更改。
讓我們假設(shè)從本地存儲(chǔ)庫(kù)修改一個(gè)文件。 如果查看此文件的狀態(tài),它將顯示該文件已修改但未添加到暫存區(qū)域。
$ pwd
/D/worksp/sample/src
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: string.py
no changes added to commit (use "git add" and/or "git commit -a")
Administrator@MY-PC /D/worksp/sample/src (master)
$ git add string.py
Git狀態(tài)顯示該文件存在于暫存區(qū)域,現(xiàn)在使用git checkout命令恢復(fù)該文件,并查看還原文件的狀態(tài)。
$ git checkout head -- string.py
Administrator@MY-PC /D/worksp/sample/src (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
用Git復(fù)位移動(dòng)頭指針
經(jīng)過(guò)少量更改后,可以決定刪除這些更改。 git reset命令用于復(fù)位或恢復(fù)更改。 我們可以執(zhí)行三種不同類型的復(fù)位操作。
下圖顯示了git reset命令的圖示。
git reset命令之前
git reset命令之后:
每個(gè)分支都有一個(gè)HEAD指針,它指向最新的提交。 如果用--soft選項(xiàng)后跟提交ID的Git reset命令,那么它將僅重置HEAD指針而不會(huì)破壞任何東西。
.git/refs/heads/master文件存儲(chǔ)HEAD指針的提交ID。 可使用git log -1命令驗(yàn)證它。
$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ cat .git/refs/heads/master
44ea8e47307b47c9a80b44360e09f973e79312b0
現(xiàn)在,查看最新前兩個(gè)的提交ID,最近一次ID將與上述提交ID一致。
$ git log -2
commit 44ea8e47307b47c9a80b44360e09f973e79312b0
Author: maxsu
Date: Mon Jul 10 21:09:35 2017 +0800
add new file string.py
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu
Date: Mon Jul 10 17:51:11 2017 -0700
remove/delete module.py
Administrator@MY-PC /D/worksp/sample (master)
$
下面我們重置HEAD指針。
現(xiàn)在,只需將HEAD指針重新設(shè)置一個(gè)位置。現(xiàn)在查看.git/refs/heads/master文件的內(nèi)容。
Administrator@MY-PC /D/worksp/sample (master)
$ cat .git/refs/heads/master
7d8162db36723b8523c56ad658a07808ae7fb64c
來(lái)自文件的提交ID已更改,現(xiàn)在通過(guò)查看提交消息進(jìn)行驗(yàn)證。
$ git log -2
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu
Date: Mon Jul 10 17:51:11 2017 -0700
remove/delete module.py
commit 6bdbf8219c60d8da9ad352c23628600faaefbe13
Author: maxsu
Date: Mon Jul 10 20:34:28 2017 +0800
renamed main.py to module.py
⒉ mixed選項(xiàng)
使用--mixed選項(xiàng)的Git重置將從尚未提交的暫存區(qū)域還原這些更改。它僅從暫存區(qū)域恢復(fù)更改。對(duì)文件的工作副本進(jìn)行的實(shí)際更改不受影響。 默認(rèn)Git復(fù)位等效于執(zhí)行g(shù)it reset - mixed。
如果使用--hard選項(xiàng)與Git重置命令,它將清除分段區(qū)域; 它會(huì)將HEAD指針重置為特定提交ID的最新提交,并刪除本地文件更改。
讓我們查看提交ID。
Administrator@MY-PC /D/worksp/sample (master)
$ pwd
/D/worksp/sample
Administrator@MY-PC /D/worksp/sample (master)
$ git log -1
commit 7d8162db36723b8523c56ad658a07808ae7fb64c
Author: minsu
Date: Mon Jul 10 17:51:11 2017 -0700
remove/delete module.py
通過(guò)在文件開頭添加單行注釋來(lái)修改文件或者往文件里添加其它代碼。
$ head -2 src/string.py
#!/usr/bin/python3
Administrator@MY-PC /D/worksp/sample (master)
$ git status -s
M src/string.py
將修改的文件添加到暫存區(qū)域,并使用git status命令進(jìn)行驗(yàn)證。
$ git add src/string.py
Administrator@MY-PC /D/worksp/sample (master)
$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: src/string.py
Git狀態(tài)顯示該文件存在于暫存區(qū)域中。 現(xiàn)在,重置HEAD與--hard選項(xiàng)。
$ git reset --hard 7d8162db36723b8523c56ad658a07808ae7fb64c
HEAD is now at 7d8162d remove/delete module.py
Administrator@MY-PC /D/worksp/sample (master)
git reset命令成功,這將從分段區(qū)域還原文件,并刪除對(duì)文件所做的任何本地更改。
Administrator@MY-PC /D/worksp/sample (master)
$ git status -s
Git狀態(tài)顯示該文件已從暫存區(qū)域還原,當(dāng)前恢復(fù)到了刪除 moudle.py 時(shí)的版本了。