git

本来想学习以下git hook,发现对git还不是很理解,所以将git-hook的博客删了,重新先学习一下git。

前序

主要想知道的是git那几个命令到底干了啥,如add、commit等

参考博客

廖雪峰git教程写得很详细啊!最起码能让人熟悉使用git的一些常用命令,但我今天的目的不在于此,可以作为平时查阅文档用,我也不期望将这些命令都记下来;
如何理解 Git 的分布式?-pansz的回答
Git分支-分支简介

git简介

git是一个开源的分布式版本控制系统
廖雪峰举的一个例子“如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?”
回顾git的诞生,我们更容易看到git到底是干啥的,事情的经过是这样的“linux开发了linux,并将其开源,然后无数仁人志士开始开发linux,但一开始linux反对像cvs、svn这种集中式的版本控制系统,也反对那些付费的,所以一开始代码管理都是由linux手工完成,后来因为太过庞大,所以linux自己写了一个分布式的版本控制系统!!!”

集中式版本控制系统

像cvs、svn之类的是属于集中式的版本控制系统,版本库是集中存放在中央服务器上的,中央服务器相当于一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了再放回图书馆。
缺点是容易出现单点故障和网络带宽限制。

分布式版本控制系统

像git就是分布式版本控制系统,没有中央服务器,每个人的电脑上都是一个完整的版本库,可是我感觉我现在上课用git,很类似于集中式版本控制系统,将自己新修改的内容推至老师那边的git仓库,然后如果有更新的话,需要pull,着如何理解呢?还有如果公司只有一个文件去维护,那这冲突咋解决呢?

如何理解git的分布式?

看了很多博客,目前理解的老师上课采取的方式是指分布式版本控制系统通常也有一台充当“中央服务器”的电脑(如github),但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已;没有它的话两两之间进行传递;
另外git分布式与svn等集中式版本控制的区别体现在git本地有完整的版本库
svn的模式是:

  1. 写代码;
  2. 从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突;
  3. 将代码提交到服务器上

git的模式是:

  1. 写代码;
  2. 提交到本地版本库;
  3. 从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突;
  4. 将远程库与本地代码合并结果提交到本地版本库;
  5. 将本地版本库推到服务器

因此git是有本地版本管理的,在提交到远程仓库之前可以任意提交修改,形成多个本地版本,而svn在提交给远程服务器时,只能在一个版本上不断修改,不能回滚啥的,一旦服务器有问题,就算找到一个最新的代码上去,也是只能以当前时间为节点作为新的项目去使用,之前所有的提交历史记录无法看到

如何理解冲突?

冲突不管是集中式还是分布式都会产生的,如果双方都修改了同一个文件的同一个部分,那就产生冲突了,得手动解决,否则可以自动合并。

那些命令都干了啥?(如commit、add等)

git add

首先我们需要知道的一个概念是暂存区与工作区,工作区就是我们的git所在的目录,但是.git不算,.git是git的版本库
然后版本库里有一个暂存区
然后git add就是将当前工作区下被修改(添加、移除和修改)的所有文件添加到暂存区(stage)
利用git status可以查看工作区和暂存区里的差别,例如我在工作区里新建一个test1.txt并且不做任何其他操作,执行git status:

1
2
3
Untracked files:
(use "git add <file>..." to include in what will be committed)
test1.txt

执行git add .:

1
2
3
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: test1.txt

此时已被加入缓存区,但是还没加入本地库

git commit

git commit就是将暂存区内容添加至本地仓库的当前分支(如果没有新建和切换分支,默认是在master分支)
常用的就是git commit -m,我比较常用的是git commit -am

git commit -m与git commit -am的区别?

此时我修改test1.txt里面的内容,然后git status

1
2
3
4
5
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: test1.txt

此时有两种做法:

  1. git add .git commit -m
  2. 只有git commit -am

也就是说对于存在文件的修改(修改与删除),-am可以等同于add与-m的结合,但对于新创建的文件只能分两步;

git commit相当于为此时的工作区生成了一个快照,以后可以回滚等操作,所以git提倡多commit,并且commit的信息要详细。

git push

将本地仓库发送到远程仓库中对应的分支去,然后这里就会牵扯到另一个git中的重要概念——分支;
别急先总结一下:工作区-》暂存区-》本地仓库-》远程仓库;