2017年7月26日 星期三

git branch rebase 操作流程指令

git branch rebase 操作流程指令

如果需要共同作者一起開發的話,一定會用到分支的功能,假設是兩個人的狀態下會需要三個分支。
  • 主分支
  • 作者A
  • 作者B

指令懶人包

新增br1分支
git branch br1
切到br1分支
git checkout br1
如果分支尚未建立可以加入 -b 切換同時創造
git checkout -b br1
合併過程
# 先切到br1分支
git checkout br1

# 分支自己與主線先行合併
git rebase master

# 這時候通常會有衝突,瀏覽一下修正衝突(下面再特別說明)
git add *

# 修復衝突繼續衍合
git rebase --continue

# 復原 rebase 回到 rebase 前的狀態
git rebase --abort
# 切回主線合併 (--no-ff 是 把合併的線分開比較好觀察)
git checkout master
git merge br1 --no-ff

# 復原 merge 回到 mrege 前 (preMaster 是 mrege 前 master 的代碼)
git reset "preMaster" --hard
雖然說是回到,但是merge產生的那個新點是沒有被刪除了只是沒顯示而已,可以使用 git reflog 查先前的點。如果要用快捷可以使用下面兩個
  • merge 使用 git reset HEAD^ —hard
  • rebase 使用 git reset ORIG_HEAD —hard
    要注意的是 ORIG_HEAD 是在操作危險操作時紀錄上一個點,你如果沒有當下馬上用這個ORIG_HEAD 會被蓋過去就不能用了,只能自己查記錄看到底是哪個點 reset 過去。
    HEAD^指的則是相對於目前的上一個點。
合併到主線了,這麼做有個好處是合併的產生的衝突由該分支的作者自己處理,處理完之後也可以決定要不要並回去;而不是直接 merge 把責任交給主作者去看了。
合併完成之後可以刪除不要的分支,要個別刪除本地和遠端的
# 刪除遠端分支
git push origin :fixbug

# 刪除本地分支
git branch -d fixbug
如果是同一條分支你想整理先前的提交可以使用
# 進入互動模式(對你要提交的點 pick 改 f)
git rebase tag -i

# rebase -i 中設置錯了但已經 :wq 離開了,重新設置
git rebase --edit-todo

# 修改提交信息(可選不改就不會保留)
git commit --amend

# 萬事 ok 就繼續吧
git rebase --continue
-i 是互動模式,就像 git add -i 的意思一樣,可以想像成一個方便的工具給你用的感覺。
這個可以讓你修改前面的提交狀況,決定哪些提交點要動哪些不要動,功能有重新提交、合併提交、刪除提交等等很多;
這邊的方式可以想像成另開一個副本對他做修改,所有 rebase 後的節點都是新的節點,最後再加到master之後 (前面的指令切回主線去 mrege)。
另外第一個節點不能動他,要保持是 pick 不然會出現
‘fixup’ without a previous commit
這時候就回去修改 rebase -i 的信息吧~


衝突

不同分支rebase的時候有衝突是正常的,去修復就好了,衝突通常長這個樣子
<<<<<<Head
主線上的內容
=====
分叉上的內容
>>>>>> fixbug上的提交名稱
如果你的分支再分支之後又建立好幾個節點,這邊你就有可能要修幾次衝突,要注意第一次修復的時候可能不是 fixbug 最後那個提交節點的內容。
就是前面提到的不要太多節點,不然這裡要修好幾次;注意看一下應該可以看懂,我一開始不知道會從分岔之後的第一節點開始,一直想說奇怪怎麼會這樣內容怪怪的。
大抵就是把有衝突的地方寫出來給你看,看你是要保留哪一邊,或者都不要另改新的。另改新的這樣做可能不太好,沒有被記錄到;修改的時候記得把 << 、 >> 和 == 這三行刪除。
然後就完成拉,第一次做可能有點慌,會覺得這是三米東西。

適用情況

假設只有單人開發也沒什麼需求,簡單直接在主線上開發(單人而以不太會出問題,不是太重要的專案可以不用保護),然後有一天突然發現壞了,你想要退回前3點重來慢慢加功能回來。
作法就是先回到前3點然後直接開新分支,先把要得主功能手動加回來測試這條分支就直接繼續做但不要分太多點。(做完之後可以考慮對這fixbr1做tag標籤,不然rebase完畢之後這一分支會被隱藏)
做完之後一些不影響到的小功能或註解,目前散落在master結尾3點,你就直接在 fixbr1 做 rebase master 他會要你把 fixbr1 從第一點開始,手動與 master 做合併(有幾點就手動並幾次),這時候散落的無關痛癢小功能再加回來就好,不會漏掉;會影響到的代碼當初再分支上就要先測試好。
rebase 會引上分支上的所有分支節點,然後把這些分支節點加到 master 上,新的分支節點是你在 rebase 的時候手動處理衝突的結果。 master的最後一點也會被隱藏就不見了
如何不做 rebaser 而是直接在主線 merge fixbr1 那路線圖上就有支線,雖然說這樣可能比較清楚,但是如果每次都這樣搞你的路線圖就很慘很醜。


合併提交點

常發生的情況是提交之後才發現,有一個小地方沒改到雖然不是太大重點,但是就是心癢癢的只好又提交一個點,然後這個點就顯得很廢又多餘XD
這邊就就介紹如何合併過往的提交點
假設現在有1~4點,現在第4點 master 你想要把,3合併到2
(你可以 checkout 到 3 也可以不用)
現在進入互動模式
git rebase tag2 -i
這也可以是 tag1 有包含到就好
然後會看到選單把你要合併的點3從 pick 改成 f ,存檔之後即可完成。


參考

沒有留言:

張貼留言