文章

《精通git第二版》读书笔记·ch02 git基本用法

《精通git第二版》读书笔记·ch02 git基本用法

获取git仓库

创建git仓库有两种方式。

第一种是把现有文件导入到git中。基本流程如下:

1
2
3
git init # 初始化项目为git仓库
git add "xxx" # 跟踪文件
git commit # 提交文件

第二种方式,使用git clone [url] [name]克隆一个仓库。

记录每次更新到仓库

修改工作拷贝,完成一个阶段的目标后,提交更新到仓库中。

工作目录下的文件存在两种状态

  • 已跟踪。纳入了版本控制的文件,在上一次快照中有记录,可能处于未修改、已修改、已暂存等状态。
  • 未跟踪。其他文件,不存在于上次的快照中,也不在暂存区。

git的常用命令如下

git status命令,用于查看文件的状态。

git add "xxx"添加内容到下一次提交。

git diff命令,查看尚未暂存的文件变化(工作区与暂存区)。git diff --cached|staged查看下次提交的文件变化(暂存区与版本库)。git difftool运行diff插件来输出diff分析结果。

git commit提交更新。git commit -a将所有跟踪的文件暂存并提交,从而绕过暂存区。每一次提交,都是对项目做一次快照。

git rm "xxx"从跟踪文件清单中移除文件,并删除工作区的文件。如果只是简单的从工作区删除了,需要使用git rm来记录此次操作。git rm --cached从版本库删除,但是保留工作区的文件。

git mv "old" "new"移动文件,例如更改名称。

.gitignore文件,列出需要忽略的文件模式,文件格式规范为:

  • 忽略空行和以#开头的行。
  • 使用标准的glob模式匹配(shell使用的简化的正则表达式)。
  • 可以以/开头防止递归。
  • 可以以/结尾指定目录。
  • !开头表示模式取反。

要养成一开始就设置好gitignore文件的习惯。github维护了一份文档:https://github.com/github/gitignore

查看提交历史

git log命令,显示提交历史。有以下选项:

1
2
3
4
5
6
7
8
9
git log
# -p 显示每个更新之间的差异
# --stat 显示每次更新的统计信息
# --shortstat
# --name-only 仅显示文件清单
# --abbrev-commit 显示SHA1的前几个字符
# --relative-date 相对短的时间
# --graph ASCII图形表示的分支合并历史
# --pretty 其他格式显示,例如oneline short full fuller format

format有一些常用选项,例如git log --pretty=format: "%h - %an, %ar : %s"注意,作者指实际作出修改的人,提交者指最后将工作提交到仓库的人

可以通过一些参数限制输出长度,例如:

1
2
3
4
5
6
7
git log -(n) # 显示最近n条提交
git log --since, --after # 在指定时间后的提交
git log --until, --before
git log --author # 某个作者的提交
git log --commiter # 某个提交者的提交
git log --grep # 搜索提交说明中的关键字
git log -S # 显示添加或者删除某个关键字的提交

撤销操作

git commit --amend。修补提交,提交暂存区中的文件,并修改提交信息。

git reset "xxx",将文件撤出暂存区。git reset --hard会导致工作区进度丢失

git checkout -- "xxx",撤销文件更改。危险命令!本质为用版本库中的文件替换了工作区的文件

git中任何已经提交的内容几乎总是可以恢复。但是未提交的东西丢失后可能找不到

远程仓库

远程仓库,指托管在网络中的项目版本库。管理命令为git remote。git会给克隆的仓库服务器默认名origin

1
2
3
4
5
6
7
git remote -v # 显示远程仓库简写和url
git remote add "shortname" "url" # 添加远程仓库
git fetch "remote-name" # 拉取远程仓库的数据
git push "remote-name" "branch-name" # 推送到远程仓库
git remote show "remote-name" # 查看远程仓库信息
git remote rename "old" "new" # 修改远程仓库名称
git remote rm "xxx" # 删除远程仓库

注意事项如下:

  • fetch会自动拉取远程仓库的数据,但不会自动合并和修改,需要手动合并。
  • git pull从服务器上抓取数据并自动合并到当前所在分支。
  • 克隆的服务器名称默认为origin,自动设置本地master分支跟踪远程仓库的master分支或其他默认分支。

推送数据时需要具有写入权限,并且之前没有人推送过。别人推送后,需要先拉取别人的推送合并到自己的工作中,然后再推送

打标签

git可以给某个提交打上标签,以表示重要,例如发布节点

有两种类型的标签

  • 轻量标签。一个特定提交的引用。
  • 附注标签。存储在git数据库中的完整对象,有标签名、电子邮件、时间日期、标签信息等,可以被校验,可以用GPG签名与验证。

注意事项如下:

  • 默认情况下,标签不会显式推送到远程仓库服务器上。
  • 标签不能像分支一样移动,但是可以基于标签创建新分支。

常用命令如下:

1
2
3
4
5
6
7
8
git tag # 显示所有标签
git tag -a "vxxx" -m "xxx" # 创建附注标签
git tag "vxxx" # 轻量标签,不加-a, -s, -m
git show "vxxx" # 显示某个标签的信息
git tag "vxxx" <sha-1> # 后期打标签
git push origin [tagname] # 推送标签
git push origin --tags # 推送所有标签
git checkout -b [branchname] [tagname] # 在特定标签创建分支

git别名

类似于shellalias命令别名。

1
git config --global alias.unstage 'reset HEAD --' # 创建一个命令别名

参考

《精通git第二版》

本文由作者按照 CC BY 4.0 进行授权

热门标签