最淺顯易懂Git教程的讀書筆記(附下載鏈接)

這個是廣大網友評為最淺顯易懂Git教程的讀書筆記, 這個PDF文檔CSDN可以免積分下載.建議大家看看這個文檔,這個文檔內容不多不少,值得推薦,不講SVN和git 的區別,直奔主題.
史上最淺顯易懂的gif教程下載鏈接

創建版本庫

什么是版本庫呢?版本庫?名倉庫,英?名repository,你可以簡單理解成?個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個?件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。所以,創建一個版本庫非常簡單,?先,選擇一個合適的地方,創建一個空目錄:

wanggangdeMacBook-Pro:~ wanggang$ mkdir learngit
mkdir: learngit: File exists
wanggangdeMacBook-Pro:~ wanggang$ cd learngit
wanggangdeMacBook-Pro:learngit wanggang$ pwd
/Users/wanggang/learngit
wanggangdeMacBook-Pro:learngit wanggang$ 

第二步,通過git init命令把這個目錄變成Git可以管理的倉庫:

wanggangdeMacBook-Pro:learngit wanggang$ git init
Reinitialized existing Git repository in /Users/wanggang/learngit/.git/
wanggangdeMacBook-Pro:learngit wanggang$ 

把?件添加到版本庫

所有的版本控制系統,其實只能跟蹤文本文件的改動,比如TXT?件,網頁,所有的程序代碼等等,Git也不例外。(版本控制不是啥都能管理)

wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "wrote a readme file"
On branch master
nothing to commit, working directory clean

沒有東西可以提交,是因為已經提交了

小結

現在總結一下學的兩點內容:
初始化一個Git倉庫,使?用git init命令。
添加?文件到Git倉庫,分兩步:
? 第一步,使?用命令git add ,注意,可反復多次使用,添加多個文件;
? 第二步,使?用命令git commit,完成。

時光機穿梭篇

我們已經成功地添加并提交了一個readme.md文件,現在,是時候繼續工作了,于是,我們繼續修改readme.md?件,改成如下內容:

Git is a distributed version control system.
Git is free software.```
現在,運?行git status命令看看結果:

wanggangdeMacBook-Pro:learngit wanggang$ 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.md

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

``git status``命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令告訴我們,readme.txt被改過了,但還沒有準備提交的修改。
雖然Git告訴我們readme.md被修改了,但如果能看看具體修改了什么內容,自然是很好的。需要?用``git diff``這個命令看看

wanggangdeMacBook-Pro:learngit wanggang$ git diff
diff --git a/readme.md b/readme.md
index ffb8757..8fd0008 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,7 @@
Git is a version control system.
Git is free software
second

+Git is a distributed version control system.
+Git is free software.
\\\\\\\\ No newline at end of file
wanggangdeMacBook-Pro:learngit wanggang$

   "+" 代表增加了,
添加和查看命令

wanggangdeMacBook-Pro:learngit wanggang$ git add readme.md
wanggangdeMacBook-Pro:learngit wanggang$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified:   readme.md

wanggangdeMacBook-Pro:learngit wanggang$

提交命令``git commit -m "add distributed"``

wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "add distributed"
[master c9ce0cc] add distributed
1 file changed, 4 insertions(+)
wanggangdeMacBook-Pro:learngit wanggang$

執行git status,告訴在分支上,沒有什么可以提交了,?且,?作目錄是干凈(working directory
clean)的。

wanggangdeMacBook-Pro:learngit wanggang$ git status
On branch master
nothing to commit, working directory clean

##?結

>? 要隨時掌握工作區的狀態,使?用git status命令。
? 如果git status告訴你有文件被修改過,用git diff可以查看修改內容。

#版本回退
現在,你已經學會了修改文件,然后把修改提交到Git版本庫,現在,再練習一次,修改readme.txt?文件如下:

Git is a distributed version control system.
Git is free software distributed under the GPL.```
然后嘗試提交:

wanggangdeMacBook-Pro:learngit wanggang$ git add readme.md
wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "append GPL"
[master 9a3a214] append GPL
 1 file changed, 3 insertions(+), 1 deletion(-)
wanggangdeMacBook-Pro:learngit wanggang$ 

git log命令查看提交日志,最近三次的

wanggangdeMacBook-Pro:learngit wanggang$ git log
commit 9a3a214e5d3a2161025b4c3a5555770240bbdb17
Author: wg689 <596201463@qq.com>
Date:   Thu Oct 27 15:04:25 2016 +0800

    append GPL

commit c9ce0cc9a33c89a7484b65ff15d677ec26427d3d
Author: wg689 <596201463@qq.com>
Date:   Thu Oct 27 14:58:57 2016 +0800

    add distributed

commit 2655435b11464bb99561a5cfb3e9dea879824178
Author: wg689 <596201463@qq.com>
Date:   Wed Oct 26 17:17:41 2016 +0800

    add distributed

commit 668d6ddb994231947d1fa5b199c61eda1d2fbca0
Author: hjl_wg <wanggang@wanggangdeMacBook-Pro.local>
Date:   Wed Oct 26 17:04:29 2016 +0800

    wrote a readme fiel
:

如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上
--pretty=oneline參數:

wanggangdeMacBook-Pro:learngit wanggang$ git log --pretty=oneline
9a3a214e5d3a2161025b4c3a5555770240bbdb17 append GPL
c9ce0cc9a33c89a7484b65ff15d677ec26427d3d add distributed
2655435b11464bb99561a5cfb3e9dea879824178 add distributed
668d6ddb994231947d1fa5b199c61eda1d2fbca0 wrote a readme fiel

好了,現在我們啟動時光穿梭機,準備把readme.md回退到上?個版本,也就是“add distributed”的那個版本,怎么做呢?
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表?當前版本,也就是最新的提交“ 3628164...882e1e0”(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD,上上一個版本就是HEAD^,當然往上100 個版本寫100個^?比較容易數不過來,所以寫成HEAD~100。現在,我們要把當前版本“append GPL”回退到上?個版本“add distributed”,就可以使?用git reset命令:git reset --hard HEAD^

wanggangdeMacBook-Pro:learngit wanggang$ git reset --hard HEAD^
HEAD is now at c9ce0cc add distributed
wanggangdeMacBook-Pro:learngit wanggang$ git log --pretty=oneline
c9ce0cc9a33c89a7484b65ff15d677ec26427d3d add distributed
2655435b11464bb99561a5cfb3e9dea879824178 add distributed
668d6ddb994231947d1fa5b199c61eda1d2fbca0 wrote a readme fiel

和上文比較知道回退版本成功.
3628164...”,于是就可以指定回到未來的某個版本:

$ git reset --hard 9a3a214e5d
HEAD is now at 3628164 append GPL

版本號沒必要寫全,前幾位就可以了,Git會?動去找。當然也不能只寫前一兩位,因為Git可能會找到多個版本號,就?法確定是哪一個了。使用回到某一個版本 可以回到任意版本.

wanggangdeMacBook-Pro:learngit wanggang$ git log --pretty=oneline
9a3a214e5d3a2161025b4c3a5555770240bbdb17 append GPL
c9ce0cc9a33c89a7484b65ff15d677ec26427d3d add distributed
2655435b11464bb99561a5cfb3e9dea879824178 add distributed
668d6ddb994231947d1fa5b199c61eda1d2fbca0 wrote a readme fiel

Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向“append GPL”改一下:
git reflog 會記錄最近的每一次id

wanggangdeMacBook-Pro:learngit wanggang$ git reflog
9a3a214 HEAD@{0}: reset: moving to 9a3a214e5d
c9ce0cc HEAD@{1}: reset: moving to HEAD^
9a3a214 HEAD@{2}: commit: append GPL
c9ce0cc HEAD@{3}: commit: add distributed
2655435 HEAD@{4}: commit: add distributed
668d6dd HEAD@{5}: commit (initial): wrote a readme fiel
wanggangdeMacBook-Pro:learngit wanggang$ 

?結

現在總結?一下:
? HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使?命令git reset --hard commit_id。
? 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
? 要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

工作區和暫存區

Git和其他版本控制系統如SVN的?個不同之處就是有暫存區的概念。
先來看名詞解釋。
工作區(Working Directory):就是你在電腦?里能看到的目錄,?如我的learngit文件夾


就是?個?作區:
版本庫(Repository):工作區有一個隱藏目錄“.git”,這個不算工作區,?是Git的版本庫。
Git的版本庫?里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的?個指針叫HEAD。

分?和HEAD的概念我們以后再講。
前面講了我們把?件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用“git add”把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用“git commit”提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們創建Git版本庫時,Git?動為我們創建了唯一個master分支,所以,現在,
commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的?件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。

小結

暫存區是Git非常重要的概念,弄明?了暫存區,就弄明白了Git的很多操作到底干了什么。
沒弄明白暫存區是怎么回事的童鞋,請向上滾動?面,再看一次。

撤銷修改,撤銷沒有add 的修改

wanggangdeMacBook-Pro:learngit wanggang$ git checkout -- readme.md

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這
?里有兩種情況:

  • 一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
  • 一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
    總之,就是讓這個?件回到最近一次git commit或git add時的狀態。

小結

  • 場景1:當你改亂了工作區某個?件的內容,想直接丟棄工作區的修改時,用命令gitcheckout -- file。
  • 場景2:當你不但改亂了?作區某個?件的內容,還添加到了暫存區時,想丟棄修改,分兩
    步,第?步?用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
  • 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

刪除文件

wanggangdeMacBook-Pro:learngit wanggang$ rm test.md
wanggangdeMacBook-Pro:learngit wanggang$ 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:    test.md

no changes added to commit (use "git add" and/or "git commit -a")
wanggangdeMacBook-Pro:learngit wanggang$ git rm test.md
rm 'test.md'
wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "remove test.md"
[master 67a3a8a] remove test.md
 1 file changed, 9 deletions(-)
 delete mode 100644 test.md
wanggangdeMacBook-Pro:learngit wanggang$ git status
On branch master
nothing to commit, working directory clean
wanggangdeMacBook-Pro:learngit wanggang$ git checkout -- test.md
error: pathspec 'test.md' did not match any file(s) known to git.
wanggangdeMacBook-Pro:learngit wanggang$ 

小結

命令git rm用于刪除一個?件。如果一個?件已經被提交到版本庫,那么你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交后你修改的內容

遠程倉庫

為什么GitHub需要SSH Key呢?因為GitHub需要識別出你推送的提交確實是你推送的,?不是別?人冒充的,?Git?支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自?才能推送。當然,GitHub允許你添加多個Key。假定你有若干電腦,你一會?在公司提交,一會兒在家里提交,只要把每臺電腦的Key都添加到GitHub,就可以在每臺電腦上往GitHub推送了。

分支

分?在實際中有什么?呢?假設你準備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再?次提交,?存在丟失每天進度的巨??險。現在有了分支,就不?用怕了。你創建了一個屬于你?己的分?,別?看不到,還繼續在原來的分支上正常?作,?你在?己的分?上干活,想提交就提交,直到開發完畢后,再一次性合并到原來的分?上,這樣,既安全,?不影響別?工作。其他版本控制系統如SVN等都有分支管理,但是用過之后你會發現,這些版本控制系統創建和切換分?比蝸?牛還慢,簡直讓?無法忍受,結果分支功能成了擺設,大家都不去?。
但Git的分?是與眾不同的,無論創建、切換和刪除分支,Git在1秒鐘之內就能完成!無論你的版本庫是1個文件還是1萬個文件。

創建與合并分支

截?到目前,只有?條時間線,在Git里,這個分支叫主分支,即 master分?。HEAD嚴格來說不是指向提交,?是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支

?開始的時候,master分支是一條線,Git用master指向最新的提交,再?HEAD指向master,就能確定當前分支,以及當前分支的提交點:


Snip20161027_21.png

每次提交,master分?都會向前移動一步,這樣,隨著你不斷提交,master分?的線也越來越長。當我們創建新的分支,例如dev時,Git新建了?個指針叫dev,指向master相同的提交,
再把HEAD指向dev,就表示當前分?在dev上:



你看,Git創建一個分支很快,因為除了增加一個dev指針,改改HEAD的指向,?作區的?件都沒有任何變化!不過,從現在開始,對?作區的修改和提交就是針對dev分支了,比如新提交?次后,dev指針往前移動一步,而master指針不變:



假如我們在dev上的?作完成了,就可以把dev合并到master上。Git怎么合并呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合并:

所以Git合并分?也很快!就改改指針,?作區內容也不變!
合并完分?后,甚?至可以刪除dev分支。刪除dev分支就是把dev指針給刪掉,刪掉后,我們就剩下了?條master分?,



真是太神奇了,你看得出來有些提交是通過分支完成的嗎?
下?開始實戰。
首先,我們創建dev分支,然后切換到dev分支:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數表?示創建并切換,相當于以下兩條命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看當前分支:

wanggangdeMacBook-Pro:learngit wanggang$ git branch
* dev
  master

git branch命令會列出所有分支,當前分支前面會標一個*號。

wanggangdeMacBook-Pro:learngit wanggang$ git add readme.md
wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "branch master"
[dev 565ba8c] branch master
 1 file changed, 2 insertions(+), 1 deletion(-)
wanggangdeMacBook-Pro:learngit wanggang$ 

現在,dev分支的?作完成,我們就可以切換回master分支:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout master
Switched to branch 'master'
wanggangdeMacBook-Pro:learngit wanggang$ 

切換回master分?后,再查看?個readme.txt?件,剛才添加的內容不見了!因為那個提
交是在dev分?上,?master分?此刻的提交點并沒有變:



現在,我們把dev分支的工作成果合并到master分支上:

wanggangdeMacBook-Pro:learngit wanggang$ git merge dev
Updating 67a3a8a..565ba8c
Fast-forward
 readme.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
wanggangdeMacBook-Pro:learngit wanggang$ 

git merge命令?用于合并指定分?到當前分支。合并后,再查看readme.txt的內容,就可以看到,和dev分支的最新提交是完全?樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進模式”,也就是直接把
master指向dev的當前提交,所以合并速度?非常快。
當然,也不是每次合并都能Fast-forward,我們后?面會將其他?式的合并。
合并完成后,就可以放心地刪除dev分支了,刪除后,查看branch,就只剩下master分支了:

wanggangdeMacBook-Pro:learngit wanggang$ git branch -d dev
Deleted branch dev (was 565ba8c).
wanggangdeMacBook-Pro:learngit wanggang$ git branch
* master

因為創建、合并和刪除分?非常快,所以Git?鼓勵你使用分支完成某個任務,合并后再刪掉
分?,這和直接在master分?上?作效果是一樣的,但過程更安全。

小結

  • Git?鼓勵?大量使?用分支:
  • 查看分?:git branch
  • 創建分?:git branch name
  • 切換分?:git checkout name
  • 創建+切換分支:git checkout -b name
  • 合并某分?到當前分支:git merge name
  • 刪除分?:git branch -d name

解決沖突

?生不如意之事?之八九,合并分?往往也不是?帆風順的。準備新的feature1分支,繼續我們的新分支開發:

$ git checkout -b feature1
Switched to a new branch 'feature1'

修改readme.txt最后一行,改為:
Creating a new branch is quick AND simple.
在feature1分支上提交:

$ git add readme.txt
$ git commit -m "AND simple"
[feature1 75a857c] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)

切換到master分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

現在,master分支和feature1分支各自都分別有新的提交,變成了這樣:


Snip20161027_28.png

這種情況下,Git?法執?“快速合并”,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突,我們試試看:

wanggangdeMacBook-Pro:learngit wanggang$ git merge feature1
Auto-merging readme.md
CONFLICT (content): Merge conflict in readme.md
Automatic merge failed; fix conflicts and then commit the result.
wanggangdeMacBook-Pro:learngit wanggang$ 

使用git status 查看

wanggangdeMacBook-Pro:learngit wanggang$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   readme.md

no changes added to commit (use "git add" and/or "git commit -a")
wanggangdeMacBook-Pro:learngit wanggang$ 

手動解決沖突,重新add 和commit

wanggangdeMacBook-Pro:learngit wanggang$ git add readme.md
wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "conflict fixed"
[master edce57e] conflict fixed
wanggangdeMacBook-Pro:learngit wanggang$ 

現在,master分?和feature1分?變成了下圖所?:



?帶參數的git log也可以看到分支的合并情況:

*   edce57e conflict fixed
|\\\\\\\\\\\\\\\\  
| * 7c57d7e and simple
* | 5b95acb & simple
|/  
* 565ba8c branch master
* 67a3a8a remove test.md
* e3b271f add text.md
* 9a3a214 append GPL
* c9ce0cc add distributed
* 2655435 add distributed
* 668d6dd wrote a readme fiel
wanggangdeMacBook-Pro:learngit wanggang$ 

現在,刪除feature1分支:并且查看分支

wanggangdeMacBook-Pro:learngit wanggang$ git branch -d feature1
Deleted branch feature1 (was 7c57d7e).
wanggangdeMacBook-Pro:learngit wanggang$ git branch
* master

小結

當Git?法?動合并分?時,就必須首先解決沖突。解決沖突后,再提交,合并完成。用git log --graph命令可以看到分支合并圖。

分支管理策略

通常,合并分?時,如果可能,Git會?用“Fast forward”模式,但這種模式下,刪除分?后,會丟掉分支信息。如果要強制禁?用“Fast forward”模式,Git就會在merge時?生成一個新的commit,這樣,從分?歷史上就可以看出分支信息。
下?我們實戰一下--no-ff?方式的merge:
首先,仍然創建并切換dev分支:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout -b dev
Switched to a new branch 'dev'
wanggangdeMacBook-Pro:learngit wanggang$ 

修改readme.txt文件,并提交?個新的commit:

wanggangdeMacBook-Pro:learngit wanggang$ git add readme.md
wanggangdeMacBook-Pro:learngit wanggang$ git commit -m "add merge"
[dev bdda8f5] add merge
 1 file changed, 1 insertion(+)

現在,我們切換回master:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout master
Switched to branch 'master'

準備合并dev分?,請注意--no-ff參數,表?示禁用“Fast forward”:

wanggangdeMacBook-Pro:learngit wanggang$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.md | 1 +
 1 file changed, 1 insertion(+)

因為本次合并要創建一個新的commit,所以加上-m參數,把commit描述寫進去。
合并后,我們?git log看看分支歷史:

wanggangdeMacBook-Pro:learngit wanggang$ git log --graph --pretty=oneline --abbrev-commit
*   f76bb6f merge with no-ff
|\\\\\\\\\\\\\\\\  
| * bdda8f5 add merge
|/  
*   edce57e conflict fixed
|\\\\\\\\\\\\\\\\  
| * 7c57d7e and simple
* | 5b95acb & simple
|/  
* 565ba8c branch master
* 67a3a8a remove test.md
* e3b271f add text.md
* 9a3a214 append GPL
* c9ce0cc add distributed
* 2655435 add distributed
* 668d6dd wrote a readme fiel

可以看到,不使?用“Fast forward”模式,merge后就像這樣:

Snip20161027_30.png

分支策略

在實際開發中,我們應該按照?個基本原則進?分?管理:
?先,master分支應該是?常穩定的,也就是僅?用來發布新版本,平時不能在上?干活;
那在哪干活呢?干活都在dev分?上,也就是說,dev分支是不穩定的,到某個時候,比如
1.0版本發布時,再把dev分支合并到master上,在master分支發布1.0版本;
你和你的?伙伴們每個?都在dev分?上干活,每個人都有自己的支,時不時地往dev分
?上合并就可以了。所以,團隊合作的分支看起來就像這樣:


小結

Git分??分強?,在團隊開發中應該充分應?用。
合并分支時,加上--no-ff參數就可以?用普通模式合并,合并后的歷史有分支,能看出來曾經
做過合并,?而fast forward合并就看不出來曾經做過合并。

bug 分支

軟件開發中,bug就像家常便飯?一樣。有了bug就需要修復,在Git中,由于分支是如此的強?,所以,每個bug都可以通過?一個新的臨時分支來修復,修復后,合并分支,然后將臨
時分支刪除。當你接到?個修復一個代號101的bug的任務時,很?然地,你想創建?個分?支issue -101來
修復它,但是,等等,當前正在dev上進?行的工作還沒有提交.修改了倉庫,git stash 暫存起來

wanggangdeMacBook-Pro:learngit wanggang$ 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.md

no changes added to commit (use "git add" and/or "git commit -a")
wanggangdeMacBook-Pro:learngit wanggang$ git stash
Saved working directory and index state WIP on master: f76bb6f merge with no-ff
HEAD is now at f76bb6f merge with no-ff
wanggangdeMacBook-Pro:learngit wanggang$ 

現在,用git status查看?作區,就是干凈的(除?有沒有被Git管理的文件),因此可以放?地創建分支來修復bug。
?先確定要在哪個分?上修復bug,假定需要在master分支上修復,就從master創建臨時分支:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout master
Already on 'master'
wanggangdeMacBook-Pro:learngit wanggang$ git checkout -b issue-101
Switched to a new branch 'issue-101'

現在修復bug,需要把“Git is free software ...”改為“Git is a free software ...”,然后
提交:

feature 分支

軟件開發中,總有?窮無盡的新的功能要不斷添加進來。
添加一個新功能時,你肯定不希望因為一些實驗性質的代碼,把主分支搞亂了,所以,每添加一個新功能,最好新建一個feature分?,在上面開發,完成后,合并,最后,刪除該feature分?支。現在,你終于接到了?個新任務:開發代號為Vulcan的新功能,該功能計劃?用于下?代星際?飛船。于是準備開發:

wanggangdeMacBook-Pro:learngit wanggang$ git checkout -b feature-vulcan
M   readme.md
Switched to a new branch 'feature-vulcan'

小結

開發?個新feature,最好新建?一個分支;
如果要丟棄?一個沒有被合并過的分?,可以通過git branch -D name強?刪除。

多人協作

當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默認名稱是origin。

忽略特殊?文件

有些時候,你必須把某些?件放到Git?作?錄中,但?不能提交它們,?如保存了數據庫密碼的配置?件啦,等等,每次git status都會顯?“Untracked files ...”,有強迫癥的童
鞋??里肯定不爽。好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git?工作區的根目錄下創建一個特殊的.gitignore?件,然后把要忽略的文件名填進去,Git就會?自動忽略這些?件。不需要從頭寫.gitignore文件,GitHub已經為我們準備了各種配置文件,只需要組合一下就
可以使用了。所有配置?件可以直接在線瀏覽:https://github.com/github/gitignore
忽略?件的原則是:

  1. 忽略操作系統?動?成的文件,比如縮略圖等;
  2. 忽略編譯生成的中間文件、可執?文件等,也就是如果一個?件是通過另一個文件自動生成的,那自動生成文件就沒必要放進版本庫,?如Java編譯產生的.class文
    件;
  3. 忽略你?己的帶有敏感信息的配置文件,?如存放口令的配置文件。
    舉個例子:
    假設你在Windows下進行Python開發,Windows會?自動在有圖片的目錄下?成隱藏的縮略圖文件,如果有?定義目錄,目錄下就會有Desktop.ini文件,因此你需要忽略Windows自
    動生成的垃圾文件:

?結

  1. 忽略某些?件時,需要編寫.gitignore。
  1. .gitignore文件本?身要放到版本庫里,并且可以對.gitignore做版本管理!

配置別名

有沒有經常敲錯命令??如git status?status這個單詞真心不好記。
如果敲git st就表?示git status那就簡單多了,當然這種偷懶的辦法我們是極?力贊成的。
我們只需要敲?行命令,告訴Git,以后st就表示status:
$ git config --global alias.st status
好了,現在敲git st看看效果。
當然還有別的命令可以簡寫,很多人都用co表?示checkout,ci表?示commit,br表?示
branch:

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
以后提交就可以簡寫成:
$ git ci -m "bala bala bala..."

--global參數是全局參數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。
在撤銷修改?節中,我們知道,命令git reset HEAD file可以把暫存區的修改撤銷掉
(unstage),重新放回工作區。既然是一個unstage操作,就可以配置?個unstage別
名:
$ git config --global alias.unstage 'reset HEAD'
當你敲入命令:
$ git unstage test.py
實際上Git執行的是:
$ git reset HEAD test.py

小結

給Git配置好別名,就可以輸?命令時偷個懶。我們?勵偷懶。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,646評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,595評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,560評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,035評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,814評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,224評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,301評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,444評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,988評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,804評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,998評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,544評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,237評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,665評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,927評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,706評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,993評論 2 374

推薦閱讀更多精彩內容