Shawn's Blog
目录 · 3 节

git 初步使用经验

0X00 怎样正确使用分支

通常情况下一个git仓库要保持三个及以上的分支,基本的分支明明如下:

namefunction
master正常运行的稳定版本
develop正常运行的开发版
feature添加新功能的分支
hotfix紧急修复bug的分支

如果你已经fork了一份代码到自己本地,当你想添加一个新功能比如「用户管理」的时候,就应该先换到develop分支,然后由这个分支创建一个新的名为feture_add_usermanager的分支。在新分支里编写代码后将代码提交一个PullRequest到自己的develop分支,合并起来后再提交一个PullRequest到团队的仓库中,等待团队其他成员review后就可以正式将代码合并到团队的develop中了。等下一次发布新版本的时候就可以将团队的develop分支合并到团队的master分支中了了。

如果中途项目出现了严重bug(不能登录)需要即使修改上线,那就从自己的master分支上新建一个名为hotfix_cantlogin的分支,修改完后直接提交PullRequest到团队的master分支,review且合并后就可以将该分支删除了。

0X01 合并多次commit

有的时候会出现这么一种情况:连续的n次commit解决的都是同一个问题,为了让最终的提交记录清晰明了,可以将这几次的commit合并为一次。看下面的实例:

1commit bc83e15e3245ad4064fdd9fe2bf105252d0c51fc (HEAD -> develop)
2Author: shawn <shawnbluce@gmail.com>
3Date:   Mon Nov 6 00:52:43 2017 +0800
4
5    fix usermanager
6
7commit affc0acb9a3de30288f144ae2d0b28a9fd60af4b
8Author: shawn <shawnbluce@gmail.com>
9Date:   Mon Nov 6 00:52:33 2017 +0800
10
11    fix usermanager
12
13commit fcf13d712bd3dbd483442ffd316741e04acaaa3e
14Author: shawn <shawnbluce@gmail.com>
15Date:   Mon Nov 6 00:52:23 2017 +0800
16
17    fix usermanager
18
19commit 2812e2928913e9b3a7650e389602b8bb10ca388b
20Author: shawn <shawnbluce@gmail.com>
21Date:   Mon Nov 6 00:52:08 2017 +0800
22
23    fix usermanager
24
25commit f7f273d9c36d748183ac3e6a90f06ff14ed42f95
26Author: shawn <shawnbluce@gmail.com>
27Date:   Mon Nov 6 00:51:52 2017 +0800
28
29    add user_manager

最近的四次提交内容都是一样的,修改了四次bug最终才解决了问题,因为最近四次的commit是相同含义的修改,所以最好合并在一起,可以使用这个方法

1# 最后接的id是你合并的这些commit之前的一个
2git rebase -i f7f273d9c36d748183ac3e6a90f06ff14ed42f95
3
4# 输入命令之后到vi环境的界面
5pick 2812e29 fix usermanager
6pick fcf13d7 fix usermanager
7pick affc0ac fix usermanager
8pick bc83e15 fix usermanager
9
10# 我们将其修改为
11pick 2812e29 fix usermanager
12squash fcf13d7 fix usermanager
13squash affc0ac fix usermanager
14squash bc83e15 fix usermanager
15
16# 保存退出,进入commit message修改的界面
17这里会展示出合并的这几次commit的message,我们选择性的修改一下将这几次的commit message整合一下,继续保存。这次保存之后就相当把这几次的commit合并成一次了。

注意,如果你是从仓库中clone下来的项目,那么有可能在你合并完几个commit后再git push会提示错误。假设以前是有100次commit的,现在你合并了最后的三次,再push,就会和远端的仓库出现分歧。一般情况下都是在确认自己的代码没问题之后,使用git push -f的方式强行把代码推上去,这样就会覆盖掉最后的几次commit,以你新push的代码为基准了。

0X02 迁移一次commit

有的时候我们需要将某个分支中的某次提交复制到另一个分支,具体使用情景有很多。这里展示一个使用样例:

1git log 查看master分支的commit,只有这一次
1commit 2959f92753d84bff5b125b15cd9497c4d8dff637 (HEAD -> master)
2Author: shawn <shawnbluce@gmail.com>
3Date:   Sun Nov 12 16:09:07 2017 +0800
4
5    完成XXX功能
6
7切换到dev分支查看commit,有四次
8commit bba77c7faf7821802b108688a17d8e6655975b7e (HEAD -> dev)
9Author: shawn <shawnbluce@gmail.com>
10Date:   Sun Nov 12 16:11:47 2017 +0800
11
12    整理XXX
13
14commit 9001f8250ce47a067c9af50bf62af025b872c3bc
15Author: shawn <shawnbluce@gmail.com>
16Date:   Sun Nov 12 16:11:37 2017 +0800
17
18    添加XXX
19
20commit 6e4171ad632a7627be08ec7c9afaf64f55ccc98d
21Author: shawn <shawnbluce@gmail.com>
22Date:   Sun Nov 12 16:11:21 2017 +0800
23
24    修复XXX
25
26commit 2959f92753d84bff5b125b15cd9497c4d8dff637 (master)
27Author: shawn <shawnbluce@gmail.com>
28Date:   Sun Nov 12 16:09:07 2017 +0800
29
30    完成XXX功能
31
32如果此时我想将那个“添加XXX”的commit移到master分支,可以使用`git cherry-pick`
33可以看到“添加XXX”的那次commit的ID为`6e4171ad632a7627be08ec7c9afaf64f55ccc98d`
34我们复制这个ID,切到master分支,使用`git cherry-pick commit_id`
35shawn in ~/test on master λ git cherry-pick 6e4171ad632a7627be08ec7c9afaf64f55ccc98d
36[master f77b496] 修复XXX
37 Date: Sun Nov 12 16:11:21 2017 +0800
38 1 file changed, 0 insertions(+), 0 deletions(-)
39 create mode 100644 b
40shawn in ~/test on master λ git log
41commit f77b49677efb1ba967dbc323332e2f8495fdbca1 (HEAD -> master)
42Author: shawn <shawnbluce@gmail.com>
43Date:   Sun Nov 12 16:11:21 2017 +0800
44
45    修复XXX
46
47commit 2959f92753d84bff5b125b15cd9497c4d8dff637
48Author: shawn <shawnbluce@gmail.com>
49Date:   Sun Nov 12 16:09:07 2017 +0800
50
51    完成XXX功能
1这样一个commit就复制过来了。如果有冲突的话需要将冲突解决完才能合并。
本文标题
git 初步使用经验
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论