[git]git分支(branch)的基本使用

TonyYPZhang TonyYPZhang     2022-08-19     177

关键词:

分支( branches ) 是指在开发主线中分离出来,做进一步开发而不影响到原来主线。

Git 存储的不是一系列的更改集( changeset ),而是一系列快照。当你执行一次 commit 时, Git 存储一个 commit 对象,它包含一个指针指向你当前需要提交的内容的快照。

Git 中的 master 分支的功能,和其他分支一样。master 在 git 项目中常见到,是因为 git init 命令运行时默认创建一个分支,并命名为 master。

创建一个新的分支,就是创建一个新的指针,用来在快照间移动。Git 通过 HEAD 指针,指向当前工作的本地分支。

$ git branch testing

 

使用 git checkcout 命令,可以切换分支。

$ git checkout testing

 

修改文件并 commit 代码后,会移动分支的指针

$ vim test.rb
$ git commit -a -m 'update test.rb'

通过 checkout 可以切换回去 master 分支。下面的命令做了两件事,一是把 HEAD 指针指向了 master 分支,二是当前工作目录的文件恢复到了 master 所指向的快照版本。也就是说 87ab2 提交的变动,在切换到 master 分支时被移除。

$ git checkout master

 

再做一些变更和 commit 。注意,此时历史记录开始出现分叉。

$ vim test.rb
$ git commit -a -m 'make other changes'

Git 中的分支,实际上是一个简单的包含 40 个字符的文件,这 40 个字符是一次提交所产生的 SHA-1 checksum。所以,在 Git 中创建和销毁一个分支的成本非常低。这个和其他大多数版本管理系统比起来,Git 无需拷贝整个项目的文件,是一个巨大的不同点。

 

基本的分支与合并

下面的例子是一个比较常见的场景,应用了分支与合并的功能。

  1. 在开发一个网站
  2. 创建一个分支 ( iss53 ),用于处理新的项目需求( user story )
  3. 在这个分支上,做了一些工作

这时,接收到另一个紧急的问题,需要立刻修复( hotfix )

  4. 切换到生产环境分支

  5. 创建一个新的分支 ( hotfix ),用于修复线上问题

  6. 测试过后,把修复分支合并到主分支上,并推送到生产环境 

  7. 切换到原来的需求分支,继续工作

最开始的状态如下

通过 branch / checkout / commit 等操作,做到上面的第 5 步, 状态如下

接下来,先合并 hotfix 分支,然后部署到线上环境。

$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
 index.html | 2 ++
 1 file changed, 2 insertions(+)

上面的提示中,有 Fast-forward 字眼,表明 hotfix 分支指向的 c4 提交,是 master 分支指向的 c3 提交的祖先,因此,直接把 master 移动到 c4 即可。合并后效果关系如下

由于 hotfix 已经合并到 master 分支,此时 master 和 hotfix 指向同一个地方,后续不在需要用到 hotfix 分支,所以可以删除。

$ git branch -d hotfix

下来了可以切换到 iss53 分支继续工作,继续修改,然后提交。当修改完毕后,关系大致如下

$ git checkout iss53
Switched to branch "iss53"
$ vim index.html
$ git commit -a -m 'finished the new footer [issue 53]'
[iss53 ad82d7a] finished the new footer [issue 53]
1 file changed, 1 insertion(+)

 

接下来开始合并。

$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

这里合并没有了 Fast-forward 字眼,因为不是简单的移动分支指针。Git 采用三路合并( three-way merge ) 方式进行合并,创建了一个 commit ( c6 ),用于包含合并后的结果。三路合并方式,是指通过两个分支的最新提交( c4 和 c5 ),以及他们的共同祖先 c2,来进行分支合并。c6 是一个合并提交记录,特别之处是有两个祖先。 

此时,你已不在需要 iss53 分支,可以删除它.

$ git branch -d iss53

 

基本合并冲突处理

如果两个分支修改同一个文件的同一个部分,例如同一行代码,Git 不知道如何合并,认为这是一个冲突。例如你在 iss53 和 hotfix 分支都修改了 index.html 文件的同一个部分,合并 iss53 到已包含 hotfix 的 master 分支时,效果如下

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

此时,自动合并暂停,需要手动合并。 git status 显示冲突了的文件

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

Git 在冲突的文件中添加标准的冲突解决标识。

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

这个表明,HEAD 版本的代码是 ======= 以上部分,iss53 的版本是 ======= 以下部分。

开打 index.html 文件,修改成自己想要的版本,并剔除 <<<<<<< ======= >>>>>>> 标识,然后用 git add 标识冲突已接近,然后git commit 提交解决冲突后的版本。

 

参考资料

3.1 Branches in a Nutshell, git-scm

3.2 Basic Branching and Merging, git-scm

 

git基本使用

...减少gitadd步骤)gitpushoriginbranch#将本地仓库文件推送到远程分支(只是将本地branch分支的文件,提交到branch上,不一定提交你当前的分支)gitpulloriginbranch#从远程分支拉取最新文件gitmergebranch#将branch分支合并到当前分支gitbranchname#在本地... 查看详情

git的一些基本命令汇总

#新建一个分支,但依然停留在当前分支gitbranch[branch-name]#新建一个分支,并切换到该分支gitcheckout-b[branch]#合并指定分支到当前分支$gitmerge[branch]#新建一个分支,但依然停留在当前分支gitbranch[branch-name]#新建一个分支&#x... 查看详情

git分支管理

创建分支gitbranch<local_branch_name>创建并切换到新的分支上gitcheckout-b<local_branch_name>切换分支gitcheckout<local_branch_name>合并分支gitmerge<local_branch_name>merge的使用,合并是合并的两个分支,如果想把B_branch合并到A 查看详情

git怎么推送本地分支到远程新分支上面去

..._branch:remote_branch这个操作,local_branch必须为你本地存在的分支,remote_branch为远程分支,如果remote_branch不存在则会自动创建分支。类似,gitpushorigin:remote_branch,local_branch留空的话则是删除远程remote_branch分支。参考技术A命令:gitpu... 查看详情

git的分支

gitbranch:gitbranch -r #查看远程分支gitbranch-a #查看本地分支和远程分支gitbranch -v #查看本地库的所有分支git branch--merged #查看那些分支已经被合并到当前分支以及那些没有合并到当前分支git branch--No--mer... 查看详情

git创建分支

添加新分支login,在login分支中开发当前项目vue_shop:打开vue_shop终端,使用git status确定当前项目状态。确定当前工作目录是干净的之后,创建一个分支进行开发,开发完毕之后将其合并到mastergit checkout -b login然后... 查看详情

git的branch操作详解

Git教程之分支操作分支理论分支(branch)在开发软件时,可能有多人同时为同一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。Git的分支功能可以支持同时进行多个功能的开发和版本管理。分支... 查看详情

git使用02--branch分支,tag版本,忽略文件.gitingore(代码片段)

一.分支#查看分支gitbranch#创建分支gitbranch分支名#切换分支gitcheckoutname#创建并切换分支gitcheckout-bname#删除分支gitbranch-d删除分支#创建dev分支并以线上的为蓝本gitbranchdevorigin/devgitcheckoutdev创建成功后切换到dev#在要合并到的分支上做... 查看详情

git分支操作

分支branch是Git使用中经常用到的,多人写作开发的利器~查看分支 $gitbranch#列出本地已有的branch列表 创建分支    创建新分支默认以当前分支的内容来创建,简单理解为:把你当前分支的内容copy一份,以dev01命名.$gitb... 查看详情

git分支管理

Git分支管理几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。有人把Git的分支模型称为"必杀技特性",而正是因为它,将Git从版本控制系... 查看详情

git常用命令备忘

一.分支相关1.基本命令#列出所有本地分支$gitbranch #列出所有远程分支$gitbranch-r #列出所有本地分支和远程分支$gitbranch-a #新建一个分支,但依然停留在当前分支$gitbranch[branch-name] #新建一个分支,并切换到该分支$git... 查看详情

Git Branch 仅在 GitHub Actions 中拉取 Master 分支

】GitBranch仅在GitHubActions中拉取Master分支【英文标题】:GitBranchonlypullsMasterBranchinGitHubActions【发布时间】:2022-01-0802:48:46【问题描述】:我正在使用GitHub操作,我正在尝试获取合并到master中的最后一个分支并使用该分支。我目前... 查看详情

git-推送分支

...branch 备注:此命令中,local_branch必须为你本地存在的分支,remote_branch为远程分支,如果remote_branch不存在则会自动创建分支;类似,gitpushorigin:remote_branch,local_branch留空的话则是删除远程remote_br 查看详情

git中在哪个branch打tag有关系吗

其实要取得不同的branch的tag,只需要在相应的分支上打tag就行了。这样的tag就唯一对应了不同的分支。例如,你在master上打了tag为v1,在某个branch上打了tag为v2,则你取出v2代码的时候,自然就是对应的branch分支了。参考技术A没... 查看详情

git的简单使用(代码片段)

...branch-name>推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用gitpull试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用gitpushorigin<branch-name>推送就能成功!... 查看详情

git删除分支/恢复分支(代码片段)

Git删除分支/恢复分支 ?删除一个已被终止的分支如果需要删除的分支不是当前正在打开的分支,使用branch-d直接删除gitbranch-d<branch_name>? 删除一个正打开的分支如果我们在试图删除一个分支时自己还没转移到另外的分... 查看详情

使用git和github进行协同开发流程

目录前言仓库(Repository)源仓库开发者仓库分支(Branch)永久性分支暂时性分支工作流(workflow)总结参考资料前言(本文假设各位已经对基本git的基本概念、操作有一定的理解,如无相关git知识,可以参考ProGit这本书进行相关... 查看详情

git分支(branch)详细讲解(代码片段)

git分支正常情况下,如果想要一个脱离主线的分支来开发项目,常常需要完全创建一个源代码目录的副本,对大项目来说,这样的过程会耗费很多时间,所以这是一个比较低效的做法。但是git分支则不同,你会发现使用分支和合... 查看详情