Git的branch操作详解与总结

Git教程之分支操作

分支理论

分支 (branch)

在开发软件时,可能有多人同时为同一个软件开发功能或修复BUG,可能存在多个Release版本,并且需要对各个版本进行维护。Git的分支功能可以支持同时进行多个功能的开发和版本管理。

分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。分叉的分支可以合并

在数据库进行最初的提交后, Git会创建一个名为main的分支。因此之后的提交,在切换分支之前都会添加到main分支里。

之前默认是master分支。可以在命令行中进行修改:

git --version    #查看版本
git config --global init.defaultBranch main   #git在2.28.0上,重新设置git默认分支为main

分支的运用

分支 (“Merge分支”和 “Topic分支” ) 的运用规则。

Merge分支

Merge分支是为了可以随时发布release而创建的分支,它还能作为Topic分支的源分支使用。保持分支稳定的状态是很重要的。如果要进行更改,通常先创建Topic分支,最后合并到Merge分支上。通常,大家会将master分支当作Merge分支使用。

Topic分支

Topic分支是为了开发新功能或修复Bug等任务而建立的分支。若要同时进行多个的任务,则创建多个的Topic分支。

分支的切换

若要切换作业的分支,就要进行checkout操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容。checkout之后的提交记录将被追加到目标分支。

HEAD

HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。通过移动HEAD,就可以变更使用的分支。

提交时使用~和^就可以指定某个提交的相对位置。最常用的就是相对于HEAD的位置。

  • HEAD后面加上~可以指定HEAD之前的提交记录。
  • 合并分支会有多个根节点,可以用^来指定使用哪个为根节点。
stash

还未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他的分支时,修改内容会从原来的分支移动到目标分支。但是如果在checkout的目标分支中相同的文件也有修改,checkout会失败的。这时要么先提交修改内容,要么用stash暂时保存修改内容后再checkout。

stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改,应用到原先的分支或其他的分支上

image-20221018193651423

分支的合并

merge或rebase两种方法。

merge
  • 保持修改内容的历史记录,但是历史记录会很复杂。

使用merge可以合并多个历史记录的流程。

fast-forward(快进)合并

合并 bugfix分支到master分支时,如果master分支的状态没有被更改过。

image-20221018215125118

bugfix分支的历史记录包含master分支所有的历史记录,把master分支的位置移动到bugfix的最新分支上,Git 就会合并。

image-20221018215134704

如果设定了non fast-forward选项,即使在能够fast-forward合并的情况下也会生成新的提交并合并。

image-20221018215504016

master分支的历史记录有可能在bugfix分支分叉出去后有新的更新,则修改内容需要汇合起来,master分支的HEAD会移动到该提交上。

image-20221018215337697

rebase
  • 历史记录简单,是在原有提交的基础上将差异内容反映进去。因此,可能导致原本的提交内容无法正常运行。

image-20221018215616379

rebase bugfix分支到master分支, bugfix分支的历史记录会添加在master分支的后面。提交X和Y有可能会发生冲突,所以需要修改各自的提交时发生冲突的部分。

image-20221018215658976

rebase之后,master的HEAD位置不变。因此,要合并master分支和bugfix分支,即是将master的HEAD移动到bugfix的HEAD这里。

image-20221018215725943

一些建议:

  • 在topic分支中更新merge分支的最新代码,请使用rebase。
  • 向merge分支导入topic分支的话,先使用rebase,再使用merge。

A successful Git branching model

image-20221018220914417

来源:a-successful-git-branching-model

  • 主分支

    主分支有两种:master分支和develop分支

    • master
      master分支只负责管理发布的状态。在提交时使用标签记录发布版本号。
    • develop
      develop分支是针对发布的日常开发分支。
  • 特性分支

    特性分支就是前面的topic分支。

    这个分支是针对新功能的开发,在bug修正的时候从develop分支分叉出来的。完成开发后,把分支合并回develop分支后发布。

  • release分支

    release分支是为release做准备的。通常会在分支名称的最前面加上release-。release前需要在这个分支进行最后的调整。

    一般的开发是在develop分支上进行的,到了可以发布的状态时再创建release分支,为release做最后的bug修正。到了可以release的状态时,把release分支合并到master分支,并且在合并提交里添加release版本号的标签。

    要导入在release分支所作的修改,也要合并回develop分支。

  • hotFix分支

    hotFix分支是在发布的产品需要紧急修正时,从master分支创建的分支。通常会在分支名称的最前面加上 hotfix-。

    例如,在develop分支上的开发还不完整时,需要紧急修改。这个时候在develop分支创建可以发布的版本要花许多的时间,所以最好选择从master分支直接创建分支进行修改,然后合并分支。

    修改时创建的hotFix分支要合并回develop分支。

分支实践

创建分支
$ git branch <branchname>

创建名为issue1的分支。

$ git branch issue1
查看当前分支

不指定参数直接执行branch命令。前面有*的就是现在的分支。

$ git branch
  issue1
* master
切换分支

执行checkout命令以切换分支。

$ git checkout <branch>

创建分支并切换

$ git checkout -b <branch>
合并分支

执行merge命令以合并分支。

$ git merge <commit>

该命令将指定分支导入到HEAD指定的分支。先切换master分支,然后把issue1分支导入到master分支。

$ git checkout master
Switched to branch 'master'

已经在issue1分支进行了编辑上一页的档案,所以master分支的myfile.txt的内容没有更改。

$ git merge issue1
Updating 1257027..b2b23c4
Fast-forward
myfile.txt |    1 +
1 files changed, 1 insertions(+), 0 deletions(-)

master分支指向的提交移动到和issue1同样的位置。这个是fast-forward(快进)合并。

删除分支

在branch命令指定-d选项执行,以删除分支。

$ git branch -d <branchname>
用rebase合并

取消刚才的合并

$ git reset --hard HEAD~

rebase合并

$ git rebase <commit>

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

$ git add .
$ git rebase --continue
$ git checkout issue3
$ git rebase master # 以master为基,合并issue3

image-20221018223116343

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

$ git checkout master
$ git merge issue3

image-20221018223146552

比较直接merge的记录

image-20221018223208895

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Git是一种分布式版本控制系统,用于跟踪和管理代码的变更。下面是关于如何操作Git的详细解释: 1. 初始化仓库:使用git init命令在项目目录中初始化一个空的Git仓库。这将创建一个.git目录,用于保存Git的相关信息。 2. 配置用户信息:使用git config命令设置用户的名字和邮箱,这些信息将用于标识代码的提交者。 3. 添加文件:使用git add命令将文件添加到Git的暂存区中。可以通过git add .命令添加所有文件,或者使用git add <文件名>命令添加指定文件。 4. 提交文件:使用git commit命令提交暂存区的文件到Git仓库中。每次提交都需要添加一个简要的提交信息,以便于查看历史记录。 5. 查看状态:使用git status命令查看文件的状态。该命令会显示哪些文件被修改、被暂存或被忽略。 6. 查看历史记录:使用git log命令查看代码的提交历史。可以使用不同的参数来定制显示的格式和范围。 7. 创建分支:使用git branch命令可以创建新的分支。分支可以用于并行开发,每个分支都有自己独立的代码提交历史。 8. 切换分支:使用git checkout命令可以切换到不同的分支。切换分支后,当前工作目录的文件将自动更新为该分支的最新版本。 9. 合并分支:使用git merge命令可以将一个分支的修改合并到当前分支中。合并时需要解决冲突,以确保代码的一致性。 10. 撤销修改:使用git reset命令可以撤销对文件的修改。可以使用不同的参数来恢复到不同的状态。 11. 远程操作:使用git remote命令可以管理远程仓库。可以添加、删除、重命名远程仓库,并对远程仓库进行同步操作。 12. 推送代码:使用git push命令可以将本地的代码推送到远程仓库中。推送需要指定远程仓库的名称和分支的名称。 13. 拉取代码:使用git pull命令可以从远程仓库中拉取最新的代码到本地。拉取需要指定远程仓库的名称和分支的名称。 Git是一个非常强大和灵活的工具,可以支持团队协作和版本管理。以上是Git的基本操作,希望可以帮助你更好地使用Git

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

timerring

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值