Git 直线式分支结构

日常开发中提交代码

首先说一下我们原来的工作流程, 我们有一个默认master分支, 一个dev分支, 日常开发中, 我们还会创建一个关于本次功能对应的本地分支(如 invoice分支), 本次修改全部放在invoice分支上, 然后当开发完成测试通过后, 通过merge合并分支到dev, 最后提交版本验证通过后再提交到master分支上.

1545989656680.png

我相信大多数公司的开发流程都是这样的. 这样并没有什么问题, 但是久而久之, 你就会发现分支结构复杂,乱. 还有在dev/master上, 针对同一个invoice功能, leader并不想知道我们开发这个功能进行了多少次bug修改, 新功能提交, 也就是说在dev/master上只存在一个invoicecommit就可以了. 那这里就涉及到另一种提交代码的技巧.

rebase命令

其实,还有一种方法:你可以提取在 invoice 中引入的补丁和修改,然后在 dev 的基础上应用一次。 在 Git 中,这种操作就叫做 变基。 你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

它的原理是首先找到这两个分支(即当前分支 invoice、变基操作的目标基底分支 dev)的最近共同祖先 A1(SHA-1值),然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底A3(SHA-1值), 最后以此将之前另存为临时文件的修改依序应用.

理解完工作原理就直接来看具体在提交的时候如何操作吧.

Git rebase 使用方法

1. 合并多次commit

  • 注: 保证仅仅对自己私有的提交单进行rebase操作,对于已经合并进远程仓库的历史提交单,不要使用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

现在我想把 dev4 dev3 dev2 合并成一个, 那么输入git rebase -i cb4a..., 也就是提交的SHA-1值, 但是要注意是要合并的前一条的SHA-1值, 所以我这里填写的SHA-1值为dev1SHA-1值.

之后便会出现下方的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, 那么调整把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分支, 执行git rebase invoice, 就完成了变基.
如果遇到冲突, 那么解决冲突后 git add . ,然后 git rebase --continue就可以了.

做完如上两部, 再次打开你的dev分支, 你会看到一个直线的并且针对一个版本只有一个commit的分支.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,756评论 0 10
  • Git是目前最流行的版本管理系统,也是最先进的分布式版本控制系统(distributed version cont...
    pro648阅读 5,672评论 1 17
  • 喜欢你,不是因为你长得漂亮!也不是因为你的善良。因为你的既漂亮又善良! 众人的女神啊,你。知不知道你多次的动摇了我...
    张羊羊ZZ阅读 197评论 0 0
  • 早已忘了,这张照片是周几拍的。只记得当时的天空很蓝,云很白。看着这样的蓝天白云,心情莫名就变得不错。于是在和学生去...
    滋蘭阅读 273评论 0 0
  • 每个人心底总会有个人 当你与他目光交错 就像是触到花火 他的眼睛里满是深邃 旋转着温暖的银河 我总是不禁地沉溺 深...
    STARLIGHTSMoon阅读 82评论 0 0