Git是一个开源的分布式版本控制软件,用来管理项目版本。Git最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。

1. 为什么需要本本控制

  1. 备份用
  2. 团队协同开发

2. Git的历史

很多人都知道,Linus在1991年创建了开源的Linux,从此Linux系统不断发展,已经称为最大的服务器系统软件。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实上,在2002年以前,世界各地的志愿者把代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统码?因为Linus坚定的反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那时付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一种商业版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux免费使用这个版本控制系统。

安定团结的大好局面在2005年被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git,一个月之内,Linux系统的源码已经由Git管理了,

Git迅速成为最流行的分布式版本控制系统,尤其在2008年,GitHub网站上线了,它为开源项目免费提供了Git存储,无数开源项目开始迁移到GitHub,包括JQuery,PHP,Ruby等等。

历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

3. Git的官网

1
https://git-scm.com

2. Git的安装和配置

下载Git
https://git-scm.comdownload/

3. Git的四个工作区域

Git本地有四个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository)或Git Directory、git仓库(Remote Directory)文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是你平时存放项目代码的地方
  • Index/Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository:(仓库区),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
  • Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

4. Git文件的四种状态

git的工作流程一般是这样的:

  1. 在工作目录中添加、修改文件
  2. 将需要进行版本管理的文件放入暂存区域
  3. 将暂存区域的文件提交到git仓库

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要直到文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者想要提交的文件没提交上。

GIT不关心文件两个版本之间的具体区别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

  • Untracked:未跟中,此文件在文件夹中,但并没有添加到git库,不参与版本控制,通过git add 状态变为Staged
  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改,而变为Modified,如果使用git rm 移出版本库,则称为Untracked文件
  • Modified:文件已修改,仅仅时修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存Staged状态,使用git checkout则丢弃修改,返回到unmodify状态,这个git checkout即从库中去处文件,覆盖当前修改
  • Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态,执行git reset HEAD filename取消暂存,文件状态变Modified
  1. 新建文件–> Untracked
  2. 使用add命令将新建文件加入到暂存区–> Staged
  3. 使用commit命令将暂存区的文件提交到本地仓库–> Unmodified
  4. 如果对Unmodified状态的文件进行修改—> modified
  5. 如果对Unmodified状态的文件进行remove操作–> Untracked

5. 常用命令

git branch 查看本地所有分支
git status 查看当前状态
git commit 提交
git branch -a 查看所有的分支
git branch -r 查看远程所有分支
git commit -am “init” 提交并且加注释
git remote add origin git@127.0.0.1:ndshow 添加远程仓库
git push origin master 将文件给推到服务器上
git remote show origin 显示远程库origin里的资源
git push origin master:develop
git push origin master:hb-dev 将本地库与服务器上的库进行关联
git checkout --track origin/dev 切换到远程dev分支
git branch -D master develop 删除本地库develop
git checkout -b dev 建立一个新的本地分支dev
git merge origin/dev 将分支dev与当前分支进行合并
git checkout dev 切换到本地dev分支
git remove show 查看远程库
git add .
git rm 文件名(包含路径)从git中删除指定文件
git clone git://github.com/schacon/grit.git 从服务器上将代码拉下来
git config --list 查看所有用户
git ls-files 看已经被提交的文件
git rm [file name] 删除一个文件
git commit -a 提交当前repos的所有的改变
git add [file name] 添加一个文件到git index
git commit -v 当你用-v参数时候可以看commit的差异
git commit -m “this is the message describing the commit” 添加commit信息
git commit -a -a 是代表add,把所有的change加到git index里然后再commit
git commit -a -V 一般提交命令
git log 看你commit的日志
git diff 查看尚未暂存的更新
git rm a.a 移除文件(从暂存区和工作区中删除)
git rm --cached a.a 移除文件(只从暂存区中删除)
git commit -m “remove” 移除文件(从Git中删除)
git rm -f a.a 强行移除修改后文件(从暂存区和工作区中删除)
git diff --cached 或 git diff --staged 查看尚未提交的更新
git stash push 将文件给push到一个临时空间中
git stash pop 将文件从临时空间pop下来

-----------------------------------
git remove add origin git@github.com:username/Hello-World.git
git push origin master 将本地项目提交到服务器中
git pull 本地与服务器端同步
git push (远程仓库名)(分支名)将本地分支推送到服务器上去
git push origin serverfix:awesomebranch
-----------------------------------
git fetch 相当于从远程获取最新版本到本地,不会自动merge
git commit -a -m “log_message” (-a 是提交所有改动,-m是加入log信息)本地修改同步至服务器端
git branch branch_0.1 master 从主分支master创建branch_01分钟
git branch -m branch_0.1 branch_1.0 将branch_0.1重命名为branch_1.0

git branch 删除远程branch
git push origin :branch_remote_name
git branch -r -d branch_remote_name

初始化版本库,并提交到远程服务端
mkdir WebApp
cd WebApp
git init 本地初始化
touch README
git add README
git commit -m “first commit”
git remote add origin git@github.com:renmcc/WebApp.git

6. 配置用户签名

如果想要将本地的项目提交到远程仓库的话,必须要设置签名。签名的作用就是用来标识用户,以区别不同的开发人员。

6.1 设置方式

设置签名有两种方式:

  1. 一种是为单个仓库单独设置,这种方式只针对单个仓库有效
  2. 另一种是全局配置,采用这种方式配置后,所有仓库都有效,如果对两种方式都进行了配置,那么会优先使用单个仓库配置方式的配置信息

单个仓库有效

1
2
git config user.name
git config user.email

用户名和邮箱自行设置
邮箱可以是假邮箱,即只要符合邮箱格式即可
该中方式配置信息会保存再当前仓库目录下.git/config文件中,打开查看发现保存的格式为

1
2
3
[user]
name = 用户名
Email = 邮箱

全局有效

1
2
git config --global user.name
git config --global user.email

该种方式配置信息会保存再系统盘的系统用户目录下.gitconfig文件中,保存格式同上面一样。