git的撤銷、刪除和版本回退

備注:

本文參考于廖雪峰的博客Git教程。依照其博客進(jìn)行學(xué)習(xí)和記錄,感謝其無私分享,也歡迎各位查看原文。

知識(shí)點(diǎn):

1、git status,查看git倉庫的狀態(tài)

2、git diff 查看git修改了的內(nèi)容

3、HEAD指向的版本就是當(dāng)前版本,使用git reset --hard commit_id命令可以回到指定版本

4、通過git log查看提交歷史和git reflog查看命令歷史,確定回退或恢復(fù)到某一版本。

查看git倉庫的狀態(tài)

我們修改一下readme文件的內(nèi)容,添加一行內(nèi)容。

  • 運(yùn)行git status查看狀態(tài)
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內(nèi)容)
  (使用 "git checkout -- <文件>..." 丟棄工作區(qū)的改動(dòng))

    修改:     readme.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

git status命令可以查看倉庫當(dāng)前的狀態(tài),上面顯示,readme.txt文件被修改過,但還沒有加入提交修改的內(nèi)容。

  • git diff可以查看修改了什么內(nèi)容,這樣就可以清楚的知道上次修改的內(nèi)容是什么,如下
liu@liu-virtual-machine:~/gitTest$ git diff
diff --git a/readme.txt b/readme.txt
index 90269eb..7d0ff65 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@

 `this is a test that I learning and use git version control system
 this is a beginning
-wofaidognyixie dognxi
+i Add a new line information in the end of readme.txt file

在修改最后一行之前我添加和提交了一行wofaidognyixie dognxi,現(xiàn)在修改為i Add a new line information in the end of readme.txt file,相當(dāng)于刪除添加。git diff查看不同的內(nèi)容,結(jié)果顯示出修改前后的對(duì)比。

  • git add readme.txt添加修改,此時(shí)查看倉庫狀態(tài),提示:要提交的變更為readme.txt
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    修改:     readme.txt

  • git commitgit status提交并查看當(dāng)前倉庫狀態(tài)
liu@liu-virtual-machine:~/gitTest$ git commit -m "add a new line in readme.txt"
[master e181953] add a new line in readme.txt
 1 file changed, 1 insertion(+), 1 deletion(-)
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
無文件要提交,干凈的工作區(qū)

顯示沒有需要提交的修改,干凈的工作區(qū),(working directory clean)

查看歷史記錄。

對(duì)于版本控制系統(tǒng),重要的是我們可以查看歷史記錄,方便我們知道每次修改和提交的內(nèi)容。

  • git log查看修改歷史

git log顯示從最近到最遠(yuǎn)的提交日志,每一次提交的作者、日期和提交的信息都被顯示出來。

  • 如果顯示信息太多,可加上--pretty-oneline
liu@liu-virtual-machine:~/gitTest$ git log --pretty=oneline
e181953c3f43e15ceee10fb86f05fd4568265127 add a new line in readme.txt
1769dcb57a1b16d3c4ed7f96828af2f1131f5882 modify
d5b84bff04a672d9f520334d42e71a3e79910f17 modifya readme file
3033dda882f53ea249d6dacd4c39c470fab700e8 add a readme file

此時(shí)每條log記錄被顯示在一行。

每行前面的一串字母數(shù)字是commit id(版本號(hào))。和svn不一樣,Git的commit id不是1,2,3遞增數(shù)字,而是一個(gè)SHA1計(jì)算出來的一個(gè)非常大的數(shù)字,16進(jìn)制表示.為什么commit id需要用這么一大串?dāng)?shù)字表示呢?因?yàn)镚it是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個(gè)版本庫里工作,如果大家都用1,2,3……作為版本號(hào),那肯定就沖突了。

Git將每一次提交串成一條時(shí)間線。

版本回退

  • git首先需要知道當(dāng)前版本是哪個(gè)版本。

Git中,用HEAD表示當(dāng)前版本,即上面最新提交的e181...5127,上一個(gè)版本就是HEAD^,上上個(gè)版本使HEAD^^,當(dāng)往上100個(gè)版本時(shí),寫成HEAD~100

  • git reset --hard HEAD^

將當(dāng)前版本“add a new line in readme.txt”回退到上一版本“modify”,如下:

iu@liu-virtual-machine:~/gitTest$ git reset --hard HEAD^
HEAD 現(xiàn)在位于 1769dcb modify

查看readme.txt的內(nèi)容已經(jīng)是modify版本,

此時(shí)用git log查看歷史記錄

liu@liu-virtual-machine:~/gitTest$ git log
commit 1769dcb57a1b16d3c4ed7f96828af2f1131f5882
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 13:37:05 2018 +0800

    modify

commit d5b84bff04a672d9f520334d42e71a3e79910f17
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 12:55:06 2018 +0800

    modifya readme file

commit 3033dda882f53ea249d6dacd4c39c470fab700e8
Author: findmoon <1286637198@qq.com>
Date:   Tue Feb 20 12:48:53 2018 +0800

    add a readme file

之前的最新版本記錄已經(jīng)沒有。要想重新回到原來的最新版本,你需要記下當(dāng)時(shí)的版本號(hào)(終端不關(guān)閉,可以向上找到)。如“add a new line in readme.txt”版本的commit id e18195...

  • 指定前進(jìn)到未來某一版本
liu@liu-virtual-machine:~/gitTest$ git reset --hard e181953c3f43e15ceee10fb86f05fd4568265127
HEAD 現(xiàn)在位于 e181953 add a new line in readme.txt

readme.txt內(nèi)容已經(jīng)變?yōu)樽钚掳姹尽?/p>

  • git reset --hard e181953可以不必將版本號(hào)寫全,Git會(huì)自動(dòng)查找

Git的版本回退速度非??欤?yàn)镚it在內(nèi)部有個(gè)指向當(dāng)前版本的HEAD指針,當(dāng)回退版本時(shí),Git僅僅是把HEAD從指向當(dāng)前版本,改為指向回退的版本.然后把工作區(qū)的文件更新。

  • 當(dāng)回退到某一版本后又想恢復(fù)到最新版本,就必須找到commit id。Git提共git reflog記錄你的每一次命令
liu@liu-virtual-machine:~/gitTest$ git reflog
1769dcb HEAD@{0}: reset: moving to HEAD^
e181953 HEAD@{1}: reset: moving to e181953c3f43e15ceee10fb86f05fd4568265127
1769dcb HEAD@{2}: reset: moving to HEAD^
e181953 HEAD@{3}: commit: add a new line in readme.txt
1769dcb HEAD@{4}: commit: modify
d5b84bf HEAD@{5}: commit: modifya readme file
3033dda HEAD@{6}: commit (initial): add a readme file

通過每一條命令歷史前面的commit id,就可以恢復(fù)想要的版本。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容