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@{*}
学习低级实现。