Git 是一个以命令行为主的免费开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目。是Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。常见的CVS,SVN等都是集中式的版本控制系统。
版本控制系统:集中式vs分布式
集中式版本控制系统,版本库是集中存放在中央服务器的,修改项目时需要先从中央服务器取得最新版本,然后修改,再将修改后的版本提交到中央服务器上。
集中式版本控制系统有很多好处,比如管理员可以充分了解每个开发者的进度,但也有以下问题:第一,需要联网工作,在网速不好的环境下效率非常地下;第二,若中央服务器发生故障,整个项目有可能会丢失所有历史更新记录。
而分布式版本控制系统则不同,没有中央服务器,每个人都是一个完整的版本库,因此工作时不需要联网,只要在需要时将修改推送即可,因此安全系数也高很多,某一人的电脑发生故障并不会影响整个项目,其他人电脑中也有。
Linux上安装Git
- 在终端输入
git
,看系统是否安装Git - 若终端显示为
$ gitThe program 'git' is currently not installed. You can install it by typing:sudo apt-get install git
则没有安装,通过指令sudo apt-get install git
完成Git的安装
常用Git操作
- 配置Git基本信息:git config
- 添加Git忽略文件:.gitignore
- 创建版本库:git init
- 创建和删除分支:git branch
- 切换到某个分支:git checkout
- 查看仓库的状态:git status
- 把某个文件添加到git暂存区域:git add
- 把暂存区域的内容提交到本地仓库:git commit
- 查看修改内容:git diff
- 重置代码:git reset
- 把本地仓库推送到远程仓库:git push
- 把远程仓库clone到本地:git clone
- 把远程代码拉到本地:git pull
- rebase: git rebase
1、配置Git 基本信息
git config --global user.name "<username>"
git config --global user.email "<email>"
配置全局Git的用户名和邮箱设置,之后每一次Git的提交都会使用这些信息,也可通过以下命令查询当前Git的配置
git config --list
2、添加Git忽略文件
有些在Git工作目录中的文件比较重要或个人,不能提交他们,可以在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后将要忽略的文件名填进去,Git就会自动忽略这些文件。.gitignore 文件一般不存在,需要仓库根目录下手动创建,并且可以对 .gitignore 做版本管理。
忽略文件的原则:
(1)忽略操作系统自动生成的文件,比如缩略图等;
(2)忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
(3)忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
Git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。下面列举几个常用的配置语法。
(1)以斜杠“/”开头表示目录;
(2)以星号“*”通配多个字符;
(3)以问号“?”通配单个字符
(4)以方括号“[]”包含单个字符的匹配列表;
(5)以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
3、创建版本库/仓库
版本库,又叫仓库,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
第一步,创建一个空目录
mkdir <repository_name>
cd <repository_name>
第二步,通过git init
命令把这个目录变成Git可以管理的仓库
此时,空仓库就创建好了,列表显示当前空文件夹下有一个隐藏目录 .git,这个目录是Git用来跟踪管理版本库的,非常重要。
4、查看仓库状态
git status
查询当前版本库的状态,若在本地仓库有有任何文件内容的改变,Git会检测到该文件,并显示
5、将文件添加到版本库
本地仓库由git维护的三棵“树“组成。第一个是工作目录(Working Dir),它持有实际文件;第二个是暂存区(Index),像个缓存区域,临时保存文件的改动;第三个是Head区,指向最后一次提交的结果。
前提:添加文件到版本库,一定要将文件放在版本库目录下(或子目录下)。
第一步:用命令git add
添加到暂存区
git add <filename>
第二步:用命令git commit
实际提交改动
git commit -m "<information>"
-m后面输入的是本次提交的说明文档,可以方便自己和别人阅读,也可以省略,但不建议。同时,可以多次add不同文件,commit可以一次提交多个文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files"
注:现在的改动已经提交到了HEAD,但还没有到远端仓库。
6、查看修改内容
git diff <file_name>
git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到文件的修改内容。
7、版本回退
git reset --head <commit_id>
HEAD 指向的版本就是当前版本,Git允许我们在版本的历史之间回退;回退前,用git log
可以查看提交历史,以便确定回退到哪个版本;要重返现在版本,用 git reflog
查看命令历史,以便确定要回到未来的哪个版本
8、撤销修改
- 文件在工作区,丢弃修改
git checkout -- <file_name>
- 文件在暂存区,丢弃修改
git reset HEAD <file_name>
git checkout -- <file_name>
9、删除和重置文件
第一步:删除本地文件
rm <file_name>
第二步:分两种情况
- 确实删除,从版本库中也删除
git rm <file_name>
git commit -m "<remove_info>"
- 删错了,从版本库恢复到最新版本
git checkout -- <file_name>
10、分支的创建删除合并
分支是用来将特性开发绝原来来的,我们创建仓库时,master是默认分支,可以在创建其他分支,在该分支上进行开发,完成后将它们合并到主分支上,并根据需要选择是否删除该子分支。
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git branch -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
11、Rebase
git checkout <name1>
git rebase <name2>
rebase 用于把一个分支的修改合并到当前分支
注:rebase和merge都是用于合并分支,具体区别见这里,同时要知道,使用git pull时默认是merge, 加 --rebase参数使其使用rebase方式。
12、标签
git tag <tag_id> <commit_id>
为软件发布创建标签,这个概念早已存在,在SVN中也有,可以通过git log
命令获取提交ID,可以使用少一点的提交ID前几位,只要它的指向具有唯一性。
命令 | 意义 |
---|---|
git tag |
查看所有标签 |
git tag <name> |
新建一个标签,默认为HEAD,也可以指定一个commit id |
git push origin <tagname> |
推送一个本地标签 |
git push origin --tags |
推送全部未推送过的本地标签 |
git tag -d <tagname> |
删除一个本地标签 |
git push origin :refs/tags/<tagname> |
删除一个远程标签 |
Git中关于远程仓库,工作区和暂存区等内容,会在后续博客进行介绍。
参考资料
git入门文档
视频教程《版本控制入门 – 搬进 Github》
Git学习资源指南
Git简明指南
免费的git书箱 progit2
git常用命令手册
廖雪峰的git在线教程
在线尝试git ( 中文翻译在这里)
Git学习资源汇总
git merge和git rebase小结