文章目录
  1. 1. 取得项目的Git仓库
    1. 1.1. 在工作目录中初始化新仓库
    2. 1.2. 从现有仓库克隆
  2. 2. 记录每次更新到仓库
    1. 2.1. 检查当前文件状态
    2. 2.2. 暂存已经修改文件
    3. 2.3. 忽略某些文档
    4. 2.4. 查找已暂存和未暂存的更新
    5. 2.5. 提交更新
    6. 2.6. 跳过使用暂存区域
    7. 2.7. 移除文件
    8. 2.8. 移动文件
  3. 3. 查看提交历史
    1. 3.1. git log的常用选项
    2. 3.2. 限制输出长度
    3. 3.3. 图形化工具
  4. 4. 撤销操作
    1. 4.1. 修改最后一次提交
    2. 4.2. 取消已经暂存的文件
    3. 4.3. 取消对文件的修改
  5. 5. 远程仓库的使用
  6. 6. 打标签
    1. 6.1. 列显已有的标签
    2. 6.2. 新建标签
    3. 6.3. 含附注的标签
    4. 6.4. 签署标签
    5. 6.5. 轻量级标签
    6. 6.6. 验证标签
    7. 6.7. 后期加注标签
    8. 6.8. 分享标签
  7. 7. 小技巧

了解了一些Git的基本概念之后就应该是学习去使用它了,下面我们就给出Git的一些最基本的命令,也是以后绝大多数时间用到的命令。

取得项目的Git仓库

两种方法

在工作目录中初始化新仓库

到某个项目所在目录

git init

将目录下文件纳入版本控制(跟踪文件,跟踪之后文件将变为已暂存状态)

git add *.c
git add README

提交

git commit

从现有仓库克隆

git clone [url]

例如:

git clone https://github.com/XFHNever/XFHNever.github.io.git
//这里支持的是http(s)数据传输协议,也可以是git/ssh协议等。

如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

git clone https://github.com/XFHNever/XFHNever.github.io.git myproject

唯一的区别是现在新建的目录成了myproject.

记录每次更新到仓库

文件状态周期:

检查当前文件状态

git status

暂存已经修改文件

git add test.txt

git add是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等

忽略某些文档

创建一个.gitignore文件,里面记录要忽略的文件模式:

cat .gitignore

文件 .gitignore 的格式规范如下:

  1. 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  2. 可以使用标准的 glob 模式匹配。
  3. 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  4. 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

实例:

# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

查找已暂存和未暂存的更新

显示还没有暂存起来的改动:

git diff

显示已经暂存起来的文件和上次提交时的快照之间的差异:

git diff --cache
//Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。

提交更新

git commit
//这种方式会启动文本编辑器以便输入本次提交的说明

或者

git commit -m "commit message"

跳过使用暂存区域

git commit -a -m "commit message"

git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

移除文件

从 Git 中移除某个文件:

手动删除
git rm test.txt

如果删除之前修改过并且已经放到暂存区域的话,需要强制删除:

git rm -f test.txt

移除跟踪但不删除文件:

git rm --cached test.txt

移动文件

重命名:

git mv file_from file_to

查看提交历史

git log

显示每次提交的内容差异

git log -p -2
//-2表示仅显示最近的两次更新

单词层面的对比:

git log -U1 --word-diff

新增加的单词被 {+ +} 括起来,被删除的单词被 [- -] 括起来,在进行单词层面的对比的时候,你可能希望上下文( context )行数从默认的 3 行,减为 1 行,那么可以使用 -U1 选项

git log的常用选项

选项     说明
-p     按补丁格式显示每个更新之间的差异。
--word-diff     按 word diff 格式显示差异。
--stat     显示每次更新的文件修改统计信息。
--shortstat     只显示 --stat 中最后的行数修改添加移除统计。
--name-only     仅在提交信息后显示已修改的文件清单。
--name-status     显示新增、修改、删除的文件清单。
--abbrev-commit     仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date     使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph     显示 ASCII 图形表示的分支合并历史。
--pretty     使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。--oneline     --pretty=oneline --abbrev-commit 的简化用法。

限制输出长度

选项     说明
-(n)     仅显示最近的 n 条提交
--since, --after     仅显示指定时间之后的提交。
--until, --before     仅显示指定时间之前的提交。
--author     仅显示指定作者相关的提交。
--committer     仅显示指定提交者相关的提交。

实例:

git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \--before="2008-11-01" --no-merges -- t/

查看 Git 仓库中,2008 年 10 月期间,Junio Hamano 提交的但未合并的测试脚本(位于项目的 t/ 目录下的文件)

图形化工具

gitk

撤销操作

修改最后一次提交

git commit --amend

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 –amend 提交:

git commit -m 'initial commit'
git add forgotten_file
git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

取消已经暂存的文件

git reset HEAD test.txt

取消对文件的修改

git checkout -- test.txt

远程仓库的使用

会专门写一篇blog。

打标签

同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。

列显已有的标签

git tag

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签

git tag -a v1.4 -m 'my version 1.4'

查看相应标签的版本信息,并连同显示打标签时的提交对象:

git show v1.4

签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母):

git tag -s v1.5 -m 'my signed 1.5 tag'

轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可

git tag v1.4-lw

验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中:

git tag -v v1.4.2.1

后期加注标签

甚至可以在后期对早先的某次提交加注标签,只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

git tag -a v1.2 9fceb02

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

git push origin v1.5

如果要一次推送所有本地新增的标签上去,可以使用 –tags 选项:

git push origin --tags

小技巧

  1. 自动补全

    敲两次Tab键

  2. Git命令别名

    Git 并不会推断你输入的几个字符将会是哪条命令,不过如果想偷懒,少敲几个命令的字符,可以用 git config 为命令设置别名

    git config --global alias.ci commit
    

    如果要输入 git commit 只需键入 git ci 即可

文章目录
  1. 1. 取得项目的Git仓库
    1. 1.1. 在工作目录中初始化新仓库
    2. 1.2. 从现有仓库克隆
  2. 2. 记录每次更新到仓库
    1. 2.1. 检查当前文件状态
    2. 2.2. 暂存已经修改文件
    3. 2.3. 忽略某些文档
    4. 2.4. 查找已暂存和未暂存的更新
    5. 2.5. 提交更新
    6. 2.6. 跳过使用暂存区域
    7. 2.7. 移除文件
    8. 2.8. 移动文件
  3. 3. 查看提交历史
    1. 3.1. git log的常用选项
    2. 3.2. 限制输出长度
    3. 3.3. 图形化工具
  4. 4. 撤销操作
    1. 4.1. 修改最后一次提交
    2. 4.2. 取消已经暂存的文件
    3. 4.3. 取消对文件的修改
  5. 5. 远程仓库的使用
  6. 6. 打标签
    1. 6.1. 列显已有的标签
    2. 6.2. 新建标签
    3. 6.3. 含附注的标签
    4. 6.4. 签署标签
    5. 6.5. 轻量级标签
    6. 6.6. 验证标签
    7. 6.7. 后期加注标签
    8. 6.8. 分享标签
  7. 7. 小技巧