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

recursiveresolve 似乎非常常见,仅适用于两路合并。

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

https://github.com/b1f6c1c4/learn-git-the-super-hard-way