Git經常使用命令(二)

1、分支管理: git

    分支在實際中有什麼用呢?假設你準備開發一個新功能,可是須要兩週才能完成,第一週你寫了50%的代碼,若是馬上提交,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能幹活了。若是等代碼所有寫完再一次提交,又存在丟失天天進度的巨大風險。如今有了分支,就不用怕了。你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。 安全

1. 建立與合併分支: app

  • 一開始的時候,master分支是一條線,Git用master指向最新的提交,再用HEAD指向master,就能肯定當前分支,以及當前分支的提交點:;每次提交,master分支都會向前移動一步,這樣,隨着你不斷提交,master分支的線也愈來愈長。
  •            
  • 當咱們建立新的分支,例如dev時,Git新建了一個指針叫dev,指向master相同的提交,再把HEAD指向dev,就表示當前分支在dev

            

  • 從如今開始,對工做區的修改和提交就是針對dev分支了,好比新提交一次後,dev指針往前移動一步,而master指針不變:

        

  • dev上的工做完成了,就能夠把dev合併到master上。Git怎麼合併呢?最簡單的方法,就是直接把master指向dev的當前提交,就完成了合併:

        

    1)建立dev分支,而後切換到dev分支:git checkout命令加上-b參數表示建立並切換,而後,用git branch命令查看當前分支。git branch命令會列出全部分支,當前分支前面會標一個*號。而後,就能夠在dev分支上正常提交 spa

$ git checkout -b dev
    2) 切換回master 分支後,提交在dev分支上的內容並無添加到master分支上, dev 分支的工做成果合併到master 分支上:git merge 命令用於合併指定分支到當前分支。


    3)合併完成後,就能夠放心地刪除dev分支了: 指針

$ git branch -d dev
    4) 由於建立、合併和刪除分支很是快,因此Git鼓勵你使用分支完成某個任務,合併後再刪掉分支,這和直接在master 分支上工做效果是同樣的,但過程更安全。
  • 查看分支:git branch code

  • 刪除分支:git branch -d <name> orm

  • 合併某分支到當前分支:git merge <name> 開發

  • 建立+切換分支:git checkout -b <name> rem

  • 切換分支:git checkout <name> 同步

  • 建立分支:git branch <name>

2、解決衝突

  • 當Git沒法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
  • git log --graph命令能夠看到分支合併圖。

1.  分支管理策略:一般,合併分支時,若是可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。

若是要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。

  • --no-ff方式的git merge請注意--no-ff參數,表示禁用Fast forward,由於本次合併要建立一個新的commit,因此加上-m參數,把commit描述寫進去。
    $ git merge --no-ff -m "merge with no-ff" dev
  • 在實際開發中,咱們應該按照幾個基本原則進行分支管理:

    首先,master分支應該是很是穩定的,也就是僅用來發布新版本,平時不能在上面幹活;

    那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;

    你和你的小夥伴們每一個人都在dev分支上幹活,每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。

2.  bug分支:當接到一個修復一個代號101的bug的任務時,很天然地想建立一個分支issue-101來修復它,可是,等等,當前正在dev上進行的工做尚未提交,Git提供了一個stash功能,能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做。($git stash),bug修復完成以後能夠回到dev分支使用一下命令恢復工做現場:

  • 可使用git stash apply恢復,可是恢復後,stash內容並不刪除,你須要用git stash drop來刪除;
  • 另外一種方式是用git stash pop,恢復的同時把stash內容也刪了

3.  feature分支:每添加一個新功能,最好新建一個feature分支,在上面開發,完成後,合併,最後,刪除該feature分支。若是在feature完成後沒有合併以前,須要刪除feature分支,採用強行刪除:
$ git branch -D feature-vulcan
  • 若是要丟棄一個沒有被合併過的分支,能夠經過git branch -D <name>強行刪除。

4.  遠程:當從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,而且,遠程倉庫的默認名稱是origin。要查看遠程庫的信息,用git remote。

  • 推送分支:就是把該分支上的全部本地提交推送到遠程庫
    $ git push origin master
  • 並非必定要把本地分支往遠程推送:

    • master分支是主分支,所以要時刻與遠程同步;

    • dev分支是開發分支,團隊全部成員都須要在上面工做,因此也須要與遠程同步;

    • bug分支只用於在本地修復bug,就不必推到遠程了,除非老闆要看看你每週到底修復了幾個bug;

    • feature分支是否推到遠程,取決於你是否和你的小夥伴合做在上面開發。

  • 抓取分支:多人協做時,你們都會往masterdev分支上推送各自的修改。從遠程庫clone時,默認狀況下,你的小夥伴只能看到本地的master分支。要在dev分支上開發,就必須建立遠程origindev分支到本地,因而他用這個命令建立本地dev分支:
    $ git checkout -b dev origin/dev
    如今,他就能夠在dev上繼續修改,而後,時不時地把dev分支push到遠程。
  • 你的小夥伴已經向origin/dev分支推送了他的提交,而碰巧你也對一樣的文件做了修改,並試圖推送:
    $ git push origin dev
    推送失敗,由於你的小夥伴的最新提交和你試圖推送的提交有衝突,解決辦法也很簡單,Git已經提示咱們,先用git pull把最新的提交從origin/dev抓下來,而後,在本地合併,解決衝突,再推送
    $ git pull
  • git pull也失敗了,緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置devorigin/dev的連接
    $ git branch --set-upstream dev origin/dev

5.  多人協做的工做模式一般是這樣:

  1. 首先,能夠試圖用git push origin branch-name推送本身的修改;

  2. 若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull試圖合併;

  3. 若是合併有衝突,則解決衝突,並在本地提交;

  4. 沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!

    若是git pull提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有建立,用命令git branch --set-upstream branch-name origin/branch-name。

3、標籤管理:發佈一個版本時,一般先在版本庫中打一個標籤,這樣,就惟一肯定了打標籤時刻的版本。未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,標籤也是版本庫的一個快照。

Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的指針(可是分支能夠移動,標籤不能移動)



  • 命令git push origin <tagname>能夠推送一個本地標籤
  • 命令git push origin --tags能夠推送所有未推送過的本地標籤
  • 命令git tag -d <tagname>能夠刪除一個本地標籤
  • 命令git push origin :refs/tags/<tagname>能夠刪除一個遠程標籤
相關文章
相關標籤/搜索