Git 直線式分支結(jié)構(gòu)

日常開發(fā)中提交代碼

首先說一下我們原來的工作流程, 我們有一個默認master分支, 一個dev分支, 日常開發(fā)中, 我們還會創(chuàng)建一個關于本次功能對應的本地分支(如 invoice分支), 本次修改全部放在invoice分支上, 然后當開發(fā)完成測試通過后, 通過merge合并分支到dev, 最后提交版本驗證通過后再提交到master分支上.

1545989656680.png

我相信大多數(shù)公司的開發(fā)流程都是這樣的. 這樣并沒有什么問題, 但是久而久之, 你就會發(fā)現(xiàn)分支結(jié)構(gòu)復雜,亂. 還有在dev/master上, 針對同一個invoice功能, leader并不想知道我們開發(fā)這個功能進行了多少次bug修改, 新功能提交, 也就是說在dev/master上只存在一個invoicecommit就可以了. 那這里就涉及到另一種提交代碼的技巧.

rebase命令

其實,還有一種方法:你可以提取在 invoice 中引入的補丁和修改,然后在 dev 的基礎上應用一次。 在 Git 中,這種操作就叫做 變基。 你可以使用 rebase 命令將提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一樣。

它的原理是首先找到這兩個分支(即當前分支 invoice、變基操作的目標基底分支 dev)的最近共同祖先 A1(SHA-1值),然后對比當前分支相對于該祖先的歷次提交,提取相應的修改并存為臨時文件,然后將當前分支指向目標基底A3(SHA-1值), 最后以此將之前另存為臨時文件的修改依序應用.

理解完工作原理就直接來看具體在提交的時候如何操作吧.

Git rebase 使用方法

1. 合并多次commit

  • 注: 保證僅僅對自己私有的提交單進行rebase操作,對于已經(jīng)合并進遠程倉庫的歷史提交單,不要使用rebase操作合并commit單。

例如 我有三次commit:

commit 7df9296a1b80c8eaa2dc3a21122ae3d03ee0b210
Author: bianzhifeng <bianzhifeng@czb365.com>
Date:   Fri Dec 28 14:43:11 2018 +0800

    dev4

commit b3880ad738d8e4aaadd321505cebb515e08b33b0
Author: bianzhifeng <bianzhifeng@czb365.com>

    dev3

commit bc52c40ef867ebc26e9824ed8363ac3c9a2a3a81
Author: bianzhifeng <bianzhifeng@czb365.com>
Date:   Fri Dec 28 13:55:39 2018 +0800

    dev2   

commit cb4a5ac9bde58fe36d77dcbe8106c1a72f594aa5 (origin/master, master)
Author: bianzhifeng <bianzhifeng@czb365.com>
Date:   Fri Dec 28 14:25:40 2018 +0800

    dev1

現(xiàn)在我想把 dev4 dev3 dev2 合并成一個, 那么輸入git rebase -i cb4a..., 也就是提交的SHA-1值, 但是要注意是要合并的前一條的SHA-1值, 所以我這里填寫的SHA-1值為dev1SHA-1值.

之后便會出現(xiàn)下方的vi界面:

pick 7df9296 dev4
pick b3880ad dev3
pick bc52c40 dev2

# Rebase cb4a5ac..bc52c40 onto cb4a5ac (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
"~/Desktop/gitrebasetest/.git/rebase-merge/git-rebase-todo" 29L, 1117C

這里最重要的就是squashpick, 默認三個提交都是pick. pick代表提交記錄, squash代表合并到前一個記錄, 所以如果想把dev3 dev2合并到dev4的記錄中, 那我們把dev3 dev2前對應的pick/p修改為squash/s, 然后按ESC :wq退出.

  • 注: 這里s代表向上合并, 如果只是想把dev2合并到dev4, 那么調(diào)整把dev2/dev3位置互換, 而且只修改dev2對應的修改為s, dev3不修改使用p即可

然后便會進入另一個vi界面:

# This is a combination of 3 commits.
# This is the 1st commit message:

dev4

# This is the commit message #2:

dev3

# This is the commit message #3:

dev2

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Fri Dec 28 14:43:11 2018 +0800
#
# interactive rebase in progress; onto b3880ad
# Last commands done (3 commands done):
"~/Desktop/gitrebasetest/.git/COMMIT_EDITMSG" 36L, 703C

在這里, 可以修改本次提交的提示信息, 然后保存退出就可完成合并.

2. 變基:

例如把invoice變基到dev, 那么切換到dev分支, 執(zhí)行git rebase invoice, 就完成了變基.
如果遇到?jīng)_突, 那么解決沖突后 git add . ,然后 git rebase --continue就可以了.

做完如上兩部, 再次打開你的dev分支, 你會看到一個直線的并且針對一個版本只有一個commit的分支.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • git 使用筆記 git原理: 文件(blob)對象,樹(tree)對象,提交(commit)對象 tree對象 ...
    神刀閱讀 3,852評論 0 10
  • Git是目前最流行的版本管理系統(tǒng),也是最先進的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,978評論 1 17
  • 喜歡你,不是因為你長得漂亮!也不是因為你的善良。因為你的既漂亮又善良! 眾人的女神啊,你。知不知道你多次的動搖了我...
    張羊羊ZZ閱讀 232評論 0 0
  • 早已忘了,這張照片是周幾拍的。只記得當時的天空很藍,云很白。看著這樣的藍天白云,心情莫名就變得不錯。于是在和學生去...
    滋蘭閱讀 359評論 0 0
  • 每個人心底總會有個人 當你與他目光交錯 就像是觸到花火 他的眼睛里滿是深邃 旋轉(zhuǎn)著溫暖的銀河 我總是不禁地沉溺 深...
    STARLIGHTSMoon閱讀 105評論 0 0

友情鏈接更多精彩內(nèi)容