Git 进修笔记
不包含基础的操作,中英文可能随时混用,请谅解(
git log
查看单行带分支伪图形:git log --oneline --decorate --graph --all,建议设为 alias(
--author 匹配作者,--grep 匹配 commit message。
-p 显示托管平台级别的 commit,也就是所有的 diff。
可以指定范围 <from>..<to>,起始点可以是 commit ID 或分支。
--after/--before= 指定实际时间,支持相对时间。
~n 指定前第 n 次提交,例如 HEAD~3,不过含有 merge commit 似乎行为比较奇怪。如下图

https://www.atlassian.com/git/tutorials/inspecting-a-repository
撤销
detached HEAD 指的是 HEAD 没有指向任何分支。
撤销策略:
checkout -b开一个新分支revert HEAD创建相反提交(有趣)reset --hard <ID>重置历史到特定提交(禁止远程)commit --amend修改最后一次提交
reset [--hard] HEAD 放弃所有更改,但不会删除未跟踪的文件。使用 clean -di 删除(含目录,交互式)。
merge 策略
fast forward 非常常见,尤其是远程 pull 到本地,即使没有冲突,其实也进行了隐式的 merge。
git merge [-s <strategy> -X <option>] branch1 branch2 .. branchN
recursive 和 resolve 似乎非常常见,仅适用于两路合并。
ours 听起来就很不错,忽略别人的(
如果用的是 recursive(非常常见),可以 -X 直接指定接受自己的 ours 还是他们的 theirs,无需手动合并。

git remote
git remote prune <remote> 可以删除本地存在但是远程不存在的远程分支,在现在有太多分支的 MiniSQL 里很有用。不过它并不会删除本地用于跟踪远程分支的分支,这只能通过手动删除,糟糕。
似乎有一个 git-removed-branches 可以完成这一点(
git rebase
寻找公共祖先:git merge-base branch1 branch2
魔法
git reflog 以及 git cat-file -p、git rev-parse HEAD@{*} 学习低级实现。