/ git

git branch

git 使用基础

查看 branch 帮助:

git --help branch

分支逻辑

  • master 部署分支;
  • develop 开发分支,有 开发代码,例如禁用 cdn;
  • feature 特性分支,当我们需要开发新功能;
  1. 更新 develop 分支:将 master 上的合并到 develop;
  2. 新建 feature 分支:从 develop 新建特性分支;
  3. 移除 开发代码 :从 feature 上移除对应的 commit;
  4. 更新 master 分支:将 feature 合并到 master;
  5. 移除 feature 分支;
# macos
brew install git-flow
# debian
apt-get install git-flow

git flow init -d

git checkout -b develop master
git push -u origin develop

git flow feature start MYFEATURE

git checkout -b MYFEATURE develop

git flow feature finish MYFEATURE

git pull origin develop
git checkout develop
git merge --no-ff MYFEATURE
git push origin develop

git branch -d MYFEATURE

git flow release start release-0.1.0

git checkout -b release-0.1.0 develop
git push -u origin release-0.1.0

git flow release finish release-0.1.0

git checkout master
git merge --no-ff release-0.1.0
git push

git checkout develop
git merge --no-ff release-0.1.0
git push

git branch -d release-0.1.0

git tag -a v0.1.0 master
git push --tags

git flow hotfix start hotfix-0.1.1

git checkout -b hotfix-0.1.1 master    

git flow hotfix finish hotfix-0.1.1

git checkout master
git merge --no-ff hotfix-0.1.1
git push

git checkout develop
git merge --no-ff hotfix-0.1.1
git push

git branch -d hotfix-0.1.1

git tag -a v0.1.1 master
git push --tags

Git Flow

  1. Fork the repository. Then, run:
git clone https://github.com/haobingwang/git-flow-demo.git
cd git-flow-demo
git branch master origin/master
# -d 使用默认设置初始化
git flow init -d
  1. 提交 开发环境代码 ...

  2. 新建特性分支

# git flow feature start <name> [<base>]
# 注意:For feature branches, the <base> arg must be a commit on develop.
git flow feature start d1

output:

Switched to a new branch 'feature/d1'

Summary of actions:
- A new branch 'feature/d1' was created, based on 'develop'
- You are now on branch 'feature/d1'

Now, start committing on your feature. When done, use:

     git flow feature finish d1
  1. 提交代码...

  2. 完成开发了

git flow feature finish d1

output:

git flow feature finish d1
Switched to branch 'develop'
Updating 258d6f5..4263694
Fast-forward
 code-for-d1 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 code-for-d1
Deleted branch feature/d1 (was 4263694).

Summary of actions:
- The feature branch 'feature/d1' was merged into 'develop'
- Feature branch 'feature/d1' has been removed
- You are now on branch 'develop'

如图:

sourcetree 可以图形化操作 git flow。

Github Flow

Github,只有 master 分支

功能分支合并进master分支,必须通过 Pull Request。

master分支应该受到保护,不是每个人都可以修改这个分支,以及拥有审批 Pull Request 的权力。

Github 提供"保护分支"(Protected branch)这个功能。

Pull Request本质是一种对话机制,你可以在提交的时候,@相关人员或团队,引起他们的注意。

Gitlab Flow

功能分支合并进master分支,必须通过 Merge Request。

master分支应该受到保护,不是每个人都可以修改这个分支,以及拥有审批 Merge Request 的权力。

Gitlab 提供"保护分支"(Protected branch)这个功能。

Merge Request本质是一种对话机制,你可以在提交的时候,@相关人员或团队,引起他们的注意。

Merge节点

Git有两种合并:一种是"直进式合并"(fast forward),不生成单独的合并节点;另一种是"非直进式合并"(none fast-forword),会生成单独节点。

前者不利于保持commit信息的清晰,也不利于以后的回滚,建议总是采用后者(即使用--no-ff参数)。只要发生合并,就要有一个单独的合并节点。

关于合并分支

最容易整合分支的命令是 merge,它会把两个分支最近的快照(C3,C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的快照(C5)。

另外一种方法是:将C3的内容打在C4上,即 rebase。有了 rebase 将可以把一个分支上的提交迁移到另一个分支重放一遍。

git checkout experiment
git rebase master

它的原理是回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支experiment)后续的历次提交对象(这里只有一个C3),生成一系列文件补丁,然后以基底分支(也就是主干分支 master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 experiment 的提交历史,使它成为master分支的直接下游

现在回到master分支进行一次快速合并

git checkout master
git merge experiment

现在的 C3'其实和普通的三方合并(即上面的C5)的快照一模一样,但是得到的历史更为整洁。

当你向项目提交补丁的时候,根据最新的origin/master进行一次rebase操作然后再提交,这样维护者就不需要再做任何整合工作(例如解决冲突)。