Git命令_git branch、分支与冲突

git branch -a //查看所有分支(包括所有项目)

git branch -r //查看远程项目的分支

git branch   //查看的是本地分支

git checkout [branch_name]   //切换到branch_name分支,也可以切到某个commit上

git checkout -b new_branch   //创建新分支new_branch,并切换到上面,后面再加参数用于指定基于哪个分支,不加的话默认基于当前分支;

git branch --set-upstream-to=origin/remote_branch your_branch  //本地创建一个新分支后,需要与已经存在的远程分支进行关联,这条命令是手动建立跟踪关系

git merge branchname                                      //将branchname分支合并到当前分支;

git push origin --delete branch_name               //删除远程分支,origin是远程某个仓库地址的一个名称,或者叫标签,方便指向该远程仓库

git branch -d branch_name                              //删除本地分支

 

绿色代表当前项目所在的分支,红色就是远程分支列表。

// *表示当前所处的分支,白色的是本地分支
// origin是指远程的某个仓库地址
/ /HEAD 远程的HEAD,HEAD是指向当前commit的引用,默认情况下HEAD指向某个分支,而某个分支永远指向该分支的最新的commit
// 每次提交一个新的commit时,都会从当前commit向前移动
// branch永远指向当前分支地最新一次commit

 


关于新建一个远程分支,新建本地分支,本地分支如何关联远程分支的方法: 

场景1:我想创建一个远程分支

这里我试着创建了一个本地分支feature2,但远程没有该分支的同名分支origin/feature2

输入git branch --set-upstream-to=origin/feature2  feature2之后出现如下hint;

1、首先,如果远程存在一个分支是我们希望使用的,我们需要git fetch就可以了,ps:实际上此时远程不存在feature2分支;

2、第二个方法可以使用git push -u 的方法把本地的这个新分支强推到远程去,远程也就有了一个一模一样的分支了;

 

试着做一下第二个hint中的操作,之后再输入git branch -a查看一下远程分支列表,可以看到远程确实多了一个分支;

 

 至此我们创建了一个本地分支的同时也创建了一个新的远程分支,该远程分支与新建的本地分支同名,并且二者建立的跟踪关系,或者叫关联关系。

 

 

场景2:如果已经有一个远程分支存在,我想创建一个本地分支与该远程分支建立跟踪关系

方法1:

拉取远程分支到本地分支git pull <远程主机名> <远程分支名>:<本地分支名>    例如:git pull origin master:wy

这样的话可以新建一个本地之前不存在wy分支,是基于某个远程分支的;但是这个分支跟该远程分支没有自动进行关联(或者叫跟踪关系),实际上新建了一个基于远程分支的本地分支,但是没有跟踪关系,之后还需要手动设置跟踪关系:git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>。

这种方式的话,可以使得本地分支和远程分支的名字不一定要一样,比较灵活。

 

方法2:

git checkout -b  <新分支名> <远程主机名/远程分支名>

这条命令会本地新建一个本地分支是基于某个远程分支,并且会自动建立跟踪关系。

 

另外还可以这样:

git checkout --track <远程主机名/远程分支名>

这会自动创建一个本地分支与远程分支同名,且自动建立跟踪关系。



有时候git clone远程库下来,会发现本地没有分支;这时候要输入git checkout -b <本地分支名> <远程主机名/远程分支名>

这样会新建一个本地分支(-b参数的作用),该本地分支<本地分支名>基于 <远程主机名/远程分支名>且建立了跟踪关系 ,并且把当前分支自动切到这个新建的本地分支上;

git branch -vv 可以查看本地分支与远程分支的跟踪关系;

有时候发现git clone命令是不会创建本地分支的;需要手动创建一个本地分支来跟踪远程分支;



 本地分支和远程分支的跟踪关系建立:

Git:本地分支和远程分支建立追踪关系的三种方式:https://blog.csdn.net/qq_42780289/article/details/97762596

跟踪远程分支:https://www.cnblogs.com/wuer888/p/7656730.html

 

主要的三种方法:

手动建立追踪关系:git branch --set-upstream-to=<远程主机名>/<远程分支名> <本地分支名>

push时建立追踪关系: git push -u <远程主机名> <本地分支名>    加上-u参数,这样push时,本地当前分支就和远程主机的同名分支建立追踪关系。

新建分支时建立跟踪关系:git checkout -b <本地分支名> <远程主机名>/<远程分支名>,新分支指针指向 <远程主机名>/<远程分支名> 所指的位置。具体位置可用 git log --oneline --graph 查看。

 

查看追踪关系:

GIT如何查看本地分支与远程分支的关联配置https://blog.csdn.net/kingjin_csdn_/article/details/93111111

主要的三条命令:

git branch -vv

git remote show origin

cat .git/config

 

Git 清理无效的远程追踪分支:https://www.jianshu.com/p/884ff6252be5

远程版本库创建了一个分支后,在本地可以使用git remote update 用于在本地创建远程追踪分支。

但是,如果在远程版本库上删除了某一分支,该命令并不会删除本地的远程追踪分支,

这时候,有另一个命令git remote prune

该命令可以删除本地版本库上那些失效的远程追踪分支,具体用法是,假如你的远程版本库名是 origin,则使用如下命令先查看哪些分支需要清理:

git remote prune origin --dry-run

再输入:

git remote prune origin

就可以删除无效的本地跟踪远程分支了。

 

甚至命令可以结合起来使用:

git remote update origin --prune

git remote update origin -p

 


分支产生的背景和意义:

举个例子,准备开发一个新功能,需要两周时间,如果活还没干完,不完整的代码库会导致别人没法干活;如果一次性全部写完再一次提交,又存在丢失每天进度的风险;

现在有了分支,就不用怕了,先创建一个分支,别人看不到,还可以在原来分支上正常工作;而你再自己的分支上干活,想提交就提交;

当自己完成了开发,就可以一次性合并到原来的分支上,又安全又不影响别人工作;

 

分支的原理(参考廖雪峰的Git教程):

  每一次提交,Git都把他们串成一条时间线

  HEAD 指向当前分支;

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

  创建一个新的分支,例如dev,即增加了一个dev指针,修改HEAD的指向,指向dev。即完成分支的创建,工作区文件没有任何变化;

  在dev上的工作结束之后,就可以把dev和master合并,最简单的方法,直接把master指向dev的当前提交,就完成了合并,HEAD指向master;

  合并完分支后,甚至可以直接删除dev分支。删除分支dev就是把dev指针给删掉,这样就剩下了一条master分支;

 

分支管理策略:

master分支应该是十分稳定的,仅用来发布新版本;

dev分支是不稳定的用来干活的;

多人合作时,每个人都再dev分支上干活,每个人都有自己的分支,是不是往dev分支上合并即可;

 

分支管理和分支的意义:
一般主分支是用来发布版本的;
本地拉一些子分支,是不稳定的分支,是用来干活添加新功能的;
然后功能添加完成之后,合并到主分支当中;
如果这个因为新功能而拉的子分支只有你一个人开发,那么用本地的分支即可
如果这个子分支有很多人一起开发,那么就要推送到远程,大家一起开发
创建远程分支(本地分支push到远程):$ git push origin [name]

 

分支切换:
未commit的内容:缓存区/工作区
如果你切换分支的话,没有commit的内容不受切换分支影响的;
但是commit的内容是收到切换分支影响会发生改变。
只会显示当前分支commit的内容,而不会显示切换那个分支commit的内容;

 


谈谈merge:
master分支,feature1分支;
当前在master分支上,merge feature1分支;
那么master分支上会有两个分支的内容;但是feature1分支依然存在;
合并到哪个分支,这个分支有两个分支所有的内容。另外一个分支不变;
合并分支只是把当前分支和合并过来的的分支里面的不一样的内容合并过来。
但是当前分支本来和被合并的分支不一样的内容还会存在。

 

merge冲突:
开新分支,合并该新分支时出现merge冲突了;
那就手动修改冲突的文件和位置;重新merge;
出现冲突:解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

 

还有一种merge冲突,远程分支发生了commit,本地也commit。但是修改的是同一行;
这样再fetch+merge或者pull的时候就会发生冲突;或者直接push的话也会发生冲突;
反正都是merge冲突;
而且解决这个冲突之后,git log --graph上面会有分叉很难看;
如何做到没有分叉?//使用rebase

 

push冲突://远程分支发生了更新,本地分支提交前要保证是最新的才行;所以本地要先更新再push才行;甚至更新时会发生冲突,就是上面这个情况;
推送前要fetch+merge一下;//但是每次merge会产生一个分叉,在本地仓库的日志里;
然后再push;

 

本地在新分支上开发代码,如果多次commit的话,以后合并进主分支时会有很多次commit,很难看而且不方便查阅;
这就可以尝试在合并分支时,将要被合并的分支中的多个commit合并成一个commit使用-amend参数

 

Git 分支管理&查看历史&标签:https://www.jianshu.com/p/97f94e94418e



 

posted @ 2020-05-16 01:02  Grooovvve  阅读(1886)  评论(0编辑  收藏  举报