分佈式版本控制系統git在項目開發中的使用

原文連接:http://tabalt.net/blog/use-gi...git

關因而用git仍是svn的爭論,我想不用多聊了,總的來講,git是更穩定、更強大、更現代的分佈式版本控制工具,值得你們去嘗試與應用。github

1、準備工做

  • 配置我的信息vim

    git config --global user.name "$username"
    git config --global user.email "$email"
    git config --global push.default simple
    git config --global color.ui trueapi

  • git倉庫的建立與受權服務器

    git倉庫通常由管理員建立好了,若是是github網站,直接點擊右上角的「 + 」號,選擇 「New repository」,填寫信息並建立便可。
    
    git服務器廣泛使用ssh公鑰來受權訪問。unix系列環境下,使用ssh-keygen命令建立。

    ssh-keygen
    cd ~/.ssh
    ls id_rsa.pub運維

    將id_rsa.pub文件發給git服務器的管理員,或複製文件中的內容在github的Settings -> SSH keys 頁面中添加便可:

    https://github.com/settings/sshssh

    如何建立、管理一個git倉庫,是git服務器運維的問題了,這裏不作過多的探討。
  • 初始化項目分佈式

    cd ~/dev/
    git clone git@127.0.0.1:path/to/git_test.git
    cd ~/dev/git_test
    git statussvn

2、本地分支開發

當有一些緊急bug須要修復或者一些小功能的改動,一我的就能輕鬆搞定,可使用本地分支來開發。函數

  • 更新本地master分支爲最新

    cd ~/dev/git_test
    git checkout master
    git pull
  • 創建本地開發分支

    git branch -b dev1011
  • 在本地開發分支上修改代碼

    echo "hello git" > hello.txt
    git add hello.txt
    git commit -am 'add test file hello.txt'
    echo "test" > test.txt
    git add test.txt
    git commit -am 'add test file test.txt'
  • 開發完畢後,合併代碼到master

    • 他人可能在咱們開發的時候提交了代碼,所以先更新master分支的代碼

      git checkout master
      git pull

    • 以最新的master分支代碼rebase本地開發分支,若是出現衝突請看第四節:git衝突處理。

      git checkout dev1011
      git rebase master

    • 合併本地開發分支的代碼到master

      git checkout master
      git merge dev1011
      git push

3、遠程分支開發

遠程分支適用於多人協同開發同一個系統或功能的場景。使用遠程分支開發,能夠避免在master分支上引入不穩定的代碼。

遠程分支名能夠根據開發的獨立子系統或模塊名稱命名,如game、user、api、admin 等等。

  • 初始化遠程user分支

    • 更新本地master分支爲最新

      cd ~/dev/git_test
      git checkout master
      git pull

    • 以本地master分支爲基準新建遠程user分支

      git push origin master:user

  • 在遠程user分支開發(平常開發)

    • 將遠程user分支checkout下來

      git checkout user
      git pull

    • 在本地創建屬於本身的開發分支

      git checkout -b userdev

    • 編寫代碼

      echo 'hello user' > user.txt

    • 提交到本地開發分支

      git add user.txt
      git commit -am 'add user.txt'

    • 其餘人可能修改了代碼,先合併user上變更的內容到本地本身的開發分支

      git checkout user
      git pull
      git checkout userdev
      git rebase user

    • 合併本地本身的開發分支的代碼到遠程user分支

      git checkout user
      git merge userdev
      git push

    • 切換到本地userdev開發分支,繼續開發

      git checkout userdev
      //coding...

    能夠看到,這小節的操做步驟,和使用本地分支開發時幾乎徹底同樣,只是將基於master的操做,換成基於user的操做。

  • 合併user分支到master

git checkout master
    git pull
    git checkout user
    git rebase master

    git checkout master
    git merge user
    git push
  • 更新遠程user分支的代碼

    這時,遠程的master,本地的master,本地的develop保持一致;但若是master裏被人修改了代碼(如修改緊急bug等),遠程的user分支的代碼並非最新的了。

    • 借用本地master的代碼更新遠程user分支:

      git push origin master:user

    • 開發完畢後,能夠直接刪除遠程user分支

      git push origin :user

    • 開發完畢後,能夠刪除本地分支

      git branch -D user

4、git衝突處理

使用git merge 、git rebase、git pull等命令時,都有可能和別人修改的代碼發生衝突。

從本質上說,都是merge 和 patch(應用補丁)時產生衝突。rebase是從新設置基準,而後應用補丁的過程,因此也會衝突。git pull會自動merge,repo sync會自動rebase,因此git pull和repo sync也會產生衝突。

  • 邏輯衝突

    邏輯衝突實際上git是發現不了的。git merge 或者path成功,可是生成的代碼邏輯是有問題的,須要經過完備自動化測試等方式來保障。

    可能形成邏輯衝突的狀況:

    • 其餘人修改了文件名,我在老文件裏作改動

    • 函數參數、返回值等變化,調用方未作相應修改等

  • 樹衝突

    兩個用戶同時修改文件名形成的衝突,稱爲樹衝突。下面是一個用戶修改a.txt爲b.txt,另外一個用戶修改a.txt爲c.txt形成衝突的狀況:

    $ git status
        added by us:    b.txt
        both deleted:   a.txt
        added by them:  c.txt

    若是最終肯定使用b.txt,執行以下操做:

    git rm a.txt
    git rm c.txt
    git add b.txt
    git commit

    樹衝突也能夠用git mergetool來解決,用d 刪除不要的文件,用c保留須要的文件,最後執行git commit提交。

  • 內容衝突

    內容衝突是最多見的狀況,兩個用戶修改了同一個文件的同一塊區域,git會報告內容衝突。

    通常狀況下,出現衝突時都會有「CONFLICT」字樣,並提示哪些文件有衝突。

    當repo sync報錯時,可能並不直接提示衝突,而是下面這樣:

    error: project mini/sample

    能夠經過rebase解決:

    git rebase remote-branch-name

    merge/patch的衝突解決

    當某個文件有衝突產生時,git會在衝突的地方作標記。下面是一個有衝突的文件,衝突標記<<<<<<< (7個<)與=======之間的內容是個人修改,=======與>>>>>>>之間的內容是別人的修改;此外,沒有任何其它垃圾文件產生。

    $ vim conflict.txt
        
        <<<<<<< HEAD
        //my changes
        =======
        //other's changes
        >>>>>>> commit log

    直接編輯文件中被標記的地方,將不須要的表明和衝突標記刪除。並執行 add、commit操做

    git add conflict.txt
    git commit

    rebase的衝突解決

    rebase的衝突解決過程,就是解決每一個應用補丁衝突的過程。

    按照上面的操做編輯每個衝突文件,並一一執行git add 的操做,而後執行下面的命令繼續rebase操做:

    git rebase --continue

    有衝突繼續解決,重複這這些步驟,直到rebase完成。

    若是中間遇到某個補丁不須要應用,能夠用下面命令忽略:

    git rebase --skip

    若是想回到rebase執行以前的狀態,能夠執行:

    git rebase --abort

    rebase以後,不須要執行commit,也不存在新的修改須要提交,都是git自動完成。

打賞做者

原文連接:http://tabalt.net/blog/use-gi...

相關文章
相關標籤/搜索