Git是什麼
Git是一個分散式版本控制系統。它可以很方便的記錄你的每一次變動,而不需要每次都備份,還能讓你和他人很方便的協同開發。這樣你每次做了什麼改動,瞄一眼就一清二楚了。
--
安裝Git
從官網下載適合自己電腦的Git,點選安裝,一路“Next”就可以了。安裝完成,開啟Console開始設定Git引數。
$ git config --global user.name "xxx" $ git config --global user.email "xxx@xxx.xxx" //在上面的兩個引號中分別填寫你的名字和郵箱。 //由於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 <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中有個指標叫做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版本控制的邏輯過程:
-
首先,你在工作區建立了一個檔案或者修改了一個檔案
-
然後你有輸入了
git add
,此時檔案實際上是被新增到了暫存區stage,也就是那個index檔案 -
接著,你又輸入
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