本篇博客講解的git命令
$ git log //查看每次提交日志
$ git reset --hard HEAD^ //回退到上一個版本
$ git reflog //查看以前的所有歷史記錄
$ git cheakout -- filename //撤銷修改工作區里的變化
$ git rm filename //確定工作區的刪除操作
$ git reset HEAD filename //撤銷緩存區的變化
在講解命令之前先介紹一下版本庫的區域劃分
git緩存區.png
左邊的工作區就是我們進行操作的地方,就是.git文件夾所在的目錄,工作區里有一個隱藏的文件夾.git就是我們的版本庫,里面有很多的內容,以后有時間可以具體分析一下,里面最重要的一個區域就是stage(或者叫index)緩存區。
前面講了我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用
git add
把文件添加進去,實際上就是把文件修改添加到暫存區;第二步是用
git commit
提交更改,實際上就是把暫存區的所有內容提交到當前分支。因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。
同時我們需要理解master指針指向master分支的最新版本節點,HEAD指針指向mater表示當前分支mater的版本最新節點,后面我們會講到切換分支時HEAD指針會移動。
$ git log
commit d3dd4b32a146c0046e4a718151ab9525b896b92c (HEAD -> master)
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:02:40 2017 +0800
第二次提交
commit 32cc9a766fcc4665644a2b883a4e302ace2fe50b
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:01:51 2017 +0800
第一次提交
我們之前進行過兩次提交,第一次內容為111111,第二次加上了22222,git log
為我們顯示了兩次的提交信息,d3dd4b32a146c0046e4a718151ab9525b896b92c
這就是我們提交的版本號,我們可以通過它進行回滾,同時我們還可以通過這個命令看到提交日期作者郵箱以及提交信息,也就是我們git commit
-m后面跟著的信息。
$ head aaa.txt
test git
1111111
2222222
$ git reset --hard HEAD^
HEAD is now at 32cc9a7 第一次提交
$ head aaa.txt
test git
1111111
head aaa.txt
查看aaa.txt文件的前幾行,當前有三行記錄,我們使用命令git reset --hard HEAD^
表示回退到HEAD當前版本的前一個版本,一個表示回退一個版本,HEAD^表示上上個版本,HEAD~100表示上100個版本,執行了reset命令之后我們再查看aaa.txt發現果然回退到了上一個版本,內容少了一行。
mac-pro:testgit cherish$ git log
commit 32cc9a766fcc4665644a2b883a4e302ace2fe50b (HEAD -> master)
Author: ChuanMac <845825101@qq.com>
Date: Sat Jun 24 20:01:51 2017 +0800
第一次提交
$ git reflog
32cc9a7 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d3dd4b3 HEAD@{1}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
d3dd4b3 HEAD@{3}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{4}: reset: moving to HEAD^
d3dd4b3 HEAD@{5}: reset: moving to d3dd4b32a146c004
32cc9a7 (HEAD -> master) HEAD@{6}: reset: moving to HEAD^
d3dd4b3 HEAD@{7}: reset: moving to d3dd4b3
32cc9a7 (HEAD -> master) HEAD@{8}: reset: moving to 32cc9a7
32cc9a7 (HEAD -> master) HEAD@{9}: reset: moving to HEAD^
d3dd4b3 HEAD@{10}: commit: 第二次提交
32cc9a7 (HEAD -> master) HEAD@{11}: commit (initial): 第一次提交
$ git reset --hard d3dd4b3
HEAD is now at d3dd4b3 第二次提交
$ head aaa.txt
test git
1111111
2222222
- 這個時候再執行
git log
發現當前提交版本只有一條信息了,因為我們在執行reset的時候,mater帶著head指針由當前最新版本節點指向了上一個版本節點,在遍歷版本節點時,就不會再遍歷之前的最新版本節點了。 - 這個時候我們如果回滾錯了,怎么再變回去了,我們需要通過提交版本號,把master指針移動到那個版本的節點處,通過
git reflog
可以查看之前的每一次版本指針移動記錄,我們找到我們需要的版本節點對應的號碼,用git reset --hard number
來知道特定版本 - 這個時候我們再查看aaa.txt時就發現確實又變回來了
操作:
testgit.gif
我們對工作區文件操作錯了,導致和緩存區不一致時,我們可以采用
git checkout -- filename
放棄對工作區域的操作
$ ls -a
. .. .DS_Store .git aaa.txt
$ rm aaa.txt
$ ls -a
. .. .DS_Store .git
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: aaa.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- aaa.txt
$ ls -a
. .. .DS_Store .git aaa.txt
- 首先我們ls查看到目錄下有aaa.txt,
rm aaa.txt
刪除了文件后查看目錄下沒了 - 我們
git status
之后有兩個操作,一個是確實要刪除,我們需要先git rm aaa.txt
然后再git commit
,還有就是我們刪錯了,需要還原就用git checkout -- filename
執行這個命令后,我們發現文件又出來了。
checkout.gif
最后還有一個命令就是清空緩存區
git reset HEAD filename
,比如我們git add
后發現我們添加到緩存區的東西不妥,這個時候就可以使用這個命令將緩存區給清空