前言
本次文章主要介绍git多人合作的时候如何使用分支开发,操作以sourcetree和终端结合使用。
创建分支
比如master分支上有ABCD四个commit我们要在D这里开一个新的分支出来修改bug。
master :A---B---C---D
1---2---3 fixbug
/
a---b---c----d master
这个时候我们分配一个人修改bug,然后另一个人开发新功能,开了一个分支newfunction
f1---f2---f3 new function
/
a---b---c----d master
现在假设我们的bug改完了,我们这个时候应该把bugfix这个分支合并到主分支上,这时候我们应该先把多个commit合并为一个,让主分支保持简洁。
- 现在的状态 image.png
- 我们要切换到fixbug分支上,然后点击终端sourcetree会自动给你切换到这个分支上
- 首先我们rebase下主分支(因为我没找到在sourcetree上怎么做rebase操作,只有在终端进行rebase 的操作)
- 第一步跟新分支起点,因为可能在我们修改fixbug期间master分支可能已经有跟新
rebase master
- 第二步合并fixbug上的多个commit
-
打印log
image.pnggit log --oneline
(后面的--oneline是为了让log看的更清晰,不用打印作者之类的详细信息)
我们要合f1、f2、f3需要在f1前面一个commit 的id -
执行合并命令
image.png 注意红色方块,给你解释这些字母是谁的缩写,以及作用,我们这里会用到git rebase -i b44bc23
s
把f2,f3两个commit压缩到f1里面 -
把f2,f3的pick改为s然后保存退出(
image.png 然后跟着提示,修改commit的信息wq
) -
这个时候我们回到sourcetree看下状态
image.png 我们有三个拉取和一个推送。【切记】这个时候千万不要拉取远端
,因为我们刚才rebase操作的只是本地的节点,所以远端分支上还是有3个commit.这时候我们应该直接推送,但是因为远端有拉取,直接推送不会成功,我们需要切换到终端,进行强推push -f
(这个操作一定报确认本地代码无误,在主分支上一般会设置受保护,不允许push -f) - 完成push -f再查看状态只有一个commit了 image.png 然后在切换到master上合并fixbug这个分支。 image.png 合并完成后fixbug分支已经没有用了,直接删除本地和远端的。
-
- 解释下我们刚才为什么要rebase 主分支,和为什么要把多个commit合并为一个
- 首先是rebase 主分支。假设master分支是我们线上App Store的版本,然后我们要开发一个新的朋友圈功能,但是朋友圈功能不是一两天就开发完成的。在我们开发这个新功能的时候我们线上的版本可能会遇到紧急的bug(比如崩溃)这时候我们就要先在master上修改并且上传,这导致了我们朋友圈分支的代码并没有修改刚才的崩溃bug。这时候我们要做的就是把朋友圈分支的起点更新,就用到了我们的rebase master这个命令(后面的master是分支名字,也可以rebase到其他分支上)
- 为什么要合并多个commit:这是为了主分支的整洁,比如朋友圈分支,开发完后我们很多commit可能只是为了整理代码,而且我们最后只关心的是你把这个功能做完了,以面向对象的思想,而不是面向过程的保留所有的commit。
ps:前端时间同事,修改一个功能修改了大量代码,很久以后发现一个以前没有的bug(这时候已经修改了很多其他东西)我们开始追溯commit,好在他把改动的commit都合并成了一个,发现在他commit之前的代码就是ok的,这也反应了清晰的主分支也方便我们以后查找因为改动带来的bug
- 附加一个回退版本,有时候我们想把代码回退到某一个节点
image.png
image.png
这三个最后一个直接把代码丢掉,所以慎重选择,
image.png
我选的第二个他会把回退的代码放到待提交区域,这时候因为操作的还是本地git,所以远端还是会有可拉取,但是
千万不要拉取
我们还是push -f
强推上去
各位大神有什么其他常用的git命令也分享分享,一起学习进步。
喜欢动画的朋友可以关注我的GitHub https://github.com/aizexin/AIAnimationDemo
网友评论