虚拟项目学习git/github原理与基本操作9

来源:互联网 发布:电影天堂软件数据为空 编辑:程序博客网 时间:2024/06/08 05:24

继续在原来的项目的基础上继续推进,我们在原来合并了master和featurex1的基础上,继续推进两步master分支。


然后我们推进featurex1分支两步。

这个时候featurex1分支的分支图如图所示:



然后,我们想把featurex1的内容合并到master分支中,假设已经测试通过了所有的featurex1分支中的内容。

watkins@watkins:~/watkins/finance$ git merge featurex1 Merge made by the 'recursive' strategy. funciton3 |    2 ++ 1 file changed, 2 insertions(+)watkins@watkins:~/watkins/finance$ 

这次没有出现fast-forward,因为两个分支的快照不存在谁是谁的父节点的情况了,而是分析两个分支的共同的父节点,创建新的快照。

这个时候我们的分支图如图所示:



的开发历史是从更早的地方开始分叉的。由于当前 master 分支所指向的 commit (C4)并非想要并入分支(iss53)的直接祖先,Git 不得不进行一些处理。就此例而言,Git 会用两个分支的末端(C4 和 C5)和它们的共同祖先(C2)进行一次简单的三方合并计算



两个分支的开发过程中,可能同时修改了同一个文件,所以有的时候这种情况合并分支会存在冲突,需要手动的解决这些冲突以后才能进行合并。

冲突的合并

有时候合并操作并不会如此顺利。如果你修改了两个待合并分支里同一个文件的同一部分,Git 就无法干净地把两者合到一起(译注:逻辑上说,这种问题只能由人来解决)。如果你在解决问题 #53 的过程中修改了hotfix 中修改的部分,将得到类似下面的结果:

$ git merge iss53Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.

Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status 查阅:

[master*]$ git statusindex.html: needs merge# On branch master# Changed but not updated:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." to discard changes in working directory)##unmerged:   index.html#

任何包含未解决冲突的文件都会以未合并(unmerged)状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:

<<<<<<< HEAD:index.html<div id="footer">contact : email.support@github.com</div>=======<div id="footer">  please contact us at support@github.com</div>>>>>>>> iss53:index.html

可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时检出的分支)中的内容,下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:

<div id="footer">please contact us at email.support@github.com</div>

这个解决方案各采纳了两个分支中的一部分内容,而且我还删除了 <<<<<<<=======,和>>>>>>> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决(resolved)。因为一旦暂存,就表示冲突已经解决。如果你想用一个有图形界面的工具来解决这些问题,不妨运行 git mergetool,它会调用一个可视化的合并工具并引导你解决所有冲突:

$ git mergetoolmerge tool candidates: kdiff3 tkdiff xxdiff meld gvimdiff opendiff emerge vimdiffMerging the files: index.htmlNormal merge conflict for 'index.html':  {local}: modified  {remote}: modifiedHit return to start merge resolution tool (opendiff):

如果不想用默认的合并工具(Git 为我默认选择了 opendiff,因为我在 Mac 上运行了该命令),你可以在上方”merge tool candidates(候选合并工具)”里找到可用的合并工具列表,输入你想用的工具名。我们将在第七章讨论怎样改变环境中的默认值。

退出合并工具以后,Git 会询问你合并是否成功。如果回答是,它会为你把相关文件暂存起来,以表明状态为已解决。

再运行一次 git status 来确认所有冲突都已解决:

$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." to unstage)##modified:   index.html#

如果觉得满意了,并且确认所有冲突都已解决,也就是进入了缓存区,就可以用 git commit 来完成这次合并提交。提交的记录差不多是这样:

Merge branch 'iss53'Conflicts:  index.html## It looks like you may be committing a MERGE.# If this is not correct, please remove the file# .git/MERGE_HEAD# and try again.#

如果想给将来看这次合并的人一些方便,可以修改该信息,提供更多合并细节。比如你都作了哪些改动,以及这么做的原因。有时候裁决冲突的理由并不直接或明显,有必要略加注解。

分支管理

到目前为止,你已经学会了如何创建、合并和删除分支。除此之外,我们还需要学习如何管理分支,在日后的常规工作中会经常用到下面介绍的管理命令。

git branch 命令不仅仅能创建和删除分支,如果不加任何参数,它会给出当前所有分支的清单:

$ git branch  iss53* master  testing

注意看 master 分支前的 * 字符:它表示当前所在的分支。也就是说,如果现在提交更新,master 分支将随着开发进度前移。若要查看各个分支最后一次 commit 信息,运行 git branch -v

$ git branch -v  iss53   93b412c fix javascript issue* master  7a98805 Merge branch 'iss53'  testing 782fd34 add scott to the author list in the readmes

原创粉丝点击