Remote:远程仓库,或者叫远程分支,一个项目由多个人开发时,远程仓库就是中央代码库。
Repository:本地仓库,顾名思义就是安装在本地的代码库,这也是Git与Svn最大的区别,SVN是集中式管理,每次提交或更新代码前都要连接远程仓库,而Git因为有本地仓库,代码先提交到本地仓库,需要时再更新到远程仓库,也就是说本地代码提交和更新无需连接远程仓库,没网也能提交和更新代码。
Index:索引,这就要谈到上篇笔记中提到的Git的三种状态,当代码由Git托管后,工作区的代码更改后,状态会变成已修改(Eclipse中表现为代码文件上有一个>标记),那么想要提交到本地仓库,必须先将代码提交到暂存区,这个暂存区就是索引,Eclipse中的指令是Add to Index。
WorkSpace:本地工作空间,这个就不多解释了。
下面介绍实际工作中代码的提交与合并,冲突解决。
在你上次更新代码到远程仓库,现在准备写代码之前,先pull下远程仓库的代码,这样可将远程仓库的更改合并到本地代码,这样做的好处是通常无需手动解决冲突,因为之前你已经把本地仓库的更改推送到远程仓库了,远程仓库后面的更改也是在你的代码基础上,而你本地代码并没有更改,所以这种情况下合并是最好最简单的方式。合并代码后再写代码。
当然你也可以省略上面这步,直接写代码,写完代码后add to Index —— commit,将代码提交到本地仓库。
记住这时别急着push到远程仓库,因为在你写代码这段时间可能其他人和你同时修改了一个文件的同一个位置,这时你要再次pull下,查看工作空间的代码有没有红色的双箭头的,如果有那就要手动解决冲突了。
解决完冲突后,再次Add to Index ——Commit,更新到远程仓库前最好还是pull,只到没有出现冲突时,再push代码。
这种方法是最保险的,保证不会影响别人的代码,也不会出错。
总结:记住在推送代码到远程仓库时,记得pull代码,有冲突解决冲突,没冲突直接push.
顺便说下pull和fetch的异同,他们都是更新远程仓库代码到本地的,不同的是fetch完以后还需要merge一下,而pull一个指令包含了fetch和merge两个操作。
然后再说下merge和rebase的异同,他们都是用于合并代码,不同的时rebase操作稍微复杂一些,但更仔细一些,它会将远程文件和本地文件做对比,并标记出冲突的地方,当解决完所有冲突后执行Add to Index操作,然后不要马上执行commit操作,先执行Continue Rebase操作,然后再执行Commit操作。是不是有写麻烦?如果使用merge指令就没有Continue Rebase操作了,但解决冲突就没那么明显了,他自动将远程和本地的代码合并到本地,然后用上图中的形式标记出来。解决完冲突后执行Add to Index ——Commit操作。所以这就看你个人喜好了。
忽略文件 .ignore
在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按照linux的方式来新建.gitignore文件)。
Git忽略规则及.gitignore规则不生效的解决办法
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
**/CVS # 忽略所有文件夹下的CVS文件夹
规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交: