git创建与合并分支

这篇具有很好参考价值的文章主要介绍了git创建与合并分支。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建与合并分支

分支管理的概念

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
git创建与合并分支,git,git,github,linux,版本控制,分支管理

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
git创建与合并分支,git,git,github,linux,版本控制,分支管理

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
git创建与合并分支,git,git,github,linux,版本控制,分支管理

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
git创建与合并分支,git,git,github,linux,版本控制,分支管理

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
git创建与合并分支,git,git,github,linux,版本控制,分支管理

实际操作

首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev

然后,用git branch命令查看当前分支:
$ git branch
git创建与合并分支,git,git,github,linux,版本控制,分支管理git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对test.txt做个修改,加上一行:
Creating a new branch is quick.

然后提交:
$ git add test.txt
$ git commit -m “branch test”
现在,dev分支的工作完成,我们就可以切换回master分支:
$ git checkout master
git创建与合并分支,git,git,github,linux,版本控制,分支管理
切换回master分支后,再查看一个test.txt文件,刚才添加的内容不见了!git创建与合并分支,git,git,github,linux,版本控制,分支管理

因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
HEAD


master


┌───┐ ┌───┐ ┌───┐ ┌───┐
│ │───▶│ │───▶│ │───▶│ │
└───┘ └───┘ └───┘ └───┘


dev

现在,我们把dev分支的工作成果合并到master分支上:
$ git merge dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。
git创建与合并分支,git,git,github,linux,版本控制,分支管理

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

解决冲突

准备新的feature1分支,继续我们的新分支开发:
$ git switch -c feature1

修改test.txt最后一行,改为:
Creating a new branch is quick AND simple.

在feature1分支上提交:
$ git add test.txt
$ git commit -m “AND simple”

切换到master分支:
$ git switch master

在master分支上把test.txt文件的最后一行改为:
Creating a new branch is quick & simple.
提交:
$ git add test.txt
$ git commit -m “& simple”

现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
git创建与合并分支,git,git,github,linux,版本控制,分支管理
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
git创建与合并分支,git,git,github,linux,版本控制,分支管理

果然冲突了!Git告诉我们,test.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
$ git status
git创建与合并分支,git,git,github,linux,版本控制,分支管理

我们可以直接查看readme.txt的内容:
$ cat test.txt
git创建与合并分支,git,git,github,linux,版本控制,分支管理
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
$ git add test.txt
$ git commit -m “conflict fixed”
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,master分支和feature1分支变成了下图所示:
git创建与合并分支,git,git,github,linux,版本控制,分支管理
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
git创建与合并分支,git,git,github,linux,版本控制,分支管理
问题:
再次把两个分支合并的时候,提示Already up to date.
因为你不能让一个最新的提交往回合并!
解释:
在master分支下修改并提交后,此时master分支已经指向了修改后的新提交,而feature分支仍指向发生冲突的那次提交。
在master分支下执行 git merge feature,会提示“Already up to date.”
从内容上看,master的提交内容要比feature新;从时间轴上看,master要晚于feature。
解决:
$ git switch feature // 切换到feature分支
$ git merge master // 和master合并
合并成功!此时无论你切换到哪个分支,查看改文件的内容都是一样的。
git创建与合并分支,git,git,github,linux,版本控制,分支管理

小结:
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。

当初将本地仓库推送到远程库时,你应该是直接git push,没有加-u,本地和远程的分支没关联起来。
git push -u origin master
“我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。”

分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

下面我们实战一下–no-ff方式的git merge:

首先,仍然创建并切换dev分支:
$ git switch -c dev
Switched to a new branch ‘dev’
修改readme.txt文件,并提交一个新的commit:
$ git add readme.txt
$ git commit -m “add China”
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,我们切换回master:
$ git switch master

准备合并dev分支,请注意–no-ff参数,表示禁用Fast forward:
(因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去)
$ git merge --no-ff -m “merge with no-ff” dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit
git创建与合并分支,git,git,github,linux,版本控制,分支管理

小结:
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
git创建与合并分支,git,git,github,linux,版本控制,分支管理

Bug分支

软件开发中有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号007的bug的任务时,很自然地,你想创建一个分支issue-007来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
$ git status
git创建与合并分支,git,git,github,linux,版本控制,分支管理

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
$ git checkout master
$ git checkout -b issue-007
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:
$ git add readme.txt
$ git commit -m “fix bug 007”
git创建与合并分支,git,git,github,linux,版本控制,分支管理

修复完成后,切换到master分支,并完成合并,最后删除issue-007分支:
$ git switch master
$ git merge --no-ff -m “merged bug fix 007” issue-007
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,是时候接着回到dev分支干活了!
$ git switch dev
$ git status
git创建与合并分支,git,git,github,linux,版本控制,分支管理

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
$ git stash list
git创建与合并分支,git,git,github,linux,版本控制,分支管理

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
$ git stash pop
git创建与合并分支,git,git,github,linux,版本控制,分支管理

恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0}
删除用:
$ git stash drop stash@{0}

发散思维:
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?
有木有更简单的方法?
有!
同样的bug,要在dev上修复,我们只需要把5560e30 fix bug 007这个提交所做的修改“复制”到dev分支。注意:我们只想复制5560e30 fix bug 007这个提交所做的修改,并不是把整个master分支merge过来。
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git branch
$ git cherry-pick 5560e30

既然可以在master分支上修复bug后,在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复bug,然后在master分支上“重放”行不行?当然可以,不过你仍然需要git stash命令保存现场,才能从dev分支切换到master分支。

Feature分支

软件开发中,总有无穷无尽的新的功能要不断添加进来。
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
现在,你终于接到了一个新任务:开发代号为Vulcan的新功能,该功能计划用于下一代星际飞船。

于是准备开发:
$ git switch -c feature-vulcan
git创建与合并分支,git,git,github,linux,版本控制,分支管理

5分钟后,开发完毕:
$ git add vulcan.py
$ git status
git创建与合并分支,git,git,github,linux,版本控制,分支管理

切回dev,准备合并:
$ git switch dev

一切顺利的话,feature分支和bug分支是类似的,合并,然后删除。

但是!
就在此时,接到上级命令,因经费不足,新功能必须取消!
虽然白干了,但是这个包含机密资料的分支还是必须就地销毁:
$ git branch -d feature-vulcan
此时会error: The branch ‘feature-vulcan’ is not fully merged.
If you are sure you want to delete it, run ‘git branch -D feature-vulcan’.
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。
我们要强行删除:
$ git branch -D feature-vulcan

多人协作

多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

要查看远程库的信息,用git remote:
$ git remote
git创建与合并分支,git,git,github,linux,版本控制,分支管理
用git remote -v可以显示更详细的信息:
$ git remote -v
git创建与合并分支,git,git,github,linux,版本控制,分支管理
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

抓取分支
多人协作时,大家都会往master和dev分支上推送各自的修改。

现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆:
$ git clone git@github.com:songwaimaideyasuo/learngit.git
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看:
$ git branch
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
$ git add env.txt
$ git commit -m “add env”
$ git push origin dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
$ git add env.txt
$ git commit -m “add new env”
$ git push origin dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$ git pull
git创建与合并分支,git,git,github,linux,版本控制,分支管理
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
$ git branch --set-upstream-to=origin/dev dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

再pull:
$ git pull
git创建与合并分支,git,git,github,linux,版本控制,分支管理

这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:
$ git add env.txt
$ git commit -m “fix env conflict”
$ git push origin dev
git创建与合并分支,git,git,github,linux,版本控制,分支管理

小结
因此,多人协作的工作模式通常是这样:
首先,可以试图用$ git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用$ git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用$ git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令$ git branch --set-upstream-to origin/。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。

查看远程库信息,使用$ git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用$ git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用$ git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用$ git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。文章来源地址https://www.toymoban.com/news/detail-734931.html

到了这里,关于git创建与合并分支的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git使用查看分支、创建分支、合并分支

    一、查看分支 查看的git命令如下: 1、查看远程分支 2、查看本地分支 二、创建和切换分支 1、创建新分支 2、切换分支 3、创建分支的同时,切换到该分支上 三、从远程仓库pull(拉取)代码到本地分支 1、指定远程分支,和本地分支 2、如果不写本地分支名称,则默认和远程

    2024年02月08日
    浏览(73)
  • Git切换分支(创建本地分支,远程分支,合并分支代码)

    1 .创建本地分支 2 .本地切换到新创建的分支 对应的远程分支也会切换 3 .查看当前所在分支 4 .删除本地分支(先切换其他分支)(删除本地dev分支) 5 .创建远程分支 6 .删除远程分支 7 .提交代码 8 .分支合并 想合并develop到master 先进入master (可以先git status看看是否有冲突)

    2024年02月12日
    浏览(62)
  • git创建与合并分支

    分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用

    2024年02月06日
    浏览(73)
  • Git 分支操作详解:创建、提交、合并主分支

            Git 是一款强大的分布式版本控制系统,分支是其核心特性之一,为团队协作和项目管理提供了灵活性。本文将介绍 Git 分支的基本用法,包括创建分支、提交更改、合并主分支等操作。 1、 创建分支         在 Git 中,分支是项目开发的不同线路,它们允许团

    2024年02月05日
    浏览(72)
  • Git分支教程:详解分支创建、合并、删除等操作

    Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效。分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作。本篇博客将详解Git分支的创建、合并、删除等操作,帮助你更好地理解和使用Git的分支功能。 在开

    2024年02月14日
    浏览(70)
  • Git 分支教程:详解分支创建、合并、删除等操作

    Git是一种强大的分布式版本控制系统,它的分支功能使得团队协作和代码管理变得更加灵活和高效。分支可以让开发人员在不影响主线开发的情况下进行并行开发和实验性工作。本篇博客将详解Git分支的创建、合并、删除等操作,帮助你更好地理解和使用Git的分支功能。 在开

    2024年02月05日
    浏览(52)
  • git合并指定分支的指定版本到当前分支

    例如:需要将  feature的指定版本合并到develop 通过git log获取到指定版本的SHA值 再根据指定版本创建新分支:git branch new_branch SHA值 切换到develop分支:git checkout develop 将新分支合并到develop分支:git merge new_branch

    2024年02月06日
    浏览(64)
  • Git学习 -- 分支合并、版本修改相关

    目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的使用 参考: https://www.cnblogs.com/michael-xiang/p/131798

    2024年01月24日
    浏览(57)
  • Git 分支简介-创建-合并-解决冲突-删除

    1.在版本控制系统(如Git)中,分支(Branch)是代码库的不同线路或路径,用于同时进行不同的开发工作。分支可以将代码库的状态 ‘‘复制’’ 到一个独立的环境中,使得在这个分支上进行的更改不会影响到其他分支。 2.使用分支的好处是可以同时进行多个并行的开发任务

    2024年03月21日
    浏览(65)
  • git控制台-分支的合并与推送

    博主 DTcode7 带您 溺亖在知识的海洋里,嘿嘿嘿.~ 🐒 个人主页—— DTcode7 的博客 🐒 《微信小程序相关博客》 《Vue相关博客》 《前端开发习惯与小技巧相关博客》 《AIGC相关博客》 《photoshop相关博客》 😚 吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤

    2024年04月17日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包