总是忘记 git 命令,而且 git 帮助文档要么词不达意,要么要开浏览器阅读,想一下遂写下这个 git 常用命令,供我速查。
当然如果与 GitHub 深度集成的话,更推荐的做法是用 gh(GitHub CLI),我以后再想吧。
(因为是给 grep 之类的搜索工具用的,可读性较差)
获取代码库
使用 git clone
git clone https://g.karlbaey.top/repos/blog.git ./blog
通过 HTTPS 把 https://g.karlbaey.top/repos/blog.git 的 git 仓库克隆到 ./blog 文件夹。
GitHub 提供 SSH 协议的链接,只要把 https://... 的链接替换即可。
修改代码
暂存区
使用 git add。
git 有暂存区(Staging Area),git add 把修改过的文件放到暂存区里。
-n(–dry-ru[n])看看哪些文件会被加入暂存区。
-N(–inte[N]t-to-add)把新增文件名放进暂存区占位,不存内容。
上面两个命令都不单独使用,一般和下面的命令结合起来用。
git add . 把当前目录以及子孙目录的所有修改过的文件放入暂存区。
-A(–[A]ll)类似,该命令不论在项目的哪级目录执行,相当于在仓库根目录执行 git add .。
通常不这么做,假如同时修改了文档和代码,应该分为两个提交更好。
-p(–[p]atch)交互式提交新文件。
- [y]es 保存这一代码差异块(hunk)
- [n]o 不保存这一 hunk
- [q]uit 退出,不处理剩余的 hunk(已选择 y 的 hunk 仍然会保留)
- [d]one 跳过当前修改块以及该文件后面所有的修改块
- [s]plit 拆分当前的修改块,如果这个块包含多处修改,git 会把它切得更小,便于逐行或逐小段地精细选择
- [e]dit 手动编辑当前的修改块,让 git 暂存部分行
- [?]help 显示帮助,列出所有可用选项的详细说明
-i(–[i]nteractive)也是交互式,就是选项更多。
提交代码
使用 git commit。
commit 会把暂存区里的内容通通持久化,这时候即使仓库里的代码被删了,也可以很方便地恢复代码。
git commit -n(–dry-ru[n])看看哪些文件会被提交。
写提交信息
使用 git commit。
-m <MESSAGE>(–[m]essage)提交并填写提交信息。
-m <TITLE> -m <CONTENT> 同上,但是两个 -m flag 后的信息会用个空行串联。也就是:
<TITLE>
<CONTENT>
<CONTENT> 可以用 \n 作为换行符。
也可以不写提交信息,但是,为了避免不知道某提交是干什么的,还是写一下比较好。
修改提交信息
使用 git commit --amend <NEW_TITLE>。
修改上一次提交,并把当前暂存区里的内容也吸收进上一个提交。添加 --no-edit 来避免吸收暂存区内容。
如果已经 push 过仓库就不能避免强制 push。
查日志
使用 git log。
不带任何 flag 和 subcommand 就交互式阅读日志,阅读交互逻辑默认和 less 类似。
--oneline -<n> 显示从当前往前 <n> 个提交,每个只显示单行。
--oneline -- <FILENAME> 查看 <FILENAME> 的修改记录。
--oneline --grep=<KEYWORD> 查看包括 <KEYWORD> 的提交记录。
--oneline --author=<NAME> 查看作者为 <NAME> 的提交记录。
gitk 开 GUI 看日志。
找出屎山作者
使用 git blame。
git blame <FILENAME> 这是基础命令,在 <FILENAME> 里找修改者。
-L 查找某几行。10,20 表示第 10 行到第 20 行,10,+10 表示第 10 行往后的 10 行。
-w 忽略空格([w]hitespace)修改,用来避免格式化工具导致的误会。
-C 检查同文件内移动的代码。
-C -C 检查跨文件移动的代码。
--date= 日期格式化,relative(相对时间)和 short(仅日期)已经够用。
找完屎山之后用 git show <HASH> 查看提交详细内容。
这个我现在用不到,有备无患,因为还没遇到过我以外的人写屎山……
改分支
使用 git branch。
<BRANCH> 创建新分支。
-l 列出所有分支。
-d 删除分支。只有在分支已合并后才能删。-D 强制删除。
或者 git switch。
-c <BRANCH> 创建并切换到新分支。
- 跳回上一个分支。
合并分支
使用 git merge,或者 git rebase。
后者避免出现分支交错。
git rebase -i 交互式 rebase。
部分指令:
- p pick 保留提交
- e edit 修改代码
- s squash 合并到上一个提交并保留信息
- f fixup 合并到上一个提交并丢弃信息
- d drop 删除提交
解决分支冲突要打开文件,删掉 <<<<<<< 之类的标记符,然后 git add 文件,继续 git rebase --continue。
--skip 等于 drop 这个提交。
---abort 放弃 rebase,回到一开始。
推送代码
使用 git push。
origin <BRANCH> 指定分支名。
-u(–set-[u]pstream)推送并建立上游关联。
比如 git push -u origin feature/fix-logic。
--tags 把标签一起推。
打标签
使用 git tag。
git tag v0.1.0 创建标签。
git tag -a v0.1.0 -m blabla 附注标签,包括标签的详细内容。
git tag 全部列出。
git tag -l "v1.*" 只看 v1.x 系列。
-d <TAGNAME> 删标签。
git push origin <TAGNAME> 推代码不会自动推标签。
拉取代码
使用 git pull。
--rebase 拉完仓库之后开始 rebase。
git pull == git fetch + git merge
简写命令
使用 git config alias.XX COMMAND。
比如 git config alias.lg "log --all --graph --oneline --decorate"。
常用 flag
--dry-run 看执行效果,但不执行。
--prune 按照远端仓库清理本地分支。
另外的部分
修改配置用 git config。
user.name 提交者名字
user.email 提交者邮箱
fetch.prune 是否自动清理
http.proxy 设置 HTTP 代理