備注:
本文參考於廖雪峰的博客Git教程。依照其博客進行學習和記錄,感謝其無私分享,也歡迎各位查看原文。
知識點:
1、git status
,查看git倉庫的狀態
2、git diff
查看git修改了的內容
3、HEAD
指向的版本就是當前版本,使用git reset --hard commit_id
命令可以回到指定版本
4、通過git log
查看提交歷史和git reflog
查看命令歷史,確定回退或恢復到某一版本。
查看git倉庫的狀態
我們修改一下readme文件的內容,添加一行內容。
- 運行
git status
查看狀態
liu@liu-virtual-machine:~/gitTest$ git status
位於分支 master
尚未暫存以備提交的變更:
(使用 "git add <文件>..." 更新要提交的內容)
(使用 "git checkout -- <文件>..." 丟棄工作區的改動)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
git status
命令可以查看倉庫當前的狀態,上面顯示,readme.txt文件被修改過,但還沒有加入提交修改的內容。
git diff
可以查看修改了什么內容,這樣就可以清楚的知道上次修改的內容是什么,如下
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
,現在修改為i Add a new line information in the end of readme.txt file
,相當於刪除添加。git diff
查看不同的內容,結果顯示出修改前后的對比。
git add readme.txt
添加修改,此時查看倉庫狀態,提示:要提交的變更為readme.txt
liu@liu-virtual-machine:~/gitTest$ git status
位於分支 master
要提交的變更:
(使用 "git reset HEAD <文件>..." 以取消暫存)
修改: readme.txt
git commit
和git status
提交並查看當前倉庫狀態
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
無文件要提交,干凈的工作區
顯示沒有需要提交的修改,干凈的工作區,(working directory clean)
查看歷史記錄。
對於版本控制系統,重要的是我們可以查看歷史記錄,方便我們知道每次修改和提交的內容。
git log
查看修改歷史
git log
顯示從最近到最遠的提交日志,每一次提交的作者、日期和提交的信息都被顯示出來。
- 如果顯示信息太多,可加上
--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
此時每條log記錄被顯示在一行。
每行前面的一串字母數字是
commit id
(版本號)。和svn不一樣,Git的commit id
不是1,2,3遞增數字,而是一個SHA1計算出來的一個非常大的數字,16進制表示.為什么commit id
需要用這么一大串數字表示呢?因為Git是分布式的版本控制系統,后面我們還要研究多人在同一個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就沖突了。
Git將每一次提交串成一條時間線。
版本回退
-
git首先需要知道當前版本是哪個版本。Git中,用
HEAD
表示當前版本,即上面最新提交的e181...5127
,上一個版本就是HEAD^
,上上個版本使HEAD^^
,當往上100個版本時,寫成HEAD~100
-
git reset --hard HEAD^
,將當前版本“add a new line in readme.txt”
回退到上一版本“modify”
,如下:
iu@liu-virtual-machine:~/gitTest$ git reset --hard HEAD^
HEAD 現在位於 1769dcb modify
查看readme.txt
的內容已經是modify版本,
此時用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
之前的最新版本記錄已經沒有。要想重新回到原來的最新版本,你需要記下當時的版本號(終端不關閉,可以向上找到)。如“add a new line in readme.txt”版本的commit id
e18195...
- 指定前進到未來某一版本
liu@liu-virtual-machine:~/gitTest$ git reset --hard e181953c3f43e15ceee10fb86f05fd4568265127
HEAD 現在位於 e181953 add a new line in readme.txt
readme.txt
內容已經變為最新版本。
git reset --hard e181953
可以不必將版本號寫全,Git會自動查找
Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指針,當回退版本時,Git僅僅是把HEAD從指向當前版本,改為指向回退的版本.然后把工作區的文件更新。
- 當回退到某一版本后又想恢復到最新版本,就必須找到
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
,就可以恢復想要的版本