git merge
一 简单的git merge操作
git fetch和git merge相当于git pull,我们可以通过intellij的VCS来merge,也可以通过命令行来merge
1.通过工具直接操作:
如果是用intellij,可以选择VCS->Git->Merge Changes
这里的current branch就是当前分支,branch to merge就是要合并的分支。
2.使用命令行
如果要把b分支merge到a分支,那么需要:
git checkout a //将当前的branch切换到a
git merge b //将b merge到a
git branch -d b //将b分支删除
当用git merge 进行合并(merge)的时候,你只是指定了要合并到当前分支的那个并入分支,以及当前分支的当前进展。
二 项目中的实际流程
实际工作中你可能经历以下步骤:
1.为了实现系统的新需求,你要创建一个新分支
2.突然发现主分支上有bug,你要新建一个分支来解决这个bug
3.分支上的bug解决后,你要切换到主分支合并bug分支
4.切换到最初的分支上,继续工作
1.加入你正在自己的项目上,并且该项目已经有了一些提交,提交版本如下,并且当前版本在c2上
2.为了解决#53问题,需要新建一个分支并切到该分支上:
git checkout -b iss53
3.iss53分支不断推进,并有紧急问题出现
对iss53问题进行了一些提交,分支在不断的向前推进
此时你收到消息,有个其他问题也要解决,你不必将这个紧急问题与iss53的修改混在一起,你只需要切回master分支
git checkout master
注意:当你切换分支的时候,git会重置你的目录,使其看起来像是回到了你在那个分支上最后一次提交的样子。Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。
为了修复这个紧急问题,你需要再建一个分支,直到问题解决
git checkout -b hotfix
4.基于master分支的紧急问题分支hotfix branch
运行测试,以确保自己的修改时正确的,合并到master上。
git checkout master
git merge hotfix
注意:你可能会在合并结果中看到"快进"(fast-forward)。由于当前 master 分支所指向的提交是你当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
现在,最新的修改已经在 master 分支所指向的提交快照中,你可以着手发布该修复了。
5.master被快进到hotfix
由于被紧急问题打断,现在你需要回到之前的工作,可以删除掉hotfix分支
git branch -d hotfix
切换到之前的分支继续工作
git checkout iss53
此时如果你想要拉去之前hotfix的修改,你可以使用git merge master命令将master分支合并到iss53中;或者将iss53完成后,将其合并到master分支上。
6.将iss53合并到master上
git checkout master
git merge iss53
注意,虽然命令行和之前合并hotfix时是一样的,但是结果看起来不一样
因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
7.删除iss53分支
git branch -d iss53
merge时有冲突
如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。
git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件,找到这些文件,手动解决冲突就可以git commit来完成合并提交了