Git 使用總結

 

Git是什麼

Git是一個分佈式版本控制系統。它能夠很方便的記錄你的每一次變更,而不須要每次都備份,還能讓你和他人很方便的協同開發。這樣你每次作了什麼改動,瞄一眼就一清二楚了。node

 

--git

安裝Git

從官網下載適合本身電腦的Git,點擊安裝,一路「Next」就能夠了。安裝完成,打開Console開始設置Git參數。github

$ git config --global user.name "xxx"
$ git config --global user.email "xxx@xxx.xxx"
//在上面的兩個引號中分別填寫你的名字和郵箱。
//因爲Git是分佈式的版本控制系統,可能會有不少用戶,每一個用戶須要有本身的名字和郵箱來互相區分。

--web

建立版本庫(repository)

簡單的說,你能夠將版本庫理解爲一個目錄。咱們用Git來管理咱們的文件,因此你得告訴Git你須要它管理哪一個目錄下的文件,這個目錄就是版本庫。ssh

git init

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

--編輯器

添加文件到版本庫中

倉庫下建立的文件以及目錄須要手動的提交到倉庫中。提交分爲兩步:
1. git add
2. git commit -m "提交的說明"分佈式

先建立一個文件叫作readme.txt,裏面輸入this

Git is amazing!
I love Git!

接着將這個readme.txt提交到倉庫中:url

> 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

--spa

工做區的狀態

使用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 <liyangtom@163.com>
Date:   Tue Apr 26 16:17:58 2016 +0800

    add new line

commit 469dcdcd4de36234666885f87fa581441a834992
Author: LIYANG <liyangtom@163.com>
Date:   Tue Apr 26 16:07:00 2016 +0800

    amazing became great

commit e7ddd658bf0e5791acd07c25a56ba1c4fba1a181
Author: LIYANG <liyangtom@163.com>
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中有個指針叫作HEADHEAD指向哪一個快照,你如今就在哪一個狀態。對於第N個狀態的版本HEAD~N

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

--

返回歷史記錄失敗

若是如今又想從新回到add new line這個版本怎麼辦。很簡單,只要知道add new linecommit 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目錄,在命令行輸入如下命令

//把裏面的xxx@xxx.xxx部分換成你的郵件地址,而後一路回車就好了。
//這樣就在用戶主目錄(C:\Documents and Settings\用戶名\.ssh)下生成了密鑰對
// id_rsa是私鑰,id_rsa.pub是公鑰
$ ssh-keygen -t rsa -C "xxx@xxx.xxx"

回到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 git@github.com:liyang/learnGit.git
git push -u origin master

第二種狀況:若是你在本地已經有了一個倉庫

git remote add origin git@github.com: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
相關文章
相關標籤/搜索