2015年2月4日 星期三

Git Merge

Git的合併方式分成四種

  • Straight merge 
  • Squashed commit 
  • cherry-pick 
  • rebase

git merge 的指令

git merge <branch_name> :
合併另一個 branch,若沒有 conflict 衝突會直接 commit。若需要解決衝突則會再多一個 commit。
git merge --squash <branch_name>
將另一個 branch 的 commit 合併為一筆,特別適合需要做實驗的 fixes bug 或 new feature,最後只留結果。合併完不會幫你先 commit。
git cherry-pick <commit-id> 
只合併特定其中一個 commit。如果要合併多個,可以加上 -n 指令就不會先幫你 commit,這樣可以多 pick幾個要合併的 commit,最後再 git commit 即可。








Fast-forward 

fast-forward 在 Git 是一種 merge 術語,當 B branch (例如一個 local branch) 是從 A branch (例如一個 remote branch) 的最新版(HEAD)分支出來的,那當 A 要把 B merge 進來時,因為 B 的 parent commit 是 A 的 HEAD,所以這兩個 branch 唯一的差異就是 B 後來的 commit 而已,而不會有任何 conflict。所以實際上的動作只要把 A 的 HEAD 改成 B 的 HEAD 就好了,線圖上這兩個 branch 根本是同一條線,此謂 fast-forward



master和 origin/master就是fast-forward.


20151126補充
master(原本的)和 hotfix(多一個commit)就是fastforward , 所以只需要執行
$ git checkout master $ git merge hotfix

 



Conflict 

當user1 , user2 同時clone一份 (test1),然後各自修改後push上去
user2 搶先push , 所以成功 . 之後 user 1 再push 就會出現錯誤 . server要求先pull.
但是此時user1執行pull , 也會失敗 , 警告為 Automatic merge failed.
此時就要用 fetch
$ git fetch #但是我看到的是 衝突檔案被修改, git 直接幫我標出 conflict的地方.(我以為會變成另外一個branch?) 
手動修改衝突的檔案後 , commit/push上去之後變成
    


這時候原本先push上去的user2 會發現變成這樣.

這時候只要 $git pull origin master 即可



附註 =======================

又再做一次實驗 ,user2先push上去
user1 這次用 
$ git fetch origin



可以看到 , 多了一個分支 origin/master , 衝突檔案也沒有被直接修改. 
這時候 , 先切換到 /origin/master ,(指令 : $ git checkout origin/master)
然後把我們的master合併過來(指令 $ git merge master)
直接在master branch合併 (指令 $ git merge origin/master)

可以看到合併 , 但是會有conflict , 手動修改檔案後再push上去.


這時候回去看user2的--------------------------------

local/master 已經落後origin/master , 但是不在同一個branch


只要直接pull下來就好




ref: https://ihower.tw/blog/archives/2620  

2015年2月3日 星期二

Git remote branch

Git Remote Branch

從Clone階段開始看

Clone 之後 : 
Git 會自動為你將此遠端倉庫命名為 origin,並下載其中所有的資料,建立一個指向它的master 分支的指標,在本地命名為 origin/master . 
接著,Git 建立一個屬於你自己的本地 master 分支,始於 origin 上 master 分支相同的位置,你可以就此開始工作




和remote端分流之後

 local端修改之後 , remote也有別的開發者push新的版本上去. 於此同時,你在本地的提交歷史正朝向不同方向發展。不過只要你不和伺服器通訊,你的 origin/master 指標仍然保持原位不會移動.

同步遠端伺服器資料到本地

 該命令首先找到 origin 是哪個伺服器(本例為 git.ourcompany.com),從上面獲取你尚未擁有的資料,更新你本地的資料庫,然後把origin/master 的指針移到它最新的位置上



Pull from remote Branch

 $ git pull origin master

Push local branch

如果你有個叫 serverfix 的分支需要和他人一起開發,可以運行 git push (遠端倉庫名) (分支名)
$ git push origin branchA 
  • 其實Git 自動把 branchA 分支名擴展為 refs/heads/branchA:refs/heads/branchA  意為“取出我在本地的branchA 分支,推送到遠端倉庫的 branchA分支中去”
  • 也可以運行 git push origin serverfix:serverfix 來實現相同的效果 , 它的意思是“上傳我本地的 serverfix 分支到遠端倉庫中去,仍舊稱它為 serverfix 分支”
所以也可以把本地branchA push上remote brachB
$ git push origin branchA : beanchB

跟蹤遠端分支

 跟蹤分支(tracking branch)是一種和某個遠端分支有直接聯繫的本地分支。在跟蹤分支裡輸入 git push,Git 會自行推斷應該向哪個伺服器的哪個分支推送資料。
當第一次clone下來一個remote repository時 , Git 通常會自動創建一個名為 master 的分支來跟蹤 origin/master。這正是 git push 和 git pull 一開始就能正常工作的原因
或是可以手動建立一個追蹤分支
git checkout -b [分支名] [遠端名]/[分支名]


刪除遠端分支

刪除remote端的branchA  : 
git push origin :[分支名]




from : http://git-scm.com/book/zh-tw/v1/Git-分支-遠端分支