Pro Git 笔记

286 阅读4分钟

本文基于Pro Git中文版做个人记录使用

Git介绍

Git作为一个版本控制器,用于记录一个或多个文件的内容变化。区别于SVNCVS这类集中化版本控制系统,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>

到底了