文章目录
综述
本文档主要用于详细说明如何使用Git
的分支;主要包含四个方面:
- 背景说明
- 创建分支
- 合并分支
- 删除分支
由于之前很早写过一篇分支的使用《Git命令的使用_创建与合并分支——详细教程4》,但是由于
CSDN
改版,文章的样式,图片都变得面目全非了,所以今天重新整理了一下
背景说明
前言:在我们每次的提交,
Git
都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git
里,这个分支叫主分支,即master
分支。简单来理解我们可以认为master
就是主分支。而HEAD
指向的是“当前分支”。
我们在日常工作中可能会遇到这样的需求:
- 开发某个项目;
- 为了实现某个新的客户需求,创建一个分支;
- 在这个分支上开展工作;
- 测试无误后将分支合并到主分支中,然后推送到线上分支。
例如我们的线上分支是
master
分支,然后项目是实现会员登录功能,此时客户提了一个新的需求,需要用户每次登录的时候都赠送给客户一部分积分。这个时候我们就需要:
- 创建一个分支;
- 在此分支上实现用户登录赠送积分功能;
- 测试通过,切回主分支,然后合并这个分支,最后推送到线上分支;
- 删除此分支。
新建分支
我们以实际实例进行说明。
1 将线上分支clone
下来
先去码云上将我们创建helloGit
项目找到将此项目克隆下来
// git clone [项目地址]
git clone git@gitee.com:zhihua_wei/hello-git.git
2 进入项目查看文件
进入项目查看文件、代码
// 进入项目文件命令
cd hello-git
// 查看文件命令
ls
// 输出文件内容命令
cat README.md
3 创建分支开发登录赠送积分
功能
我们已经将代码从线上克隆下来,并且看到“项目中已经实现了登录功能”;下面我们就要实现登录赠送积分了。
3.1 创建分支
从上面图中可以看到,当前我们是处于master
分支;下面我们就创建dev
分支。
// 创建分支 / 切换到分支dev上
git branch dev
git checkout dev
// 上面两条命令相当于下面一条
// git checkout -b dev
// 查看所有分支
git branch -a
从上图我们可以看出我们已经成功创建了dev
分支,并且我们已经切换到了dev
这个分支上。
3.2 开发登录赠送积分功能
接下来,我们就可以安心的进行开发了,若干时间之后,我们的代码完成了,然后我们将代码贡献提交到项目中。 具体操作如下图
// 查看当前状态
git status
// 提交到本地仓库
git add .
git commit -m "实现赠送积分功能"
// 提交到远程仓库
git push
我们在直接使用git push
是可能会提示远程没有这个分支,如果你想把dev分支提交到远程的dev分支,需要使用
git push --set-upstream origin dev
这样我们就将代码提交到远程仓库dev
分支下了。
3.3 查看各分支代码
我们可以通过切换到不同的分支,查看不同分支下文件的代码都是什么。
从图中我们可以看出master
分支下还是原先的代码,dev
分支下是我们新开发增加功能后的代码。
合并分支
由于我们已经将新增的需求开发测试完毕,现在就需要将分支dev
的代码合并到master
主分支上。
1 进行合并
首先我们需要先将HEAD
切换到指向master
分支上,然后将dev
分支代码合并到master
分支上,最后将代码推送到远程线下。
2 合并异常
有时候合并操作不会如此顺利。我们可能建立了多个分支,如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git
就没法干净的合并它们,在合并它们的时候就会产生合并冲突,如下图例字。
进行合并产生冲突如下图示:
$ git merge dev1
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
此时Git
做了合并,但是没有自动地创建一个新的合并提交。Git
会暂停下来,等待我们去解决合并产生的冲突。你可以在合并冲突后的任意时刻使用git status
命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
任何因包含合并冲突而有待解决的文件,都会以未合并状态标识出来。Git
会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。出现冲突的文件会包含一些特殊区段,看起来像下面图示中这个样子:
这表示HEAD
所指示的版本(也就是你的 master
分支所在的位置,因为你在运行merge
命令的时候已经检出到了这个分支)在这个区段的上半部分(=======
的上半部分),而 dev1
分支所指示的版本在=======
的下半部分。 为了解决冲突,你必须选择使用由=======
分割的两部分中的一个,或者你也可以自行合并这些内容。例如,你可以通过把这段内容换成下面的样子来解决冲突删除其中间进行解决。
3 解决冲突
我们可以直接在master
分支下修改此文件正常后,进行提交即可。
删除分支
我们新增的需求功能已经开发测试完毕,分支也已经进行了合并,故剩余的分支也就没有什么用处了,所以我们需要将分支进行删除。删除分支不光需要将本地的分支删除,也需要将远程仓库中的分支进行删除,这样这个分支才算是彻底删除。
相关命令
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
# 更新远程分支列表
git remote update origin --prune