[译] 我个人的 Git 技巧备忘录
我个人的 Git 技巧备忘录
除了 “基础的” 命令之外,每个人都有他们常用的 Git 技巧。我想列出我愿意在 .gitconfig
保存别名(alias)的命令。在文章末尾,你可以看到一些在 git 之外与 git
相关的有意思的命令!:)
快速纠正
我经常忘记提交(commit)某文件,或者遗留了 console.log
在文件里。我十分讨厌如 删除 console.log
的提交。因此,我将添加文件至暂存区,就好像我要提交一样,接着运行命令:
git commit --amend --reuse-message HEAD
这个命令会将文件加入上次提交,并且重新使用旧的提交信息。我将它的别名设置为 git amend
,用于快速修正错误。
注意 基于底下评论区的回复,也可以使用命令 git commit --amend --no-edit
达到一样的效果。
在 origin/master 分支的顶部变基
旧的分支通常情况下会落后相当久远,久到我不得不准备好消除编译错误、ci 错误,或者解决冲突。此时我最喜欢使用以下命令:
git fetch origin # fetch latest origin
git rebase origin/master
通过这种方式,我将当前分支的提交都叠加在最新版本的 master 分支之上。
上次的提交
有时,git log
命令的结果冗长。由于我频繁使用的前文中提过的 amend
命令,我倾向于查看最后一条提交记录:
git log -1
签出到旧版文件 (比如一个锁文件!)
有时,我把某个与我的分支不相关文件搞坏了。这通常发生在锁文件上(mix.lock
、package-lock.json
等等)。我只是将这个文件“重置”回旧版本而不是还原一个可能包含许多其他内容的提交:
git checkout hash值 mix.lock
接着我就可以提交修复!
cherry-pick
我偶尔会使用这个被低估的命令。当一个分支变得老旧,有时候从中只获取真正需要的东西,比让整个分支跟上进度简单。举个例子,这个分支有关于 UI 或后端的冗余代码。在这种情况下,我可能只想从分支中挑选出特定的提交:
git cherry-pick hash值
这将会把提交带到你所处的分支。你也可以使用列表!
git cherry-pick 第一个hash值 第二个hash值 第三个hash值
你也可以使用区间:
git cherry-pick 开始的hash值..结束的hash值
参考日志
这是一个高级功能,以至于我几乎不用它。我的意思是,大概一年用一次。但是了解一下它还是挺好的。有时,我丢失了提交:我不小心删除了分支、重置或修改了一个提交。
在这些情况下,知道 reflog
的存在就挺好的。它不是你当前所处的分支的提交日志,它是你所有提交(包括了在失效分支之上)的日志。然而,这个日志将会随着时间推移被清空(pruned),因此只有有关的信息会保留。
git reflog
这个命令将返回一个日志,你可以在某个提交之上使用挑选或者变基。使用 pipe 管道命令连接 grep
之后非常强大。
Bash 命令别名
除了 git 命令,我也喜欢使用一些有趣的 bash 别名来帮助我的工作流。
当前分支
为了获取当前分支的名字,我有这个别名:
alias git-branch="git branch | sed -n -e 's/^\* \(.*\)/\1/p'"
当我运行 git-branch
或者在其它命令中运行 $(git-branch)
,我将得到我目前所在的分支的名字。
注意 基于评论区的回复,我将它切换为 git symbolic-ref --short HEAD
,可以达到一样的效果并且命令更具有可读性。
跟踪上游分支
虽然我确定配置 .gitconfig
可以解决问题,我暂时还没弄清楚如何做(译者注:使用命令 git config --global push.default current
,参见官方文档)。当我在新的分支上首次运行推送命令时,我总是被要求先设置上游分支的跟踪状态。这种情况下我使用别名:
alias git-up="git branch | sed -n -e 's/^\* \(.*\)/\1/p' | xargs git push -u origin "
现在当我运行 git-up
,我可以推送当前的分支并设置好上游分支的跟踪状态!
回复
基于评论中一些有用的反馈,我对我所使用的别名做了一些修改。
当前分支
似乎有许多新方式来获取当前的分支名称。如果你往上看,你将看到我使用了一个疯狂的 sed
命令来获取分支名称。
以下是我使用的新办法:
alias git-branch="git symbolic-ref --short HEAD"
它的运行与期望完全一样!
转载自:https://juejin.cn/post/6844904029554737165