Git操作分支

Git操作分支

事前预备

首先建立一个新目录,并在里面建立一个空数据库。这里我们创建一个名为tutorial的目录。

D:>mkdir tutorial

D:>cd tutorial

D:	utorial>git init
Initialized empty Git repository in D:/tutorial/.git/

在tutorial目录创建一个名为myfile.txt的档案,然后提交。

D:	utorial>git add myfile.txt

D:	utorial>git commit -m "first commit"
[master (root-commit) 62fac81] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 myfile.txt

建立分支

创建名为issue1的分支。(通过branch命令来创建分支)

D:	utorial>git branch issue1

不指定参数直接执行branch命令的话,可以显示分支列表。 前面有*的就是现在的分支。

D:	utorial>git branch
  issue1
* master

切换分支

若要在新建的issue1分支进行提交,需要切换到issue1分支(执行checkout命令以退出分支)

D:	utorial>git checkout issue1
Switched to branch 'issue1'

在切换到issue1分支的状态下提交,历史记录会被记录到issue1分支。在myfile.txt添加add命令的说明后再提交。

D:	utorial>git commit -m "添加add说明"
On branch issue1
nothing to commit, working tree clean

要去myfile.txt文件里写点东西,不然报工作树是干净的

D:	utorial>git add myfile.txt

D:	utorial>git commit -m "添加add说明"
[issue1 ce62510] 添加add说明
 1 file changed, 2 insertions(+), 1 deletion(-)

合并分支

向master分支合并issue1分支的修改。(执行merge命令以合并分支)

f需要先切换master分支,然后把issue1分支导入到master分支。

D:	utorial>git checkout master
Switched to branch 'master'

D:	utorial>git branch
  issue1
* master

合并

D:	utorial>git merge issue1
Updating 62fac81..ce62510
Fast-forward
 myfile.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

删除分支

既然issue1分支的内容已经顺利地合并到master分支了,现在可以将其删除了。(branch命令指定-d选项执行,可删除分支)

issue1分支被删除了。您可以用branch命令来确认分支是否已被删除。

D:	utorial>git branch -d issue1
Deleted branch issue1 (was ce62510).

D:	utorial>git branch
* master

并行操作

创建2个分支来尝试并行操作

首先创建issue2分支和issue3分支,并切换到issue2分支

D:	utorial>git branch issue2

D:	utorial>git branch issue3

D:	utorial>git checkout issue2
Switched to branch 'issue2'

D:	utorial>git branch
* issue2
  issue3
  master

在issue2分支的myfile.txt添加commit命令的说明后提交。

D:	utorial>git commit -m "添加commit说明"
On branch issue2
nothing to commit, working tree clean

要去myfile.txt文件里写点东西,不然报工作树是干净的

D:	utorial>git commit -m "添加commit说明"
[issue2 9f80320] 添加commit说明
 1 file changed, 2 insertions(+), 1 deletion(-)

接着,切换到issue3分支。

D:	utorial>git checkout issue3
Switched to branch 'issue3'

打开myfile.txt档案。由于在issue2分支添加了commit命令的说明,所以issue3分支的myfile.txt里只有add命令的说明。

D:	utorial>git add myfile.txt

D:	utorial>git commit -m "添加commit说明"
On branch issue3
nothing to commit, working tree clean

要去myfile.txt文件里写点东西,不然报工作树是干净的

D:	utorial>git add myfile.txt

D:	utorial>git commit -m "添加commit说明"
[issue3 ed64474] 添加commit说明
 1 file changed, 3 insertions(+), 1 deletion(-)

这样,添加commit的说明的操作,和添加pull的说明的操作就并行进行了

解决合并的冲突

把issue2分支和issue3分支的修改合并到master。

切换master分支后,与issue2分支合并

D:	utorial>git checkout master
Switched to branch 'master'

D:	utorial>git merge issue2
Updating ce62510..9f80320
Fast-forward
 myfile.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

执行fast-forward(快进)合并。

接着合并issue3分支。

D:	utorial>git merge issue3
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Automatic merge failed; fix conflicts and then commit the result.

自动合并失败。由于在同一行进行了修改,所以产生了冲突。

在发生冲突的地方,Git生成了内容的差异。请做以下修改:

D:	utorial>git add myfile.txt

D:	utorial>git commit -m "合并issue3分支"
[master 4013bd5] 合并issue3分支

用rebase合并

合并issue3分支的时候,使用rebase可以使提交的历史记录显得更简洁。

现在暂时取消刚才的合并。

D:	utorial>git reset --hard
HEAD is now at 4013bd5 合并issue3分支

切换到issue3分支后,对master执行rebase。

D:	utorial>git checkout issue3
Switched to branch 'issue3'

D:	utorial>git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded issue3 to master.

rebase的时候,修改冲突后的提交不是使用commit命令,而是执行rebase命令指定 --continue选项。若要取消rebase,指定 --abort选项。

D:	utorial>git add myfile.txt

D:	utorial>git rebase --continue
fatal: No rebase in progress?

这样,在master分支的issue3分支就可以fast-forward合并了。切换到master分支后执行合并。

D:	utorial>git checkout master
Already on 'master'

D:	utorial>git merge issue3
Already up to date.

合并分支使用Merge还是Rebase?

Rebase 和 merge 都是被设计用于集成你所做的改变从一个分支到另一个分支,只是通过不同的方式。虽然目的相同,但不同的方式有不同的优缺点。

Merge

  • 简单易理解
  • 源分支和目标分支相互分离
  • 保留功能分支的提交历史和分支图形
  • 分支一旦较多显示比较混乱

Rebase

  • 简化复杂的记录且线性可读
  • 没有合并的记录
  • 多个commit冲突时必须一个个提交去修改
  • 对远程分支rebase需要force push

参考文章

使用git rebase合并多次commit

用rebase合并

原文地址:https://www.cnblogs.com/d534/p/15479342.html