1. 版本回退
修改之前readme.txt的內(nèi)容锐想,運行g(shù)it status命令查看結(jié)果
$ git status
On branch 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: ??readme.txt
no?changes added to?commit?(use "git add"?and/or?"git commit -a")
Git status命令可以時刻掌握倉庫當前狀態(tài)伺通。以上結(jié)果表明,teadme.txt已經(jīng)被改動了番川,但還沒有準備提交的修改忘朝。
如何查看修改內(nèi)容呢违孝,使用git diff命令查看
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt@@ -1,2 +1,2 @@
-Git is?a version control system.
+Git is?a distributed version control system.
?Git is?free software.
Git diff(查看difference),了解到修改詳情后毛嫉,需要重新提交文件到倉庫
$ git add readme.txt
$ git commit?-m "add distributed"
[master e475afc] add?distributed
?1?file changed, 1?insertion(+), 1?deletion(-)
提交后查看倉庫狀態(tài):
$ git status
On branch master
nothing to commit, working tree clean
總結(jié):
Git status查看文件是否被修改,查看倉庫狀態(tài)妇菱。
Git diff查看修改內(nèi)容承粤。
2. 版本回退
在Git中暴区,我們可以用git log命令查看版本歷史紀錄:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao
Date: ??Fri May 18 21:06:15 2018 +0800
????append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao
Date: ??Fri May 18 21:03:36 2018 +0800
????add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao
Date: ??Fri May 18 20:59:18 2018 +0800
????wrote a readme file
如果嫌輸出信息太多,看得眼花繚亂的密任,可以試試加上--pretty=oneline參數(shù):
$ git log --pretty=oneline
c585e4a6ae21136fddf3fe6e447aa8427b31fc78 (HEAD -> master)?recommit
1f60bf7e092fd94c9445d2a0743654e6603ad30e?recommit
9b6fa8aef3e22b607e03d8c0821e24f1581465b6?there is 4 files
29b5091840a99a2cd7bf5681bd9c66ff704b0d58?wrote a readme file
提示:前面那一串數(shù)字是commit id的版本號颜启。
每次提交一個新版本,實際上Git就會把他們自動串成一條時間線浪讳。如果使用可視化工具查看Git歷史缰盏,就可以更清楚的看到時間線。
如何將文件回退到上一個版本呢淹遵?
首先口猜,git得需要知道版本號。在git中透揣,用HEAD表示當前版本济炎,上一個就是HEAD^,上上一個就是HEAD^^,上上上一個就是HEAD^^^辐真,往上100個版本HEAD~100须尚。
現(xiàn)在要回退到上一個版本,就可以用git reset命令
student30@CN01VRIAPC30 MINGW64 /g/learngit?(master)
$ git reset --hard HEAD^
HEAD is now at 9b6fa8a there is 4 files
如果想回溯到轉(zhuǎn)換之前的版本呢侍咱?
那得找到那一串數(shù)字的號碼耐床,然后通過reset版本號就可以了。
$ git reset --hard c585e4a6ae21136fddf3fe6e447aa8427b31fc78
HEAD is now at c585e4a recommit
如果版本號丟失了楔脯,找不到怎么辦呢撩轰?
在Git中,提供了一個命令git reflog用來記錄你的每一次命令:
student30@CN01VRIAPC30 MINGW64 /g/learngit?(master)
$ git reflog
c585e4a (HEAD -> master)?HEAD@{0}: reset: moving to c585e4a6ae21136fddf3fe6e447aa8427b31fc78
9b6fa8a?HEAD@{1}: reset: moving to HEAD^
1f60bf7?HEAD@{2}: reset: moving to HEAD^
c585e4a (HEAD -> master)?HEAD@{3}: commit: recommit
1f60bf7?HEAD@{4}: commit: recommit
9b6fa8a?HEAD@{5}: commit: there is 4 files
29b5091?HEAD@{6}: commit (initial): wrote a readme file
總結(jié):
HEAD指向的版本就是當前版本昧廷,因此可以用命令git reset --hard commit_id來版本穿梭
穿梭前堪嫂,用git log查看提交歷史,確定回到哪個版本
要重返穿梭前木柬,可以采用git reflog查看命令歷史皆串,以便找到回到的版本
3. 工作區(qū)和暫存區(qū)
工作區(qū)(working directory),就是電腦里能看到的目錄弄诲,比如learngit文件夾就是一個工作區(qū)愚战。
版本庫(Repository),工作區(qū)中一個隱藏目錄.git齐遵,這個不算工作區(qū)寂玲,他是Git的版本庫。
版本庫中很多重要的東西梗摇,其中最重要的稱為index(或stage)的暫存區(qū)拓哟,還有Git為我們自動創(chuàng)價的第一這分支master,以及指向master的一個指針叫HEAD伶授。
之前往git版本庫中添加文件時是分兩步執(zhí)行的:
第一步git add添加文件断序,實際上是把文件修改添加到暫存區(qū)流纹;
第二步使用git commit提交更改,實際是把暫存區(qū)內(nèi)容提交到當前分支违诗。
所以說漱凝,git add命令實際上十八要提交的所有修改放到暫存區(qū)(index),然后執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支诸迟。
4. 管理修改
Git比其他版本控制器優(yōu)秀的一大原因是茸炒,Git跟蹤的是修改記錄而并非文件。
每次修改阵苇,如果不用git add到暫存區(qū)壁公,那就不會加入到commit中。
5.撤銷修改
當修改了文件后绅项,查看當前status你會發(fā)現(xiàn)紊册,Git告訴你,git checkout --file可以丟棄工作取得修改:
$ git checkout -- readme.txt
以上命令意為快耿,把readme.txt文件在工作區(qū)的修改全部撤銷囊陡,有兩種情況:
1. readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在撤銷修改就回到和版本庫一模一樣的狀態(tài)掀亥。
2. readme.txt已經(jīng)添加到暫存區(qū)后关斜,又做了修改,現(xiàn)在撤銷修改就回到添加到暫存區(qū)后的狀態(tài)铺浇。
如果已經(jīng)把readme.txt加入暫存區(qū)怎么辦?
1.用命令git reset HEAD 可以把暫存區(qū)的修改撤銷(unstage)垛膝,重新放回工作區(qū)鳍侣。
$ git reset?HEAD readme.txt
Unstaged changes after reset:
M ???readme.txt
2. 然后用checkout丟棄工作區(qū)的修改
$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
總結(jié):
1. 如果該亂了工作區(qū)某個文件內(nèi)容,想直接丟棄工作區(qū)的修改時吼拥,用命令git checkout -- file
2. 當你不僅該亂了內(nèi)容倚聚,還添加到了暫存區(qū)時,還想丟棄修改凿可。有兩步:
1. 用命令git reset HEAD 惑折, 就回到了場景一
2. 用命令git checkout -- file恢復
3.已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交枯跑,只能版本回退惨驶,前提是沒有推送到遠程庫。
6. 刪除文件
利用rm file可以刪除文件敛助。
刪除后用git commit確認刪除粗卜,誤刪用git checkout恢復