以前一般用CVS或者SVN等集中式版本控制系统,现在使用git分布式版本控制系统。集中式版本控制系统需要有一台中央服务器,工作时到中央服务器下载代码,工作完就推送到中央服务器。而且这需要联网,一旦没有网络则会导致无法工作。而git是分布式版本控制系统,每人的电脑上都有一个完整的代码库。联网只是为电脑之间交换修改提供了方便。因此,需要一台中央服务器,为大家提供交换方便。没有这台“中央服务器”,大家一样能进行工作。

工作区,即文件目录里的目录文件。缓存区(暂存区),即git与其他版本控制系统的区别。git add将文件提交到缓存区,git commit将文件提交到工作区。一次提交是把缓存区里的所有文件放到工作区。此外,工作区里还有一个隐藏目录.git。用于存放版本库,以及一个master主干,和指向master的HEAD。相当于工作区新添加的文件,然后add到stage里,然后commit到master。HEAD指针指向master。

只要没有把代码推送到远程代码库,所有的修改都可以通过git reset 或git checkout来回退到想要的版本。 1)、如果只是在工作区进行了修改,没有提交到暂存区stage,可以使用git checkout – file。注意–千万不能省略,不然会变成切换到另一分支的命令。 2)、如果不仅修改了,还提交到了缓存区,那么先用git reset HEAD file 回到1,再用git checkout – file。 3)、如果你修改了,还commit了,那可以采用git reset –hard commit_id。

删除文件也是一种修改。可以从文件管理器修改,也可以从git里删除。但是删除前请确保版本库里有文件,这样即使你误删了,依然可以退回到以前的版本。git checkout – file 本质上是将版本库里的文件与工作区里的文件进行交换。但是回复只能回复到最新版本,而之前的修改无法看到。

git默认建立了一个master分支,HEAD指针不是指向提交,而是指向master,master指向提交。每次提交,master分支都会向前移动一步,这样不断提交,master主分支就会越来越长。

git中相比其他集中式版本管理系统而言,创建分支删除分支很快。因为仅仅需要设置上删除指针即可。不涉及文件的修改,可以再把分支合并到主分支后,再删除分支,其实只是删除了指针。并没有涉及文件。合并只需要把原先指向dev分支的指针再转移到master指针即可。在自己分支上做的修改不会同步到master上,切换到master后,不会看到他的改变。

通常我们先把任务代码clone到本地仓库,然后创建自己的分支,在自己分支上进行修改。改了之后,再merge合并,合并完再删除分支。在多人协同时,我们可以随时创建自己的分支进行修改,随时上传到origin代码库。这样避免耽误进度,避免自己做完才上传。正在使用分支时,不能删除分支。

fast forword快速融合会丢失分支合并信息,而git merge –no-ff -m “off fast forword” dev 表示禁用快速融合,即普通融合方式。这种方式可以保留分支的历史信息。在实际开发中,master是相对稳定的,一般用来发布新版本的。各个协同人员需要创建自己的分支,在自己的分支上进行开发。然后随时进行创建和合并。以保持团队的进度。注意,一定要加上–no-ff,变成普通融合提交模式。融合最好切换到master主分支再融合,再删除。如果在dev分支融合,很有可能会提示没有merge。

如果master和dev都提交commit那么会冲突,通常是master不变,dev变化,再merge融合,融合后再commit。这样可以避免冲突。如果发生冲突,应该先解决冲突conflict再融合,再commit。所谓创建分支,实际上是当前的代码的一个副本,代码完全一样。只是,在分支上的改变,不融合的话,无法再master上看到。通常是在dev分支上把任务做完了,add、commit后,再把最终版本merge到master上去。合并后再删除dev,最终团队所有成员都在各自的分支上完成任务后,再融合merge到master上进行调试发布。

commit和merge时必须写-m说明,如果不写有可能有bug。此外,每一个新feature都最好创建一个分支,分支add、commit后再进行合并融合删除。如果当前分支没有进行融合,那么删除会提示风险,这是用git branch -D name 强行删除。

将分支储存在stash里,用时通过git stash list 进行查看,然后进行恢复。1、先git stash apply,然后再删除stash里的内容。2、直接git stash pop恢复的同时删除了stash里的内容。

分支推送,一般master分支需要与远程仓库时刻保持一致。dev分支是团队人员自己的开发分支,必须与远程相关。bug分支,一般不推送,除非领导要看你一周修复了多少个bug。feature分支,一般看是否有伙伴协同工作。如果有,那么需要推送。git remote可查看origin仓库信息,git remote -v可查看详细的origin仓库信息。

解决冲突,可通过手工修改各自的分支的文件。多人合作模式,通常是自己想试图push自己的dev。如果失败,说明其他人的dev比我更新。那么,将最新的dev pull下来,如果pull失败,说明本地dev没有与origin dev关联。可以设置setup关联,然后pull下来进行修改。如果修改有conflict,那么手工解决conflict,再push。

标签tag实际上是一个版本库的快照。默认的tag是打在最新提交的commit版本上,所以tag name 后面没有跟上commit_id.如果要指定给历史提交的某一个版本,只需要在name后加上相应commit-id。即可为之前遗忘的版本进行tag标记。

我们把tag推送到origin上,可以单独push也可以一次性push多个.也可是删除tag,删除时先删除本地tag,再删除远程tag。同时再进行查看远程tag。

github的使用,通常我们把一个开源项目fork到自己仓库后。我们就拥有对该仓库的读写权限,然后再clone到本地仓库。然后创建自己的开发分支,开发完后,merge到master。然后到该开源项目上进行pull request。对方如果接受,则你对该开源项目做了贡献。

git配置,git可以设置gitignore忽略你不想提交的文件。此外,还可以通过–global设置全局参数。–global是对当前用户起作用,如果不用–global那么只是对当前仓库起作用。此外,每个仓库的git设置都保存在.git/config文件中。git是一个隐藏文件夹。工作区不可见。git可以通过配置简单的别名,进而少输入一些字母,提高工作效率。不过,建议新手不要设置简写,先熟悉基本操作,再简写形式输入。

github是一个免费托管开源代码的远程仓库。如果你想设置私人仓库,你需要付费。通常我们可以自己搭建Git服务器作为私人仓库。除此之外,还可以使用bitbucket。bitbucket的优势在于可以设置无限制的私人仓库,同样支持git分布式版本控制系统。但团队人数上限为5人,但对于小团队已经足够了。

以上为自己根据廖雪峰老师的Git教程学习总结所得,可能部分有重合。详细教程参考廖雪峰老师的Git教程。