程序项目的分支
开发程序项目过程中,我们可能需要从原来的程序项目中分出另一个项目来修改,这个操作成为branch。
在Git文档库中创建分支需要使用"git branch"指令
在切换分支的时候,Git会先对比文档库中当前分支的文件内容是否和将要切换过去的分支文件相同。针对不同文件,Git需要从文档库中取出该文件,这是为了让文件夹中的文件符合分支原来的状态。但是为了避免数据意识,当Git要覆盖文件夹中的文件时,会检测该文件的内容是否已经加入文档库。如果还没有加入,Git会显示警告信息,并且停止执行,以免资料遗失 。如果确定不想保留这些已经修改,却还没有加入文档库的文件,可以换成执行"git checkout -f+分支名",Git就会强制覆盖修改后的文件。
除了被tracked的文件以外,对于untracked和ignored的文件,Git都不会进行任何处理。
补充说明:虽然Git切换分支之后,会‘尽可能’让文件夹中的文件恢复成原来该分支的状态,但是并不能保证一模一样。例如当前分支和即将切换过去的分支都有文件A,而且内容完全一样。但是我们再当前的分支中修改了文件A,却没有commit。这时候切换分支的时候,Git对比文档库中两个分支的文件A是相同的,所以不会从文档库中取出文件A,结果切换分支之后,文件A就不会回到原来的状态。这种错误的起因有一部分是操作上的瑕疵,因为在一班情况下,在切换分支之前,会先把最新的文件内容存入文档库,这样就不会发生这样的问题。所以在切换分支之前要先status检查一下是否一致。如果不一致,就需要做适当的处理,或者直接执行“git checkout .”用文档库中的文件覆盖文件夹中的文件。
合并程序项目的分支
在大多数情况下,程序项目的分支都会被合并到主要的分支。除非想要将该分支独立出来,成为另一个项目。合并分支需要使用"git merge"指令,格式如下:
git merge <branch-name>
这个指令会把指定的分支,合并到当前工作中的分支。
假如我们需要合并分支A和分支B,执行以下指令。
git checkout A
git merge B
如果换成
git checkout B
git merge A
两者的区别是什么呢?假设我们有branch-1和branch-2两个分支
我们切换到branch-1再合并branch-2
我们可以看见,最后的时间节点为branch-1的。
接下来,我们回滚到未合并之前,
git reset --hard HEAD^
切换到branch-2,再合并branch-1。
用merge合并的方法,我们现在只有两个分支看起来就比较复杂了,如果分支更多,我们可能很难看懂。我们需要更简洁的合并方法'git rabase'。
git rebase //命令在另一个分支基础之上重新应用,用于把一个分支的修改合并到当前分支。
那么我们重新把branch-2应用到branch-1中:
git rebase branch-2
这样的结构看起起来是不是清晰了很多
解决合并冲突
在我们工作的时候,如果两个人共同做一个项目就有可能发生冲突,什么时候会发生冲突呢?我们还以上面的分支为例,我会尽可能用大家熟悉的例子来讲解。
现在我们已经把branch-2合并到branch-1中了,那么我们的branch-1跟branch-2中都有“branch-2.txt”文件,我们同时修改这个文件;
好了,我们开始在branch-1中合并branch-2
我们的冲突出现了,并且在branch-2.txt中,那么我们看一下,branch-2.txt现在的样子吧?
在HEAD那个区域是我们工作的分支,在====下面的是我们将要合并的分支内容,接下来我们需要对这段文字进行处理,哪些使我们需要的,不需要的我们删掉。假如我需要保存两次修改:
然后再重新提交到远程就ok了。
提示:
如果合并的过程中发生了冲突,我们想要放弃这次合并,可执行“git merge --abort”指令。Git文档库和文件夹中的文件内容都会恢复到未执行合并前的状态。