讓Git不再難學(xué)

放手

寫在前面

在團(tuán)隊(duì)做過軟件開發(fā)的,版本控制必是不可或缺的一項(xiàng)。目前,版本控制主要分為集中式版本控制系統(tǒng)和分布式版本控制系統(tǒng) ,即大家熟知的SVN和Git。Git是當(dāng)下最流行的分布式版本控制系統(tǒng),故,今天,我們就來研究一下Git的神奇之處。

淺析SVN與Git的不同

  • 最基本:SVN是集中式,Git是分布式的。集中式,版本庫(kù)集中存放在中央服務(wù)器,工作時(shí),每個(gè)人需要先從中央服務(wù)器獲取最新的版本,然后在屬于自己的分支下工作,完成工作后,再提交到中央服務(wù)器;分布式,每一個(gè)電腦都是一個(gè)完整的版本庫(kù),可以減少中央服務(wù)器掛掉所帶來的嚴(yán)重后果。也可以這樣理解,Git相當(dāng)于SVN服務(wù)端和客戶端的集合;
  • 聯(lián)網(wǎng)需求不同:Git中,不必聯(lián)網(wǎng)就能看到版本迭代的信息和創(chuàng)建分支,而,SVN需要在聯(lián)網(wǎng)的情況下才能滿足上述要求;
  • 分支管理難易程度不同:在SVN中,分支作為版本庫(kù)中一個(gè)目錄,若需要查看是否合并,還需要運(yùn)行svn propget svn:mergeinfo指令;而在Git中,可以快速在幾個(gè)分支中切換和快速合并;
  • 存儲(chǔ)方式不同:SVN是按文件存儲(chǔ),Git是按元數(shù)據(jù)方式存儲(chǔ);
  • 權(quán)限問題:在SVN中,可以設(shè)定每個(gè)賬號(hào)的權(quán)限,比如只讀、讀寫權(quán)限等,而Git就沒有相應(yīng)的權(quán)限控制。這也許就是一些公司至今仍保留SVN的原因吧。
  • 匯總:工具總有其側(cè)重點(diǎn),沒有好與壞,只有各取所需。

安裝Git

Git的使用

有兩種Git的使用方法,一種是通過終端命令控制,另一種是使用Git的圖形管理工具——SourceTree。具體兩者哪一種更好用,更有效率,那還得因人而異。筆者下面將會(huì)分別介紹這兩種方法的基本操作,希望讀者能邊讀邊動(dòng)手操作一下,受益匪淺。

一.命令下的Git
1.創(chuàng)建版本庫(kù):
  • 首先,選擇一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄:
    Mac-Pro:~ kys-1mkdir gitTest Mac-Pro:~ kys-1 cd gitTest
    或者直接在相應(yīng)目錄下,自己手動(dòng)創(chuàng)建一個(gè)文件夾;
  • 其次,在終端上輸入git init命令,如下:
    Mac-Pro:~ kys-1cd /Users/kys-1/Desktop/gitTest Mac-Pro:gitTest kys-1 git init
    Initialized empty Git repository in /Users/kys-1/Desktop/gitTest/.git/
    這樣,一個(gè)本地倉(cāng)庫(kù)就順利地建好了。
  • 最后,每創(chuàng)建一個(gè)倉(cāng)庫(kù)時(shí),當(dāng)前目錄都會(huì)多一個(gè).git目錄,若是沒有看到,只需要使用ls -ah命令即可:
    Mac-Pro:gitTest kys-1$ ls -ah
    . .. .DS_Store .git
    很清楚可以看到,筆者的當(dāng)前目錄有兩個(gè)隱藏的。
2.添加文件到版本庫(kù)
  • 首先,創(chuàng)建一個(gè)GitTest.md文件,內(nèi)容如下:
    git is a strong software
    Let's start with a good mood!
    將該文件放到倉(cāng)庫(kù)gitTest所在的目錄下;
  • 其次,使用git add命令添加文件,如下:
    Mac-Pro:gitTest kys-1$ git add GitTest.md
    然后執(zhí)行,如果不顯示任何信息,那就是運(yùn)行無誤;
  • 最后,使用命令git commit將文件提交到倉(cāng)庫(kù),如下:
    Mac-Pro:gitTest kys-1$ git commit -m "wrote a README"
    [master (root-commit) dfaeb43] wrote a README
    1 file changed, 1 insertion(+)
    create mode 100644 GitTest.md
    其中,-m后面輸入的是本次提交的詳細(xì)信息,比如,完成了哪個(gè)功能或者修復(fù)了哪個(gè)bug。
3.查看倉(cāng)庫(kù)狀態(tài)
  • 首先,先對(duì)提交的GitTest.md中的信息進(jìn)行修改,然后運(yùn)行git status,效果如下:
    Mac-Pro:gitTest kys-1$ 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:   GitTest.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
4.查看修改內(nèi)容
  • 使用命令git diff可以查看具體修改了哪些內(nèi)容,如下:
    Mac-Pro:gitTest kys-1$ git diff
    diff --git a/GitTest.md b/GitTest.md
    index 00ad777..64590e1 100644
    --- a/GitTest.md
    +++ b/GitTest.md
    @@ -1 +1,2 @@
    -git is a strong software
    \ No newline at end of file
    +git is a strong software
    +Let's start with a good mood!
    \ No newline at end of file
5.版本回退
  • 首先,使用git log命令查看歷史記錄,如下:
    Mac-Pro:gitTest kys-1$ git log
    //版本一
    commit 988f92f1f5cf959d491ad63462e0c90372bb4b0b
    Author: XiaolinSun 401788217@qq.com
    Date: Fri Apr 8 11:15:08 2016 +0800

        add new
    //版本二
    commit dfaeb438504942d09e7f4282bd93b560d2ee68e2
    Author: XiaolinSun <401788217@qq.com>
    Date:   Fri Apr 8 11:12:02 2016 +0800
    
      wrote a README
    Mac-Pro:gitTest kys-1$ git reset --hard HEAD^
    HEAD is now at dfaeb43 wrote a README
    Mac-Pro:gitTest kys-1$ git log
     //版本三
    commit dfaeb438504942d09e7f4282bd93b560d2ee68e2
    Author: XiaolinSun <401788217@qq.com>
    Date:   Fri Apr 8 11:12:02 2016 +0800
    
      wrote a README
    

很清晰,共有三次提交歷史。其中,988f92f1f5cf959d491ad63462e0c90372bb4b0b這樣一串字符表示提交的版本號(hào)commit id

  • 使用git reset命令可以回退到上一個(gè)版本,輸入git reset --hard commit id,如下:
    Mac-Pro:gitTest kys-1$ git reset --hard 988f92f
    HEAD is now at 988f92f add new

  • 如果開發(fā)過程中,一不小心,回退錯(cuò)了地方,可以使用git reflog命令查看命令歷史,如下:
    Mac-Pro:gitTest kys-1$ git reflog
    dfaeb43 HEAD@{0}: reset: moving to HEAD^
    988f92f HEAD@{1}: commit: add new
    dfaeb43 HEAD@{2}: commit (initial): wrote a README
    從而,可以選擇要回到的那個(gè)版本即可。

  • git reset --soft直接將提交回滾到未提交狀態(tài),如果回滾的提交超過兩個(gè)則直接回滾到指定的commit記錄;

  • git reset --hard直接丟棄指定commit記錄;

6.工作區(qū)與暫存區(qū)
  • 工作區(qū):上幾步中在電腦創(chuàng)建的文件目錄就是工作區(qū),如下圖:


    工作區(qū)
  • 版本庫(kù)就是隱藏目錄.git;
  • 添加文件時(shí),首先,用git add把文件添加進(jìn)去,實(shí)際上是把文件修改添加到暫存區(qū);然后,用git commit提交更改,是把暫存區(qū)的內(nèi)容提交到當(dāng)前分支;最后,每次文件修改后,如果不add到暫存區(qū),那是不會(huì)加入到commit
7.撤銷修改
  • 當(dāng)你修改文件GitTest.md時(shí),在你準(zhǔn)備提交前,忽然發(fā)現(xiàn)一個(gè)錯(cuò)誤,如圖:
    git is a strong software
    Let's start with a good mood!
    Start up now!
    Fight for future! //新添加的內(nèi)容
    這時(shí)候,必須要查看一下狀態(tài):輸入git status,如下:
    Mac-Pro:gitTest kys-1$ 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:   GitTest.md
    
    no changes added to commit (use "git add" and/or "git commit -a")
    
  • 使用git checkout -- file命令就會(huì)丟棄工作區(qū)的修改,如下:
    Mac-Pro:gitTest kys-1$ git checkout -- GitTest.md
    然后再查看工作區(qū)的內(nèi)容:
    git is a strong software
    Let's start with a good mood!
    Start up now!
    這個(gè)時(shí)候內(nèi)容就恢復(fù)了。

8.刪除文件
  • 使用git rm和``git commit命令就可以從版本庫(kù)刪除相應(yīng)的文件,例如:我們新建一個(gè)newFile.md`文件,然后將其加入工作區(qū),如下所示:
    新工作區(qū)

    Mac-Pro:gitTest kys-1git add newFile.md Mac-Pro:gitTest kys-1 git commit -m "add newFile"
    [master e278be1] add newFile
    1 file changed, 1 insertion(+)
    create mode 100644 newFile.md
    Mac-Pro:gitTest kys-1git rm newFile.md rm 'newFile.md' Mac-Pro:gitTest kys-1 git commit -m "delete newFile"
    [master 9c28795] delete newFile
    1 file changed, 1 deletion(-)
    delete mode 100644 newFile.md
    執(zhí)行完這些命令后,文件就從版本庫(kù)中刪除了。
9.版本回滾的幾種方式及區(qū)別
  • 回滾目前有兩種方式:git revertgit reset
  • git revert :使用該命令進(jìn)行版本回滾時(shí),是用新的commit記錄回滾后的內(nèi)容;git reset是直接刪除指定的commit記錄;
  • git revert可以清晰看到回滾的記錄,同時(shí),在合并其他分支時(shí)不會(huì)使發(fā)生變動(dòng)的部分再次出現(xiàn),保證了云端與本地的一致性;git reset把某些commit在某個(gè)branch上刪除,因而和其他分支再次合并時(shí),這些被回滾的commit應(yīng)該還會(huì)被引入,一旦不小心執(zhí)行了push操作,后果不堪設(shè)想。
小結(jié)一下

以上操作都是在本地倉(cāng)庫(kù)進(jìn)行的一些操作,如果感覺上面講的有些許啰嗦,那么只需記住下面幾個(gè)命令即可:

1.git init      -------創(chuàng)建空的版本庫(kù);
2.git add       -------添加文件到暫存區(qū);
3.git commit      -------提交文件到版本庫(kù)(倉(cāng)庫(kù));
4.git status      -------查看相關(guān)狀態(tài);
5.git diff      -------查看具體修改的內(nèi)容;
6.git log      -------查看提交歷史記錄;
7.git reset      -------回到上一版本;
8.git reflog      -------查看命令歷史記錄;
9.git checkout      -------丟棄工作區(qū)的修改;
10.git rm      -------刪除文件;
二.SourceTree的使用
  • 使用SourceTree客戶端來執(zhí)行上述與本地倉(cāng)庫(kù)相關(guān)的操作。
  • 安裝并打開SourceTree:
SourceTree
  • 選擇本地按鈕,后點(diǎn)擊新倉(cāng)庫(kù),選擇創(chuàng)建本地倉(cāng)庫(kù),填入自己的地址,點(diǎn)擊創(chuàng)建就OK了(是不是很方便?):
創(chuàng)建流程1
創(chuàng)建流程2
  • 我先創(chuàng)建一個(gè)名字TTest本地倉(cāng)庫(kù),演示一下后面的相關(guān)操作,點(diǎn)擊新建倉(cāng)庫(kù)的導(dǎo)航條:
    點(diǎn)擊
倉(cāng)庫(kù)狀態(tài)
  • 在工作區(qū)添加文件README.md
顯示未暫存文件

已暫存

解釋一下,已暫存就是相當(dāng)于git add操作。

  • 提交操作,對(duì)比git commit -m "add new info"命令:
    提交
提交后
  • 查看具體內(nèi)容修改、查看相關(guān)狀態(tài)都可以直接看到,就不在一一贅述了;
  • 回到上一版本可以回滾操作,選擇具體的提交記錄,點(diǎn)擊右鍵,選擇提交回滾即可;
  • 對(duì)比一下,發(fā)現(xiàn)SourceTree是如此的方便快捷!
遠(yuǎn)程倉(cāng)庫(kù)
  • 概念:遠(yuǎn)程倉(cāng)庫(kù)可以用一臺(tái)電腦當(dāng)做服務(wù)器,團(tuán)隊(duì)其他成員可以從這個(gè)服務(wù)器克隆一份完整過程到自己的本地倉(cāng)庫(kù),同時(shí),可以將完成的部分推送到遠(yuǎn)程倉(cāng)庫(kù),以實(shí)現(xiàn)項(xiàng)目的跟進(jìn)。由于是演示,咱就暫且使用現(xiàn)成的遠(yuǎn)程倉(cāng)庫(kù)——Github;
  • 作為開發(fā)人員,github賬號(hào)是必備的,如果還沒有,那就得立即注冊(cè)一個(gè)。
  • 創(chuàng)建SSH Key,因?yàn)楸镜氐腉it倉(cāng)庫(kù)與Github遠(yuǎn)程倉(cāng)庫(kù)之間是通過SSH加密的。首先,需要到主目錄上查看是否有.ssh目錄,再查看.ssh目錄下有沒有id_rsaid_rsa.pub文件,如下,
    查找.ssh目錄

發(fā)現(xiàn)沒有上述的兩個(gè)文件,這時(shí)需要?jiǎng)?chuàng)建:

  Mac-Pro:~ kys-1 $ ssh-keygen -t rsa -C "youremail@example.com"  

需要將郵件地址換成自己的地址,如下:

Mac-Pro:~ kys-1$ ssh-keygen -t rsa -C "40178217@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kys-1/.ssh/id_rsa): 
Created directory '/Users/kys-1/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/kys-1/.ssh/id_rsa.
Your public key has been saved in /Users/kys-1/.ssh/id_rsa.pub.

出現(xiàn)上述描述,就證明你成功了,然后到主目錄下找到.ssh目錄,查看id_rsaid_rsa.pub文件,id_rsa是私鑰,需要自己保留好,id_rsa.pub是公鑰,別人知道也無妨。

  • 登錄Github賬戶,打開Account settingsSSH Keys頁(yè)面,添加id_rsa.pub文件的內(nèi)容:

    添加公鑰

  • 添加SSH key的作用,是保證推送到遠(yuǎn)程倉(cāng)庫(kù)的提交確實(shí)是你提交的而不是別人代替,以確保項(xiàng)目被他人修改;

  • 添加遠(yuǎn)程庫(kù):首先登陸github賬號(hào),點(diǎn)擊“New repository ”按鈕,創(chuàng)建新倉(cāng)庫(kù),如下:


    New repository
填寫信息

需要填寫倉(cāng)庫(kù)名,描述以及是否勾選創(chuàng)建初始化文件等。

  • 在本地倉(cāng)庫(kù)下運(yùn)行命令:
 Mac-Pro:~ kys-1$ git remote add origin yourGitAddress

然后,將本地庫(kù)的所有內(nèi)容推送到遠(yuǎn)程庫(kù):

Mac-Pro:~ kys-1$ git push -u origin master

到這一步,只要本地作了提交。就可以通過命令:

Mac-Pro:~ kys-1$ git push origin master

把本地master分支的最新修改推送到GitHub上去。

  • 使用git clone命令將遠(yuǎn)程庫(kù)克隆到本地:
Mac-Pro:~ kys-1$ git clone yourLocalGitAddress1
  • 在SourceTree下克隆遠(yuǎn)程倉(cāng)庫(kù)到本地的操作:
操作流程

源URL就是遠(yuǎn)程倉(cāng)庫(kù)的地址,目標(biāo)路徑是本地存儲(chǔ)的路徑。

創(chuàng)建與合并分支(與SourceTree同步對(duì)照)
  • 概念:創(chuàng)建分支的目的是讓你的工作變得更靈活更有效率,當(dāng)你開發(fā)新功能時(shí),你創(chuàng)建了一個(gè)分支,你可以在在原來分支繼續(xù)工作,也可以在新建的分支上工作,兩者之間不會(huì)干預(yù),當(dāng)你完成了新功能,只需將新分支合并到原來分支上即可。最吸引人的是Git創(chuàng)建和切換分支是非常速度的。

  • 創(chuàng)建dev分支,然后切換到dev分支,使用git checkout命令:

    Mac-Pro:gitTest kys-1$ git checkout -b dev
    Switched to a new branch 'dev'
    

-b參數(shù)表示創(chuàng)建并切換.

  • 使用git branch命令查看當(dāng)前分支:

    Mac-Pro:gitTest kys-1$ git branch
      * dev
      master
    
  • SourceTree操作:


    選擇分支按鈕
創(chuàng)建分支
切換到dev分支
  • 我們?cè)赿ev分支進(jìn)行操作,修改README.md 文件內(nèi)容然后提交:

    Mac-Pro:gitTest kys-1$ git add README.md
    Mac-Pro:gitTest kys-1$ git commit -m "dev branch"
    [dev 9be4a38] dev branch
     1 file changed, 2 insertions(+), 1 deletion(-)
    
  • SourceTree操作:

提交
提交后
  • dev分支工作結(jié)束,切換到master分支,

    Mac-Pro:gitTest kys-1$ git checkout master
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    
  • SourceTree操作:

切換到master分支

點(diǎn)擊右鍵,選擇檢出master分支即可。

檢出成功
  • 使用git merge 指令把dev分支的工作成果合并到master分支上:

    Mac-Pro:gitTest kys-1$ git merge dev
    Updating 2269ea8..9be4a38
        Fast-forward
       README.md | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
  • SourceTree操作:選中dev分支,右擊選擇合并dev至master即可,

合并后
  • 使用git branch -d dev命令刪除dev分支:

    Mac-Pro:gitTest kys-1$ git branch -d dev
    Deleted branch dev (was 9be4a38).
    
  • SourceTree操作:選中dev分支,右擊選擇刪除dev即可。

小結(jié)一下
  查看分支:git branch
  創(chuàng)建分支:git branch <name>
  切換分支:git checkout <name>
  創(chuàng)建+切換分支:git checkout -b <name>
  合并某分支到當(dāng)前分支:git merge <name>
  刪除分支:git branch -d <name>
沖突解決
  • 制造沖突:先創(chuàng)建一個(gè)新的分子conflict,并在新分支上工作,修改README.md內(nèi)容,操作如下:

    Mac-Pro:gitTest kys-1$ git checkout -b conflict
    Switched to a new branch 'conflict'
    Mac-Pro:gitTest kys-1$ git add README.md
    Mac-Pro:gitTest kys-1$ git commit -m "make a conflict"
    [conflict 1bc6611] make a conflict
     1 file changed, 2 insertions(+), 1 deletion(-)
    
SourceTree顯示狀態(tài)
  • 切換到master,繼續(xù)修改README.md內(nèi)容,并提交修改:
    Mac-Pro:gitTest kys-1git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. Mac-Pro:gitTest kys-1 git add README.md
    Mac-Pro:gitTest kys-1$ git commit -m "add two conflicts"
    [master f43d5d1] add two conflicts
    1 file changed, 2 insertions(+), 1 deletion(-)

  • 合并分支,就會(huì)出現(xiàn)沖突:
    Mac-Pro:gitTest kys-1git merge conflict Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. Mac-Pro:gitTest kys-1 git status
    On branch master
    Your branch is ahead of 'origin/master' by 1 commit.
    (use "git push" to publish your local commits)
    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")
    
  • 查看文件README.md就能看到?jīng)_突信息的提示了,紅色標(biāo)記的內(nèi)容就是用來標(biāo)注不同分支的內(nèi)容:

沖突信息
  • 將內(nèi)容改為以下內(nèi)容就行了,然后重新提交就可以了。

We will make a conflict!

  Mac-Pro:gitTest kys-1$ git add README.md
  Mac-Pro:gitTest kys-1$ git commit -m "comflict fixed"
  [master dad373b] comflict fixed
SourceTree的內(nèi)容
  • 使用git log --graph可以看到分支合并圖;
  • 小憩一下:做到這一步是不是感覺自己好有成就感啊,下面的內(nèi)容更精彩,繼續(xù)...
分支管理策略
  • 上述合并分支,一大部分是在用Fast forward模式,這種模式又優(yōu)點(diǎn)也有缺點(diǎn),就是刪除分支后會(huì)丟掉分支信息,這時(shí),我們需要使用一下普通模式,即使用帶有--no-ffgit merge,繼續(xù)上述流程:新建分支dev->修改提交->切換分支->合并分支:
    Mac-Pro:gitTest kys-1git checkout -b dev //*** Switched to a new branch 'dev' Mac-Pro:gitTest kys-1 git add README.md //***
    Mac-Pro:gitTest kys-1git commit -m "add new content" //*** [dev 97676b7] add new content 1 file changed, 1 insertion(+) Mac-Pro:gitTest kys-1 git checkout master //***
    Switched to branch 'master'
    Your branch is up-to-date with 'origin/master'.
    Mac-Pro:gitTest kys-1$ git merge --no-ff -m"merge with --no-ff" dev //***
    Merge made by the 'recursive' strategy.
    README.md | 1 +
    1 file changed, 1 insertion(+)
  • 當(dāng)然你也可以使用git log --graph --pretty=oneline --abbrev-commit命令查看分支歷史:
截圖
分支情況
  • 補(bǔ)充幾點(diǎn):首先,在實(shí)踐開發(fā)中,master分支是非常穩(wěn)定的,僅用來發(fā)布新版本,但不在上面開發(fā);其次,創(chuàng)建dev分支開發(fā),等到版本發(fā)布的時(shí)候在合并到master分支即可;團(tuán)隊(duì)中每個(gè)人都有自己的分支,及時(shí)合并即可。
添加Bug分支
  • 前述:修復(fù)Bug在所難免,修復(fù)Bug可以通過創(chuàng)建一個(gè)新的臨時(shí)分支修復(fù),合并分支,刪除臨時(shí)分支。

  • 情形:當(dāng)你在dev分支上工作還沒有完成,正趕上有Bug需要修復(fù),這時(shí)你需要將手頭上工作暫存一下,抓緊時(shí)間修復(fù)Bug;
    Mac-Pro:gitTest kys-1$ git status
    On branch dev
    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 stash暫存當(dāng)前工作區(qū):
    Mac-Pro:gitTest kys-1$ git stash
    Saved working directory and index state WIP on dev: 40be6d0 merge with --no-ff
    HEAD is now at 40be6d0 merge with --no-ff
  • 使用SourceTree操作:
暫存
  • 這時(shí),可以git status查看工作區(qū),并可以創(chuàng)建Bug分支了;
  • 確定好在master分支修復(fù)Bug:
    Mac-Pro:gitTest kys-1git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. Mac-Pro:gitTest kys-1 git checkout -b bug
    Switched to a new branch 'bug'
    Mac-Pro:gitTest kys-1git add README.md Mac-Pro:gitTest kys-1 git commit -m "fix bug"
    [bug 2c013d1] fix bug
    1 file changed, 1 insertion(+), 1 deletion(-)
創(chuàng)建bug分支
  • bug分支上修復(fù)完bug提交,就可以合并刪除bug分支,如下:
    Mac-Pro:gitTest kys-1git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. Mac-Pro:gitTest kys-1 git merge --no-ff -m "merge bug" bug
    Merge made by the 'recursive' strategy.
    README.md | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)
    Mac-Pro:gitTest kys-1$ git branch -d bug
    Deleted branch bug (was 2c013d1).

  • SourceTree操作:

合并分支
bug修復(fù)完成
  • Bug修復(fù)完,我們需要將暫存區(qū)的分支拿出來了,切換到dev分支,使用git stash list命令查看:
    Mac-Pro:gitTest kys-1git stash list stash@{0}: WIP on dev: 40be6d0 merge with --no-ff 工作區(qū)還在,可以使用兩個(gè)命令恢復(fù):一個(gè)是`git stash apply`(恢復(fù)后,stash內(nèi)容不刪除)還需用`git stash drop`刪除;另一個(gè)是使用`git stash pop`恢復(fù)的同時(shí)將stash內(nèi)容也刪除了: Mac-Pro:gitTest kys-1 git stash pop
    On branch dev
    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")
    
  • SourceTree操作:

暫存區(qū)恢復(fù)
Feature分支
  • 開發(fā)過程中,每需要開發(fā)一個(gè)新功能都需要添加一個(gè)分支,最后合并刪除,流程同上述bug分支相同,不再贅述。
  • 強(qiáng)行刪除分支,例如:你在新的分支下開發(fā)功能,后期開會(huì)取消這個(gè)功能,你只能將這個(gè)分支上的內(nèi)容全強(qiáng)制刪除,如下:
    Mac-Pro:gitTest kys-1git branch -d feature error: The branch 'feature' is not fully merged. If you are sure you want to delete it, run 'git branch -D feature'. 接下來使用`git branch -D feature`命令強(qiáng)制刪除: Mac-Pro:gitTest kys-1 git branch -D feature
    Deleted branch feature (was 5f7e86c).
  • SourceTree操作:
正常刪除提示
強(qiáng)制刪除
標(biāo)簽管理
  • 作用:標(biāo)簽作為版本庫(kù)的快照,能夠在需要的時(shí)候很快找到對(duì)應(yīng)的版本庫(kù);

  • 在指定提交節(jié)點(diǎn)上添加標(biāo)簽,默認(rèn)的標(biāo)簽是打在最新提交的節(jié)點(diǎn)上的,使用git tag命令添加標(biāo)簽,使用git show命令查看標(biāo)簽信息:
    Mac-Pro:gitTest kys-1git tag V1.0 //*** Mac-Pro:gitTest kys-1 git tag //***
    V1.0
    Mac-Pro:gitTest kys-1$ git show V1.0 //***
    commit d0fc2232015ae6737273fa5e94310bcfd4ef231c
    Author: 40188217@qq.com
    Date: Wed Apr 13 07:45:48 2016 +0800

      add a tag
    
    diff --git a/README.md b/README.md
    index 9082c3c..52ef851 100644
    --- a/README.md
    +++ b/README.md
    @@ -9,4 +9,4 @@ Try a new way!
     Try doing a different thing!
     Try again!
     I am developing!!!
    -
    +I want to make a tag!
    
  • SourceTree操作:

創(chuàng)建標(biāo)簽
標(biāo)簽顯示
打開標(biāo)簽
  • 使用git tag -d <tagname>命令刪除本地標(biāo)簽,使用git push origin <tagname>命令可以推送一個(gè)本地標(biāo)簽,使用git push origin --tags命令可以推送全部未推送過的本地標(biāo)簽,使用git push origin :refs/tags/<tagname>命令可以刪除一個(gè)遠(yuǎn)程標(biāo)簽,操作如下:
    Mac-Pro:gitTest kys-1git tag -d V1.0 Deleted tag 'V1.0' (was 6462641) 推送標(biāo)簽到遠(yuǎn)程: Mac-Pro:gitTest kys-1 git push origin V1.0 //***
    Counting objects: 5, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (4/4), done.
    Writing objects: 100% (5/5), 497 bytes | 0 bytes/s, done.
    Total 5 (delta 2), reused 0 (delta 0)
    To https://github.com/123sunxiaolin/gitTest.git
    * [new tag] V1.0 -> V1.0
    推送本地未推送的標(biāo)簽:
    Mac-Pro:gitTest kys-1git push origin --tags //*** Counting objects: 1, done. Writing objects: 100% (1/1), 154 bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) To https://github.com/123sunxiaolin/gitTest.git * [new tag] V0.1 -> V0.1 刪除已推送的標(biāo)簽,首先,刪除本地的標(biāo)簽,其次,刪除遠(yuǎn)程的標(biāo)簽: Mac-Pro:gitTest kys-1 git tag -d V0.1 //***
    Deleted tag 'V0.1' (was 98817ff)
    Mac-Pro:gitTest kys-1$ git push origin :refs/tags/V0.1 //***
    To https://github.com/123sunxiaolin/gitTest.git
    - [deleted] V0.1
  • SourceTree操作:點(diǎn)擊標(biāo)簽,右擊選擇刪除即可,勾選刪除所有遠(yuǎn)程標(biāo)簽可以刪除遠(yuǎn)程標(biāo)簽,操作非常直觀:
刪除本地標(biāo)簽
忽略特殊文件
  • 在Git工作目錄下,有一些配置文件我們不想提交到遠(yuǎn)程倉(cāng)庫(kù),這時(shí)我們可以使用Git提供的.gitignore文件;
  • 忽略文件的原則是:忽略操作系統(tǒng)自動(dòng)生成的文件,比如縮略圖等,
    忽略編譯生成的中間文件、可執(zhí)行文件等,忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
  • 首先,在Git目錄下,使用git touch .gitignore創(chuàng)建. gitignore文件,然后編輯:
    Mac-Pro:gitTest kys-1touch .gitignore Mac-Pro:gitTest kys-1 ls -ah
    . .DS_Store .gitignore
    .. .git README.md
忽略文件

/mtk/ 過濾整個(gè)文件夾
*.zip 過濾所有.zip文件
/mtk/do.c 過濾某個(gè)具體文件

gitignore還可以指定要將哪些文件添加到版本管理中,只是在文件前加一個(gè)!即可:

!*.zip
!/mtk/one.txt

其中,!/mtk/one.txt只需要管理/mtk/目錄中的one.txt文件,這個(gè)目錄中的其他文件都不需要管理,說到這想必大家都明白了。

唯一的區(qū)別就是規(guī)則開頭多了一個(gè)感嘆號(hào),Git會(huì)將滿足這類規(guī)則的文件添加到版本管理中。

  • 最后一步就是將. gitignore文件推送到遠(yuǎn)程倉(cāng)庫(kù)即可。
寫在最后
  • 在開發(fā)過程中,很多人糾結(jié)版本管理使用Git命令好呢,還是SourceTree客戶端好呢,其實(shí)這沒有明確的答案,完全取決于自己來,可以說兩種方式各有利弊,大家可以嘗試兩者結(jié)合使用,效果應(yīng)該會(huì)更好。
  • 寫到這,終于可以舒一口氣了,最后,附上自己寫文章時(shí)的截圖,希望大家給點(diǎn)掌聲以資鼓勵(lì)。
截圖集

更新記錄

  • 2018.11.21:更新git revertgit reset命令在使用上的區(qū)別;

從4月8日開始寫,到今天才寫完,將近耗時(shí)一周,中途遇見不少問題,還好,都堅(jiān)持下來了,做程序猿就得拼啊,不然怎么能攻城獅啊!
送給大家一句話:堅(jiān)持到無能為力,拼搏到感動(dòng)自己!

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

推薦閱讀更多精彩內(nèi)容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,692評(píng)論 4 54
  • Git是目前最流行的版本管理系統(tǒng),也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,748評(píng)論 1 17
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,697評(píng)論 9 163
  • 本文為 Git教程的學(xué)習(xí)筆記,教程源自廖雪峰的博客。這是一個(gè)由淺入深,學(xué)完后能立刻上手的Git教程。另,附上另一本...
    七弦桐語(yǔ)閱讀 6,268評(píng)論 5 47
  • 睡眠好的女人,容光煥發(fā),失眠的女人,眼圈烏青。讀書的女人和不讀書的女人在一天之內(nèi),三個(gè)月之內(nèi)看不出變化,日子是一天...
    虛懷若谷8閱讀 1,063評(píng)論 0 0