git-分支管理

查看分支
git branch        查看本地分支
git branch -a    查看本地分支和远程分支
git branch -v    查看本地各个分支及最后一个提交对象的信息
git branch -av    查看本地和远程各个分支及最后一个提交对象的信息    
git branch --merged        筛选出已经与当前分支合并的分支(也就是说哪些分支是当前分支的直接上游。)
git branch --no-merged        筛选出尚未与当前分支合并的分支(Git 1.5.6 以上版本)
创建、切换分支

默认基于当前分支

git branch <BranchName >
git checkout <BranchName >
git checkout -b <BranchName >

指定源分支,git log 与源分支保持一致。

git checkout -b branch-name <srcBranch >
git checkout -b branch-name origin/<srcBranch >
git checkout --track origin/<srcBranch >     与上一个命令作用相同,分支名与远程一致

基于本地分支新建的分支,pull 和 push 不能成功:There is no tracking information for the current branch.
基于远程的,默认关联到了远程分支。
git clone下来的仓库,默认只有master分支,若想要新建与远程其他分支对应的分支,使用第二/三条命令

合并分支

默认Fast forward,合并某分支到当前分支, 正常无冲突合并完成后,查看当前分支log, 看不出来合并过,只是多了一些提交

$ git merge <BranchName>

–no-ff参数,表示禁用Fast forward,查看当前分支log, 可以看出合并过

$ git merge --no-ff -m " " <BranchName> 

生成一条commit log, Merge branch ‘<BranchName>’ into master

冲突情况

手动解决,然后add、commit,手动更改的文件只体现在本分支(master),被合并分支(conflict)内容无变化。conflict merge master 不会再冲突。
本分支log中,当前分支与被合并分支的commit信息按时间排列,最新的是both。解决过后,再去被合并分支merge,无冲突。通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

$ git log --graph --pretty=oneline --abbrev-commit //可以看合并情况
重命名分支

重命名本地

git branch -m oldbranchname newbranchname

重命名远程分支

只能通过先删除远程分支,然后重命名本地分支,再重新提交一个远程分支
删除分支

删除本地

$ git branch -d <BranchName>
$ git branch -D <BranchName> 

有新产生的commit没有在当前分支体现的时候,简单地用 git branch -d 删除该分支会提示错误,因为那样做会丢失数据 D强制删除,git branch –no-merged查看未在当前分支合并的分支。亲手实验结果,branch5 有新的commit之后,合并到branch3,则在branch3下可以执行删除branch5,而在branch2下会提示-D。

删除远程分支

$ git push origin --delete <BranchName>     Git v1.7.0之后
$ git push origin -d <BranchName>
$ git push origin :<BranchName>     Git v1.7.0之前,推送一个空分支到远程分支,其实相当于删除远程分支
远程协作

推送分支到远程

$ git push origin branch-name    把本地分支推送到远程对应分支,如果该远程分支不存在,则会被新建
$ git push -u origin branch-name     基于以上,并且建立关联关系
$ git push origin branch:master    非对应分支推送,本地branch分支推送到远程master分支 <src>:<dst>

建立本地分支和远程分支的关联, 体现在 .git/config文件,可以手动配置

$ git branch --set-upstream branch-name origin/branch-name;

push冲突

解决冲突,commit,push.
你的本地commit信息和远程库最近更新的commit信息都在,分别显示基于共同节点的差异,按时间先后排序。
解决冲突后的commit信息,也在。

详述:

Git把每次提交串成一条时间线,这条时间线就是一个分支。HEAD指向master,master指向提交,所以,HEAD指向的就是当前分支。每次提交,master分支都会向前移动一步,这样,随着不断提交,master分支的线也越来越长。当我们创建新的分支dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并,fast-forward。所以Git合并分支也很快!就改改指针,工作区内容也不变!合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。真是太神奇了,你看得出来有些提交是通过分支完成的吗?

注意到合并成功后的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

    原文作者:mayihetu
    原文地址: https://segmentfault.com/a/1190000013781014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞