Git學習教程(四):分枝和合并

jopen 12年前發布 | 19K 次閱讀 Git 版本控制系統

第四課  分枝和合并基礎知識介紹

內容提要:創建工作分枝,合并分枝以及刪除分枝

從第一課的介紹中,我們了解到,git處理分枝和合并是非常獨到的。首先,無論是創建新分枝還是分枝之間切換,都表現出一個共同的特征--快! git 有一個獨立的工作目錄,專門用來存放所有分枝的內容,所以你沒必要為每一個分枝再分別創建目錄。

這一節,我們的任務是:

1. 創建一個新的分枝;

2.在這個分枝上做一些工作;

3.切換回穩定的主分枝(一般git默認的主分枝名叫master);

4.在主分枝上再做點工作;

5.再切換到剛那個臨時分枝完成工作;

6.最后將它們合并成為一個穩定的主分枝。
</div> </div>

首先,查看現存的分枝,可以使用不帶任何參數的'git branch'命令。

$ git branch

  • master</span> </div> </div>
    可以看到,我們現在只有一個分枝叫做'master',*代表的意思是我們正在這個主分枝上工作。下圖是在主分支上的提交歷史模型,綠框表示提交,箭頭指向的是它的父節點。這就是git提交數據的方式。
    Git學習教程(四):分枝和合并
    從圖中可以看出,在git中,分枝都是由一些具體的提交點組成。整個分枝的歷史都是這樣串聯起來的,一次只有一個提交點。
    創建新的分枝
    </div>
    可以用'git branch (branchname)'命令在當前分枝上創建一個新的分枝:
    $ git branch experiment
    </div>
    Git學習教程(四):分枝和合并
    為了將我們的工作保存到experiment分枝而不是master分枝上,我們需要切換到experiment分枝上,執行'git checkout'命令:
    $ git checkout experiment
    Switched to branch "experiment"
    $ git branch
    * experiment
      master
    </div>
    執行完畢后,我們就切換到了新的分枝(experiment)分枝上,看到experiment前面有了*號了。現在,我們修改文件、提交就不用再擔心跟master分枝混在一起了。也沒必要在我們確定一切搞定之前,將experiment分枝上的變更共享了。
    在多分枝上進行工作
    現在,讓我們添加一個TODO文件,并修改simplegit.rb文件,然后將這些變更都提交。
    $ vim lib/simplegit.rb
    $ vim TODO
    $ git add TODO
    $ git commit -am 'added a todo and added simplegit functions'
    [experiment]: created 4682c32: "added a todo and added simplegit functions"
     2 files changed, 10 insertions(+), 0 deletions(-)
     create mode 100644 TODO
    </div>
    Git學習教程(四):分枝和合并
    現在,我們來看一下,整個項目中有3個文件和一個子目錄。
    $ ls
    README  Rakefile TODO  lib
    </div>
    然后,我們假設需要回到原始版本來調試simplegit.rb文件。
    $ git checkout master
    Switched to branch "master"
    $ ls
    README  Rakefile lib
    </div>
    可以看到我們已經回到了master分枝,工作目錄中也沒有TODO文件,這是因為master分枝上我們就沒有創建過這個文件。
    如果現在我們再切換到experiment分枝,我們又會看到TODO文件,并且simplegit.rb也是我們在experiment修改后的內容。
    下面這段代碼是在master分枝上修改simplegit.rb文件,在文件內添加一個commit function.提交,然后再切換到experiment分枝。
    $ vim lib/simplegit.rb
    $ git commit -am 'added a commit function'
    [master]: created 0b7434d: "added a commit function"
     1 files changed, 4 insertions(+), 0 deletions(-)
    $ git checkout experiment
    Switched to branch "experiment"
    $ ls
    README  Rakefile TODO  lib
    </div>
    Git學習教程(四):分枝和合并
    很多使用git的開發者通常會同時擁有很多個分枝,每一個分枝上都會進行著某個具體功能的開發,這些開發可能持續幾分鐘、幾小時,也可能長時間的在某個分枝上進行大規模重構的工作,并定期的將其合并到主分枝上。
    如果你需要在一個長期工作的分支上與其他開發者進行協作,你可以將這個分枝上傳到共享服務器端。譬如,如果你想跟某人共享experiment分枝,你可以這樣:
    $ git push origin experiment
    讓你的合作伙伴同步這個分枝,然后與你協同工作。當然你也可以自己保留這些分枝作為自己的工作分枝--不用上傳就可以了。
    合并和移除無用分枝
    </div>
    當你在一個分枝上完成你的工作了,這時,如果你覺得所做的工作沒什么意義,那么你可以忽略它并且將其移除;相反,你應該將這些工作合并到一個你 會長期使用的分枝中(一般來說,開發者會用'master'分枝來存放穩定的代碼,并行的'develop'分枝用來整合或測試變更的內容,或者將一些短 期的分枝合并進來)。
    合并分枝的方法:首先切換到想要合并到的分枝下,運行'git merge'命令,(例如本例中將experiment分枝合并到master分枝的話,進入master分枝運行git merge experiment命令)如果合并順利的話:
    $ git merge experiment
    Auto-merging lib/simplegit.rb
    Merge made by recursive.
     lib/simplegit.rb |    1 +
     1 files changed, 1 insertions(+), 0 deletions(-)
    </div>
    Git學習教程(四):分枝和合并
    合并沖突處理
    </div>
    然而,有時候合并并不一定會順利進行,如果碰到了問題,就會出現下面這些內容:
    $ git merge experiment
    Auto-merging lib/simplegit.rb
    CONFLICT (content): Merge conflict in lib/simplegit.rb
    Automatic merge failed; fix conflicts and then commit the result.
    這種情形下,提示合并沖突,你可以通過下面的方式來解決:打開提示沖突的文件,會看到沖突標記:
    <<<<<<< HEAD:lib/simplegit.rb
      def commit(message)
        command("git commit -m '#{message}'")
    =======
      def add(path)
        command("git add #{path}")
    >>>>>>> experiment:lib/simplegit.rb
      end
    </div>
    修改完成之后,運行'git add'重新載入(re-stage)這個文件,然后合并:
    $ git add lib/simplegit.rb
    $ git commit
    [master]: created 6d52a27: "Merge branch 'experiment'"
    </div>
    多次合并
    這個問題之所以重要是因為在其他的VCS工具中多次合并實現起來是很麻煩的,但是用git,很容易解決。合并一個分枝之后,再繼續在這個分枝上 工作,然后再合并。這種情形一般是這樣的:如果你有一個'development'分枝,你正在進行集成測試、合并實驗中的變更,然后定期的將其合并到穩 定的'master'分枝中。
    用我們正在進行的例子來講,假如我們現在又切換到'experiment'分枝,做點小小的改動,然后再將其合并到'master'分枝中,整個的過程大致是這樣:
    Git學習教程(四):分枝和合并
    因為git合并是基于提交歷史的快照,所以多次合并顯得so easy。當你在一個分枝上做完你的工作之后,譬如例子中的'experiment'分枝,那么我們只需使用'git branch -d'命令即可刪除此分枝
    $ git branch -d experiment
    如果分枝還沒有被合并,那么執行這個命令就會將分枝上所做的工作一并刪除,git是不允許你這么干的。如果你實在想刪除的話,那么使用'-D'參數強行刪除吧。

    這就是git中分枝和合并的所有內容,我想你理解了git的這一功能之后會覺得它確實是個非常棒的工具了。

     

    轉自 http://fsjoy.blog.51cto.com/318484/245081
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!