Github命令_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                              //删除本地分支

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

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

 

===============================================================================

关于新建分支: 

这里我试着创建了一个本地分支feature2,远程没有该分支

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

1、首先,如果远程存在一个分支是我们希望使用的,我们需要git fetch就可以了

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

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

 

很多情况下是切换到本地新创建的分支下,直接
git add *
git commit -m "init panda"
git push origin panda
这样就可以在git网页上看到新的panda分支了。

本地新分支更新到远程仓库中:git push origin <NewBranchName>

拉取远程分支到本地分支:git pull <远程主机名> <远程分支名>:<本地分支名>    例如:git pull origin master:wy  ->这条命令可以理解成git fetch+git merge;

==================================================================

有时候git clone 远程库下来,会发现本地不在任何分支上;这时候要输入git checkout -b <本地分支名> origin/远程分支名

来checkout出一个本地分支,并且基于某个远程分支;

git branch -vv 可以查看本地分支是基于那个远程分支的;

实际上git clone是不会创建本地分支的;需要手动创建一个本地分支;

==============================================================

分支产生的背景和意义:

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

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

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

分支的原理(参考廖雪峰的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上面会有分叉很难看;
如何做到没有分叉?

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

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


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

猜你喜欢

转载自www.cnblogs.com/grooovvve/p/12897770.html