本文基于Pro Git中文版做个人记录使用
Git介绍
Git作为一个版本控制器,用于记录一个或多个文件的内容变化。区别于SVN和CVS这类集中化版本控制系统,Git是分布式的。
SVN版本控制服务器的优缺点
SVN的优点是存放在单一的服务器,便于项目的管理。
SVN的缺点是中央服务器的单点故障。一旦中央服务器故障宕机,则所有人无法协同工作,只能手动进行版本更新。最糟糕的情况是中央服务器磁盘损坏且并未做备份,导致版本数据丢失。
SVN每次存的都是版本差异,所需硬盘空间会相对较少,但是回滚速度也会很慢。
分布式版本控制
客户端并不只提取最新版本的文件快照,而是把代码仓库都完整的镜像下来。
这类系统能指定和若干个不同的远端代码仓库进行交互,实现同一个项目允许不同工作小组相互协作。
分布式存放的不是项目版本与版本的差异,而是存放索引(所需的磁盘空间很少),所以每个客户端都能放下整个项目的历史记录,回滚速度迅速。
Git由于项目在每个人的本地都存在,即使断网后,仍能进行继续协同工作。
Git安装与配置
Git安装
这部分网上有许多资料,且没有什么技术含量,这里就不予以介绍。
值得首先一提的是,Git区别于DOS命令(CMD),使用的是Linux命令。使用Git的第一步是初始化Git的配置。
Git配置
第一个配置的即为个人用户名与电子邮件地址,每次进行Git提交时,都会引用这两条信息,用于说明谁提交了更新。所以该部分内容将被永久载入历史记录中。
这里的--global表示该配置只适用于该用户。当为--system时,适用于所有用户。如果没填,则为当前项目Git目录的配置。
$ git config --global user.name "charleschan" #你的git用户名,非昵称
$ git config --global user.email "charleschan@qq.com" #填写你的git邮箱
Git基础使用
Git的使用推荐阅读《Pro Git》的中文文档:传送门
当然你也可以利用git help命令获取帮助。
从当前目录初始化新仓库
$ git init # 对现有的某个项目开始用Git管理
$ git add . # 将该目录下的所有文件纳入版本控制
$ git add xxx # 将该目录下的xxx文件纳入版本控制
$ git commit -m 'initial project version' # 提交文件并标注修改内容
从现有仓库克隆
$ git clone [url] # 将仓库克隆到当前目录
工作区、暂存区
$ git status # 查询当前目录的文件修改情况,是否暂存
$ git diff # 查询尚未暂存的文件更新了哪些部分
$ git diff --staged # 查看已经暂存的文件与上次提交快照的差异 --cached
$ git add xxx # 将xxx文件提交至暂存区,下次提交时即会一并记录到仓库
忽略文件
使用git要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。
文件 .gitignore 的格式规范如下:
所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式最后跟反斜杠(/)说明要忽略的是目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
提交更新
$ git commit # 将暂存区域提交至仓库,推荐先用git status查看是否暂存
$ git commit -m "msg" # 提交更新,并记录说明
移除文件
从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
$ rm xxx # 从项目目录中删除
$ git rm xxx # 记录此次移除文件的记录
最后提交的时候,该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
如果想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可
$ git rm --cached xxx
$ git rm log/\xxx # glob模式
移动文件
不像其他的 VCS 系统,Git 并不跟踪文件移动操作。如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。不过 Git 非常聪明,它会推断出究竟发生了什么,至于具体是如何做到的,我们稍后再谈。
$ git mv file_name1 file_name2
## git实际操作
$ mv README.txt README
$ git rm README.txt
$ git add README
查看提交历史
内容过多,直接列出命令
$ git log # 查看提交历史
$ git log -p # 查看每次提交的内容差异
$ git log -p -2 # 查看近两次提交的内容差异
$ git log --stat #仅显示简要的增改行数统计
$ git log --pretty=online
$ git log --pretty=short
$ git log --pretty=full
$ git log --pretty=fuller
$ git log --pretty=format:"%h - %an, %ar : %s"
# 选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
$ git log --since=2.weeks # 按照实际做限制,最近2周
$ git log --since, --after #仅显示指定时间之后的提交。
$ git log --until, --before #仅显示指定时间之前的提交。
$ git log --author #仅显示指定作者相关的提交。
$ git log --committer #仅显示指定提交者相关的提交。
撤销操作
修改最后一次提交
$ git commit --amend
已经push
对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令
$ git revert <commit_id>