《精通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别名
类似于shell
的alias
命令别名。
1
git config --global alias.unstage 'reset HEAD --' # 创建一个命令别名
参考
《精通git第二版》