天天看點

Git 使用總結

Git是什麼

Git是一個分布式版本控制系統。它可以很友善的記錄你的每一次變動,而不需要每次都備份,還能讓你和他人很友善的協同開發。這樣你每次做了什麼改動,瞄一眼就一清二楚了。

--

安裝Git

從官網下載下傳适合自己電腦的Git,點選安裝,一路“Next”就可以了。安裝完成,打開Console開始設定Git參數。

$ git config --global user.name "xxx"
$ git config --global user.email "[email protected]"
//在上面的兩個引号中分别填寫你的名字和郵箱。
//由于Git是分布式的版本控制系統,可能會有很多使用者,每個使用者需要有自己的名字和郵箱來互相區分。      

建立版本庫(repository)

簡單的說,你可以将版本庫了解為一個目錄。我們用Git來管理我們的檔案,是以你得告訴Git你需要它管理哪個目錄下的檔案,這個目錄就是版本庫。

git init

//建立一個learnGit目錄,并進入learnGit目錄,建立版本庫
md learnGit
cd learnGit
git init      

添加檔案到版本庫中

倉庫下建立的檔案以及目錄需要手動的送出到倉庫中。送出分為兩步:

1. 

git add

2. 

git commit -m

 "送出的說明"

先建立一個檔案叫做readme.txt,裡面輸入

Git is amazing!
I love Git!      

接着将這個readme.txt送出到倉庫中:

> git add readme.txt
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.

> git commit -m "add a readme file"
[master (root-commit) e7ddd65] add a readme file
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
 1 file changed, 3 insertions(+)
 create mode 100644 readme.txt      

工作區的狀态

使用

git status

檢視目前工作區的狀态資訊

将readme.md修改為
Git is great!
I love git!      
接着使用git status指令
> git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")      

檢視檔案的修改内容

雖然我們可以通過

git status

知道檔案被修改了,但是我們并不了解到底修改了哪些内容。是以使用

git diff

可以知道具體的修改内容。

> git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 2482f69..8e882dd 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,2 @@
-Git is amazing!
-I love Git!
-
+Git is great!
+I love git!
\ No newline at end of file
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.      

檢視整個修改過程狀态

将修改過的檔案進行送出

> git add readme.txt      

再來看目前工作區的狀态

> git status
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   readme.txt      

繼續送出修改後的檔案

> git commit -m "amazing became great"
[master warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
469dcdc] amazing became great
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory.
 1 file changed, 1 insertions(+), 1 deletions(-)      
> git status
On branch master
nothing to commit, working directory clean      

曆史記錄

git log

指令可以檢視所有的曆史記錄

> git log
commit e4af028a493a4459fea0c0f673149281e0d11949
Author: LIYANG <[email protected]>
Date:   Tue Apr 26 16:17:58 2016 +0800

    add new line

commit 469dcdcd4de36234666885f87fa581441a834992
Author: LIYANG <[email protected]>
Date:   Tue Apr 26 16:07:00 2016 +0800

    amazing became great

commit e7ddd658bf0e5791acd07c25a56ba1c4fba1a181
Author: LIYANG <[email protected]>
Date:   Tue Apr 26 15:49:34 2016 +0800

    add a readme file      

git log

 指令給出了你的每一次送出,并按時間順序依次顯示,非常詳細。但是有時候你隻想要一個簡單的結果,可以 

git log --pretty=oneline

> git log --pretty=oneline
e4af028a493a4459fea0c0f673149281e0d11949 add new line
469dcdcd4de36234666885f87fa581441a834992 amazing became great
e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file      

傳回曆史記錄

在Git中有個指針叫做

HEAD

HEAD

指向哪個快照,你現在就在哪個狀态。對于第N個狀态的版本

HEAD~N

> git reset --hard HEAD~2
HEAD is now at e7ddd65 add a readme file      

傳回曆史記錄失敗

如果現在又想重新回到

add new line

這個版本怎麼辦。很簡單,隻要知道

add new line

commit id

就可以了。是以你理所當然的使用

git log

檢視

commit id

> git log --pretty=oneline
469dcdcd4de36234666885f87fa581441a834992 amazing became great
e7ddd658bf0e5791acd07c25a56ba1c4fba1a181 add a readme file      

add new line

不見了!記住

git log

隻能檢視HEAD及HEAD以前的版本。

檢視所有曆史操作

git reflog

 這個指令可以檢視所有操作指令

> git reflog
469dcdc HEAD@{0}: reset: moving to HEAD~1
e4af028 HEAD@{3}: commit: add new line
469dcdc HEAD@{4}: commit: amazing became great
e7ddd65 HEAD@{5}: commit (initial): add a readme file      

這時你就知道了

add new line

 的

id

了,你就可以很開心的回去了

> git reset e4af028
Unstaged changes after reset:
M       readme.txt      

工作區

工作區就是你存放一切檔案的那個目錄。比如前面我們建立了一個目錄,叫

learnGit

,然後進入

learnGit

,在

learnGit

目錄下使用

git init

指令把

learnGit

變成了一個Git可以管理的目錄。Git自動生成了一個隐藏目錄叫

.git

。此時,這個learnGit目錄就是工作區。

版本庫

工作區中各有一個隐藏目錄叫

.git

.git

就是版本庫。你commit送出的就是這個地方。

暫存區

雖然

.git

目錄是隐藏的,但你仍然可以打開。打開

.git

,進去以後你會發現裡面有很多目錄和檔案。其中有一個名叫index的檔案,這個index檔案就是暫存區stage。暫存區是版本庫裡的一個臨時存儲的地方,經由暫存區,再送出到版本庫。

git版本控制的邏輯過程:
  1. 首先,你在工作區建立了一個檔案或者修改了一個檔案
  2. 然後你有輸入了

    git add

    ,此時檔案實際上是被添加到了暫存區stage,也就是那個index檔案
  3. 接着,你又輸入

    git commit

    ,這才算是正式送出。Git預設給我們建立了一個master分支和一個指向master分支的HEAD指針。

複雜修改恢複 CND.1

第1種情況: 在工作區産生的修改還沒有

git add

添加到暫存區。你當然可以直接打開編輯器改回到之前的樣子,但我們希望Git來幫我們做這件事, 可以執行指令

git checkout -- file

比如你在readme.txt中新添加了一行文本 。
Git is great!
I love git!
just add line      
這時候就産生了一個修改,現在你後悔了,覺得不應該添加這一行。
$ git checkout -- readme.md      
輸入完指令以後沒有任何提示。沒有提示證明你沒錯。 這時你再打開readme.txt檢視一下,發現剛才添加的

just add line

這一行已經沒有了。

複雜修改恢複 CND.2

第2種情況: 在工作區産生的修改添加

git add

到了暫存區。此時隻能把這個修改打回到工作區,然後在工作區把這個修改給殺掉。可以執行指令行

git reset HEAD file

> git reset HEAD readme.txt
Unstaged changes after reset:
M       readme.txt

> git checkout readme.txt      

删除檔案 PART.1

删除檔案也是一種修改,因為工作區裡的東西發生了變化

新建立一個檔案,然後git add,再git commit
> echo >new.txt
> git add new.txt
> git commit -m "create new.txt"
[detached HEAD 21e3fe5] create new.txt
 1 file changed, 1 insertion(+)
 create mode 100644 new.txt      

删除檔案 PART.2

然後再把它删了
> del new.txt      
這時候Git發現你在工作目錄裡删了一個檔案,但是Git的版本庫裡仍然還存在着new.txt
> git status
HEAD detached from 9baed55
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:    new.txt

no changes added to commit (use "git add" and/or "git commit -a")      

删除檔案 PART.3

如果你确定真的要把new.txt删除掉,那就需要執行指令

git rm file

> git rm new.txt
rm 'new.txt'      

git status

一下,發現你的操作還沒有正式送出
> git status
HEAD detached from 9baed55
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    new.txt      
你需要再次

git commit

> git commit -m "del new.txt"
[detached HEAD 5e46854] del new.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 new.txt      

建立GitHub帳号 Part.1

GitHub的官網注冊一個賬号,注冊之後點選

Settings

在左側欄選擇

SSH keys

,點選

New SSH keys

建立GitHub帳号 Part.2

進去Git安裝目錄的

\usr\bin

目錄,在指令行輸入以下指令
//把裡面的[email protected]部分換成你的郵件位址,然後一路回車就行了。
//這樣就在使用者主目錄(C:\Documents and Settings\使用者名\.ssh)下生成了密鑰對
// id_rsa是私鑰,id_rsa.pub是公鑰
$ ssh-keygen -t rsa -C "[email protected]"      
回到GitHub在Title一欄中随便填一個名字,然後将

id_rsa.pub

中的内容粘貼到Key欄, 點選

Add SSH key

按鈕就完成了。

建立GitHub倉庫

在GitHub上建立一個倉庫,點選

New repository

Repository name

一欄中随便填寫一個名字作為倉庫名。然後直接點選

Create repository

按鈕。

GitHub倉庫

倉庫的基本界面如下,因為我們使用的是SSH協定,而不是HTTPS協定,是以将預設的HTTPS切換成SSH

關聯遠端倉庫

第一種情況: 你在本地還沒有建立一個倉庫
echo "# learnGit" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin [email protected]:liyang/learnGit.git
git push -u origin master      
第二種情況:如果你在本地已經有了一個倉庫
git remote add origin [email protected]:liyang/learnGit.git
git push -u origin master      

建立分支 Part.1

首先建立一個test.txt的檔案,在裡面輸入:
# this is a test file      
然後将它送出:
$ git add test.txt
$ git commit -m "add a test file"      
接着建立一個dev分支。
$ git branch dev      

建立分支 Part.2

這樣就生成了一個叫dev的分支。但别忘了,我們現在仍然在master分支
$ git branch
  dev
* master
//git branch會列出所有的分支,并在目前分支的前面加上一個*号。      
如果需要切換到dev分支,隻需執行
$ git checkout dev
//撤銷修改的文法是:git checkout -- file
//而切換分支指令沒有 -- 這兩個短橫。      
如果你希望建立一個分支并直接切換到那個分支,隻需執行
$ git chekcout -b dev
//這樣将會建立dev分支并直接切換到dev分支。      

修改分支 Part.1

在dev分支中進行修改。在test.txt後面加上一行
# this is a test file
first line      
接着進行送出
$ git add test.txt
$ git commit -m "add first line  on dev"      
然後切換回master分支:
$ git checkout master      
當切換回master分支後,打開test.txt,發現剛才添加的一行"first line"不見了, 因為"first line"是在dev分支上送出的。
# this is a test file      

合并分支

現在在master分支上,準備跟dev分支合并:
$ git merge dev
Updating 0fed6b6..38fb696
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)      
合并完成以後,可以删除dev分支
$ git branch -d dev      

抓取分支

git clone url

可以克隆遠端倉庫到本地

git clone https://github.com/roastlechon/nodejs-rtorrent.git      

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************