Git簡易教程筆記(1)

本文是廖雪峯Git教程的讀書筆記,主要方便查閱和回憶。

Git簡介

Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。

Git是一個開源的分佈式版本控制系統,可以有效、高速的處理從很小到非常大的項目版本管理。Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

安裝Git

安裝

Ubuntu安裝Git只需要一條命令

sudo apt-get install git

簡易配置

安裝完後,進行簡易配置,主要是設置用戶名和電子郵件地址。

git config --global user.name "Your Name"
git config --global user.email "[email protected]"

如果使用了--global 參數,意味着,這臺電腦上的所有Git倉庫都會使用這個配置。

用法總覽

然後我們試着直接鍵入git 命令,看到了各種git命令的用法,這裏先來一個總括,之後會解釋將主要命令。

$ git 
用法:git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

這些是各種場合常見的 Git 命令:
開始一個工作區(參見:git help tutorial)
   clone      克隆一個倉庫到一個新目錄
   init       創建一個空的 Git 倉庫或重新初始化一個已存在的倉庫

在當前變更上工作(參見:git help everyday)
   add        添加文件內容至索引
   mv         移動或重命名一個文件、目錄或符號鏈接
   reset      重置當前 HEAD 到指定狀態
   rm         從工作區和索引中刪除文件

檢查歷史和狀態(參見:git help revisions)
   bisect     通過二分查找定位引入 bug 的提交
   grep       輸出和模式匹配的行
   log        顯示提交日誌
   show       顯示各種類型的對象
   status     顯示工作區狀態

擴展、標記和調校您的歷史記錄
   branch     列出、創建或刪除分支
   checkout   切換分支或恢復工作區文件
   commit     記錄變更到倉庫
   diff       顯示提交之間、提交和工作區之間等的差異
   merge      合併兩個或更多開發歷史
   rebase     本地提交轉移至更新後的上游分支中
   tag        創建、列出、刪除或校驗一個 GPG 簽名的標籤對象

協同(參見:git help workflows)
   fetch      從另外一個倉庫下載對象和引用
   pull       獲取並整合另外的倉庫或一個本地分支
   push       更新遠程引用和相關的對象

創建版本庫

這裏先介紹從本地創建版本庫,即英文repository,可以簡單理解成一個目錄,這個目錄裏面的所有文件(不包括.git隱藏目錄)都可以被Git管理起來,每個文件的修改和刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

1.創建一個空目錄,一般會選擇放在在home目錄

$ mkdir learngit
$ cd learngit

2.使用git init 命令將這個目錄變成Git可以管理的倉庫

$ git init 
初始化空的 Git 倉庫於 /home/mx/learngit/.git/

注意,.git爲隱藏目錄,是Git來跟蹤管理版本庫的,不要去修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。

3.爲版本庫添加一些文件,首先創建文件,比如:

$ cd learngit/ # 文件必須在倉庫目錄中
$ touch readme.md
$ gedit readme.md 
# 添加兩行內容:
Git is a version control system.
Git is free software.

4.使用命令git add告訴Git,把文件添加到緩存區:

$ git add readme.txt

5.使用命令git commit 告訴Git,把文件從緩存區添加到倉庫:

$ git commit -m "write a readme file"
[master (根提交) 635f829] write a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.md

這裏的-m 參數是提交日誌,非常需要加上,否則會有warning。git commit命令執行成功後會告訴你,1個文件被改動(我們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。

爲什麼Git添加文件需要addcommit兩步呢?因爲commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

後面還會說到,這樣的兩步動作,算是一種“後悔藥”機制,可以方便撤銷修改。

三個區域

Git倉庫有三個區域:工作區、暫存區和版本庫

img

  • 工作區:日常編輯代碼的地方,就是本地文件管理器的目錄。
  • 暫存區:即.git/index文件,對應上圖的index區域,是工作區與版本庫中間的緩存,git add指向的區域。
  • 版本庫:即.git文件,這個雖然在工作區裏,但不算工作區,而是Git的版本庫,git commit 指向的區域。

提交修改

1.我們修改readme.md文件:

# 原文件
Git is a version control system.
Git is free software.

# 修改第一行內容
Git is a distributed version control system. 
Git is free software.

2.運行git status命令看看結果:

$ git status # 返回倉庫當前狀態
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內容)
  (使用 "git checkout -- <文件>..." 丟棄工作區的改動)

    修改:     readme.md

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

Git看出來我修改過了redme.md文件,但是還沒提交。

3.運行git diff這個命令查看剛纔到底修改了什麼內容:

$ git diff readme.md
diff --git a/readme.md b/readme.md
index 46d49bf..a14450e 100644
--- a/readme.md
+++ b/readme.md
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system. 
 Git is free software.

修改結果一目瞭然,先刪了第1行,然後添加了第1行。

4.運行git addgit commit 提交修改後的文件:

$ git add readme.md 
$ git commit -m "change readme.md"
[master 50cbd9a] change readme.md
 1 file changed, 1 insertion(+), 1 deletion(-)

這裏注意,任何本地文件的修改,如果沒有使用git add添加到緩存區,git commit是不會提交修改的。多次修改,應遵循這樣的路徑:第一次修改 -> git add -> 第二次修改 -> git add -> git commit

5.如果有很多修改需要添加到緩存區,比如從什麼地方複製了大量文件,那可以使用git add . 進行一次性添加當前所有修改。

版本回退

每次我們使用git commit提交文件,會生成一個快照 ,我們在Github上看到的commits就是人家的提交記錄(快照)。

1.運行git log 查看版本變更:

$ git log 
commit 50cbd9a7c82ce35920472a5debfe4256ea7b2001
Author: jmx5200 <jmx5200@outlook.com>
Date:   Thu Aug 31 20:34:06 2017 +0800

    change readme.md

commit 635f829e5ce22aa97dc2cbdf2b6ae792d6c46699
Author: jmx5200 <jmx5200@outlook.com>
Date:   Thu Aug 31 20:15:33 2017 +0800

    write a readme file

命令顯示,我這裏從近到遠,提交了2次,存在2個版本。而50cbd9a7c82ce35920472a5debfe4256ea7b2001 這串數字代表的就是commit id(版本號)。

2.回退到上個版本,也就是退到“write a readme file”那個版本去。運行git reset命令,還要加上版本參數--hard (hard參數不僅僅是將本地版本庫的頭指針全部重置到指定版本,也會重置暫存區,並且會將工作區代碼也回退到這個版本 ) 。在Git中,用HEAD (文件指針)表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^ ,往上倒推n個版本可以寫爲HEAD~n

$ git reset --hard HEAD^
HEAD 現在位於 635f829 write a readme file

$ cat readme.md 
Git is a version control system.
Git is free software.

果然,回退到了前一個版本。此時再運行git log 查看版本變更,發現版本日誌就剩一條了。

$ git log
commit 635f829e5ce22aa97dc2cbdf2b6ae792d6c46699
Author: jmx5200 <[email protected]>
Date:   Thu Aug 31 20:15:33 2017 +0800

    write a readme file

3.回到原來的新版本。如果此時發現回退錯了,想反悔怎麼辦?Git提供了兩種辦法。

1)如果回退之前使用過git log查看過日誌,可以在終端把版本號找出來,比如我現在找到”change readme.md”這一版的版本號是”50cbd9a7c82ce35920472a5debfe4256ea7b2001”,就可用這個版本號充當--hard 的參數值(隨便敲5,6位,Git能自己搜索匹配):

$ git reset --hard 50cbd9
HEAD 現在位於 50cbd9a change readme.md

$ cat readme.md 
Git is a distributed version control system. 
Git is free software.

又變回來了,真是神奇!

2)運行git reflog 命令查看每一次Git操作命令,從中找出新版本的版本號:

$ git reflog 
635f829 HEAD@{0}: reset: moving to HEAD^
50cbd9a HEAD@{1}: reset: moving to 50cbd9
635f829 HEAD@{2}: reset: moving to HEAD^
50cbd9a HEAD@{3}: commit: change readme.md
635f829 HEAD@{4}: commit (initial): write a readme file

現在找到新版本的版本號前面是“50cbd9a…”,也可以回到原來的新版本。

撤銷修改

我們試着在readme.md文件中添加一行,然後保存。

# 原文件
Git is a distributed version control system. 
Git is free software.

# 添加一行
$ echo "I love Git" >> readme.md 
$ cat readme.md 
Git is a distributed version control system. 
Git is free software.
I love Git

$ git status 
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <文件>..." 更新要提交的內容)
  (使用 "git checkout -- <文件>..." 丟棄工作區的改動)

    修改:     readme.md

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

現在發現畫蛇添足,想要撤銷修改,應該怎麼辦呢,這裏有3種情況。

1)如果僅僅修改了readme.md,沒有運行git add ,則運行git checkout -- file 可還原。

$ git checkout -- readme.md
$ cat readme.md 
Git is a distributed version control system. 
Git is free software.

2)如果修改了readme.md,運行git add 添加修改到緩存區,但是沒有運行git commit 提交,可以用git reset HEAD file 回到場景1,然後再撤銷。

$ git reset HEAD readme.md
重置後取消暫存的變更:
M   readme.md

$ git checkout -- readme.md
$ cat readme.md 
Git is a distributed version control system. 
Git is free software.

3)如果修改了readme.md,運行git add 添加修改到緩存區,也運行了git commit 提交(但是沒有推送遠程),可以運行git reset HEAD^ readme.txt ,把readme.md的commit提交撤銷,回到場景2,然後再依次處理。

這裏能這麼操作是因爲:git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。

刪除文件

首先創建一個新文件test.txt,往裏頭寫點東西,然後提交到本地倉庫:

$ touch test.txt
$ echo "test how to delete" >> test.txt 
$ cat test.txt 
test how to delete
$ git add test.txt 
$ git commit -m "add test.txt"
[master 52df0ee] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

現在本地倉庫裏面已經有test.txt文件了,如果覺得沒啥用,想刪除這個文件,一般而言,會直接使用rm命令:

$ rm test.txt 
$ git status 
位於分支 master
要提交的變更:
  (使用 "git reset HEAD <文件>..." 以取消暫存)

    修改:     readme.md

尚未暫存以備提交的變更:
  (使用 "git add/rm <文件>..." 更新要提交的內容)
  (使用 "git checkout -- <文件>..." 丟棄工作區的改動)

    刪除:     test.txt

Git知道我們刪除了本地的文件,如果真心想從版本庫中刪除文件,那麼還要多運行一次git rm, 然後再git commit

$ git rm test.txt 
rm 'test.txt'
$ git commit -m "delete test.txt"
[master c646c8e] delete test.txt
 2 files changed, 2 deletions(-)
 delete mode 100644 test.txt

這樣,版本庫和本地文件就保持一致了。但是如果刪錯(僅刪除了本地文件,沒有commit提交),那也可以從版本庫中恢復過來。

$ git checkout -- test.txt
$ ls
readme.md  test.txt
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章