git学习心得1---充分掌握fetch,merge,push

来源:互联网 发布:galgame汉化软件 编辑:程序博客网 时间:2024/05/29 13:00

在做的一个项目中需要使用git,由于项目规模较大,需要多人合作,因此要用到git相对较多的功能,顿时发现以往的 单机版的知识是很不够用的,仅仅掌握git add . ,git commit ,git reset,git clone在面对相对复杂的情况之时就会直接懵逼。本来想着按部就班地做,只掌握简单的功能就好,结果由于掌握的太简单,今天直接把工程删光了提交上去了......算是坑了一波队友(虽然明白了以后发现这也没什么大不了的,很容易解决),这也促使我下定决心,必须把git学的透彻一点。

首先,基本概念必须明确,对于你的每一次提交,git都会保存一个快照,每一个涉及数据修改的命令也都会记录在案,因此不管你干了多蠢的事,只要反应及时,别把git库破坏了(一般来讲不会发生,除非你把.git文件删了),都有后悔药可以吃。

然后对于分支必须要了解透彻,分支其实是有一个起始点的,这个起始点很重要,它取决于你创建分支时HEAD指针的位置,如图所示


注意看分支是有一个节点的,分支在刚创建时会拥有那个节点的所有信息,包括之前提交的版本等,而那个节点一般就是创建分支时HEAD指针的位置,每个分支也有自己的指针,一般情况下会位于最新的提交点处,切换分支时HEAD指针就会直接移动到相应分支的指针位置。

之后就是比较关键的部分了,假如小张和小李都在分支new上工作,小李已经从分支new上fetch下来了最新的版本,并和自己的代码merge成功,那么这里就出现了两个必须搞懂的问题:

1.fetch到底是什么

2.什么情况下才能merge成功

对于问题1,简单的说,fetch下来的是分支new上最新的代码,以及这个代码所有的版本记录

对于问题2,分成两种情况,如果小李的代码是在最新的版本之上进行的修改,那么可以直接merge,也即fast-forward

,比如说小李之前拿下new分支上的数据后,没有其他人再push,然后小李进行了两次commit,这种情况是可以直接merge的,merge的结果就是小李最终修改的结果。

第二种情况相对复杂,比如小李在自己本地提交修改的过程中,小张又向服务器push了代码,此时就出现了如下分叉情形:


红色线上的*为小李的修改,绿色线上的*为小张的修改,此时如果想合并,很可能出现冲突,这就需要小李解决冲突后提交结果,需要注意的是,这里究竟如何解决冲突,git是不管的,只要你把代码add and commit,它就会认为冲突解决,合并成功了,之后就可以进行正常开发,或者向服务器push。

从命令的角度来说,需要进行如下命令:

git fetch origin new :temp 从origin服务器上的new分支获取数据到temp分支(一条临时开辟的新分支)

git diff temp 将当前分支和temp分支进行对比

git merge temp将当前分支和temp分支进行合并

此时可能显示有矛盾,应该进入工作区修改有矛盾的文件,解决矛盾

假定矛盾已经解决:

git add * 提交merge结果

git commit -m 解决冲突,.....

git push 将分支提交到默认服务器与当前分支对应的追踪分支


时间有限,下一篇讲利用git中的后悔药来挽回自己干的各种蠢事。