kingfeng's Notes

git 进阶

接2018-02-26 那篇 git常用操作

接下来说说 branch、merge、rebase、tag用法、以及在实际项目中自己是如何使用Git的;

git branch

分支模型应该是git最NB的地方了;

1
2
3
4
5
6
7
8
9
10
11
git branch -a     # 所有分支,本地
git branch # 本地分支
git branch -r # 远程所有分支
git branch work # 创建work分支
git checkout dev # 切换到dev分支
git branch -d work # 删除work分支
# 删除远程分支test2
git branch -r -d origin/test2
Deleted remote-tracking branch origin/test2 (was 11d5f2e).

git push origin :test2

git merge & rebase(衍合)

把分支的修改合并到主干的时候,用merge;
通常我们合并主干修改的时候, 用rebase;

一般merge用的较多,rebase较少用;

rebase:

rebase: 把一个分支里提交的改变移动到另一个分支里重放一遍;

1
2
3
4
#在master分支执行
git rebase dev #相当于把master分支上的修改,在dev(目标分支)上原样复制一遍!!!

git rebase -i # 可以很直观地看到 rebase过程;

merge 与rebase区别:

  1. merge只是一个合并操作;会将共同祖先及两个分支的最新提交并在一起, 会生成一个新的提交(三方合并);
    而rebase 并没有进行合并操作,只是提取当前分支的修改,将其复制在了目标分支的最新提交后面;
  2. 冲突处理策略不同:
    merge遇到冲突直接停止,解决冲突commit后才能再次commit;
    rebase遇到冲突会暂停当前操作,开发者可以手动选择解决冲突,开发者可以选择手动解决冲突,然后 git rebase –continue 继续,
    或者 –skip 跳过(注意此操作中当前分支的修改会直接覆盖目标分支的冲突部分),
    或者 –abort 直接停止该次rebase 操作。
  3. 有修改未commit时,不能进行rebase 操作;

看下图:

git tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
F:\intellijRepo\JavaCodeRepo>git tag -d 0.1.3    # 删除本地分支
Deleted tag '0.1.3' (was 3879fa7)

F:\intellijRepo\JavaCodeRepo>git tag -a v0.2 -m "Release version v0.2" # 创建分支以及附注说明

F:\intellijRepo\JavaCodeRepo>git push origin v0.2 # push分支
Counting objects: 1, done.
Writing objects: 100% (1/1), 166 bytes | 166.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To gitlab.com:jinfengli/JavaCodeRepo.git
* [new tag] v0.2 -> v0.2

F:\intellijRepo\JavaCodeRepo>git tag # tag列表,或使用 git tag --list 或git tag -l
v0.1
v0.2

$ git push origin :refs/tags/v0.1.1 # 删除远程v0.1.1 tag
To gitlab.com:jinfengli/JavaCodeRepo.git
- [deleted] v0.1.1


git push origin --tags # 把本地所有标签提交到远程服务端

查看远程仓库tag列表:

1
2
3
$ git ls-remote --tags
0bdd02d19eaf90b36eaca4f4fa2a76d5a20d17b0 refs/tags/v0.2
10f25f7cb25ee5b64dbe8a322d13a208f0e1142c refs/tags/v0.2^{} # ^{} 表示v0.2 是包含附注的tag

git 实际项目使用

主要是针对多个功能分支,如何进行有效提交,
我使用的时候,一般按照下面步骤进行操作,保证了master主干分支的干净;

  1. 在自己的dev分支开发;
  2. dev分支修改提交;
  3. 切换到master分支,执行 git pull,获取最新代码,这里是不会冲突的;
  4. 切到dev分支,合并主干修改 (git rebase master) ,若有冲突在这个时候解决;
  5. 回到master分支;
  6. 执行 git merge dev,合并dev分支的修改;
  7. 在master分之上提交代码到远程仓库; git push origin master

其他

对于git理解只算是了解了冰山一角,想更深入理解,请多使用 git xxx --help 看官方的文档;

您的支持将鼓励我继续创作