10个节省时间和改善工作流的Git技巧
这 10 个 Git 小技巧,不仅可以节省时间,而且能改善你的工作流程。
根据手册,Git 被定义为傻瓜式内容追踪器,它功能丰富,但有些功能却让人望而生畏。因此,我们只是重复使用那几个被记住的命令,而没有充分使用。
https://manpages.debian.org/stretch/git-man/git.1.en.html
1、技巧 1:优化配置
Git 在全局、用户和本地级别上都是高度可配置的。
https://git-scm.com/docs/git-config
查找顺序
每个设置都可以被覆盖:
$CWD/.git/config
▼ ▼ ▼
$HOME/.gitconfig`
▼ ▼ ▼
$HOME/.config/git/config
▼ ▼ ▼
/etc/gitconfig
修改设置
用你喜欢的编辑器或者 CLI 编辑任何配置文件:
# 全局设置
git config --global <keypath> <value>
# 本地设置
git config <keypath> <value>
如果值包含空格字符,则需要用引号引起来。
显示当前设置
# 显示当前设置及其来源
git config --list --show-origin
一些有用的配置
# 设定身份
git config --global user.name "<your name>"
git config --global user.email <your email>
# 推荐编辑器
git config --global core.editor vim
# 证书缓存
# WINDOWS
git config --global credential.helper manager
# (超时时间——以秒为单位)
git config --global credential.helper "cache --timeout=3600"
# MACOS
git config --global credential.helper osxkeychain
https://git-scm.com/docs/gitcredentials
2、技巧 2:别名(alias)
创建一个别名来保存常用的 git 命令:
# 创建别名
git config --global alias.<alias-name> "<git command>"
# 使用别名
git <alias-name> <more optional arguments>
一些有用的别名
# 撤销上次提交
git config --global alias.undo "reset --soft HEAD^"
# 将暂存区更新修订到上次提交 (不改变提交信息)
git config --global alias.amend "commit --amend --no-edit"
# 压缩的状态输出
git config --global alias.st "status -sb"
# 用 GRAPH 为日志着色
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"
# 删除所有已合并的分支
git config --global alias.rmb "!git branch --merged | grep -v '*' | xargs -n 1 git branch -d"
# 贡献排行
git config --global alias.rank "shortlog -n -s --no-merges"
3、技巧 3:查找 Commits 和更改
通过 Commits 信息查找
# 通过 commit 信息查找 (所有分支)
git log --all --grep='<search term>'
# 通过 commit 信息查找 (包含 reflog)
git log -g --grep='<search term>'
通过更改查找
# 通过更新的内容查找
git log -S '<search term>'
通过日期查找
# 通过日期范围查找
git log --after='DEC 15 2019' --until='JAN 10 2020'
4、技巧 4:添加 hunk
git add <filepath>不仅能添加文件的所有变更,--path / -p参数还可以交互式暂存区块。
# 补丁命令
y = 暂存区块
n = 不暂存这个区块
q = 退出
a = 暂存当前文件的此区块以及所有剩余区块
d = 不暂存当前文件的此区块以及所有剩余区块
/ = 查找区块 (正则表达式)
s = 划分成更小的区块
e = 手动编辑区块
? = 打印帮助说明
g = 选择要前往的区块
j = 将区块设为未定,查看下一个未定区块
J = 将区块设为未定,查看下一个区块
k = 将区块设为未定,查看上一个未定区块
J = 将区块设为未定,查看下一个区块
https://git-scm.com/docs/git-add#Documentation/git-add.txt--i
5、技巧 5:储藏(stash)更改而不提交
stash 将当前的更改临时搁置起来。在它的帮助下,可以返回当前状态的索引,并能在稍后应用已储藏的更改。
默认情况下,仅储藏当前跟踪文件中的更改,新文件将被忽略。
我们可以独立地创建和应用多个 stash。
https://git-scm.com/docs/git-stash
创建
# 创建新的 STASH
git stash
# 创建新的 STASH (包含未追踪的更改)
git stash -u/--include-untracked
# 创建新的 STASH 并命名
git stash save "<stash name>"
# 交互式储藏
git stash -p
罗列
# 列出所有的 STASH (为其他命令提供"n")
git stash list
浏览
# 浏览 STASH 内容
git stash show
# 浏览 STASH 差异
git stash show -p
应用
# 应用上一个 STASH (删除 stash)
git stash pop
# 应用上一个 STASH (保留 stash)
git stash apply
# 应用特定的 STASH (n = stash 列表序号)
git stash pop/apply stash@{n}
# 从 STASH 创建新的分支 (n = stash 列表序号)
git stash branch <new branch name> stash@{n}
# 从 STASH 应用单个文件 (n = stash 列表序号)
git checkout stash@{n} -- <filepath>
清理
# 删除特定的 STASH (n = stash 列表序号)
git stash drop stash@{n}
# 删除所有的 STASH
git stash clear
6、技巧 6:空运行(Dry Run)
许多 git 操作可能具有破坏性,例如,git clean -f将删除所有未跟踪的文件,而且无法恢复。
要避免出现这种灾难性的结果,许多命令都支持dry-run,可以在实际产生结果前对其进行检查。不过遗憾的是,使用的选项不完全一致:
git clean -n/--dry-run
git add -n/--dry-run
git rm -n/--dry-run
# GIT MERGE 模拟 DRY-RUN
git merge --no-commit --no-ff <branch>
git diff --cached
git merge --abort
请注意,git commit -n根本不是dry-run!它实际上是--no-verify,作用是忽略所有pre-commit/commit-msg githooks。
7、技巧 7:安全强制推送
在处理旧的 commit、创建新的 head 等情况时时很容易弄乱分支。git push --force可以覆盖远程变更,但不应该这样做!
git push --force是一种具有破坏性且危险的操作,因为它无条件生效,并且会破坏其他提交者已经推送的所有 commit。这对于其他人的代码仓库来说不一定是致命的,但是改变历史记录并影响其他人并不是一个好主意。
更好的选择是使用git push --force-with-lease。
git 不会无条件地覆盖上游的远程仓库,而是检查是否有本地不可用的远程更改。如果有,它会失败并显示一条“stale info”消息,并告诉我们需要先运行git fetch。
https://git-scm.com/docs/git-push#Documentation/git-push.txt---force-with-leaseltrefnamegt
8、技巧 8:修改 commit 信息
Commit 是不可变的,且不能更改。不过可以用一条新的 commit 信息修订现有的 commit,这会覆盖原始 commit,因此请勿在已推送的 commit 中使用它。
git commit --amend -m "<new commit message>"
https://git-scm.com/docs/git-commit#Documentation/git-commit.txt---amend
9、技巧 9:修改历史
修改代码仓库的历史不仅限于修改上次提交信息,使用git rebase可以修改多个提交:
# 提交的范围
git rebase -i/--interactive HEAD~<number of commits>
# 该 hash 之后的所有提交
git rebase -i/--interactive <commit hash>
在配置的编辑器中倒序列出所有的 commit,像这样:
# <command> <commit hash> <commit message>
pick 5df8fbc revamped logic
pick ca5154e README typos fixed
pick a104aff added awesome new feature
通过更改编辑器中的实际内容,可以为 git 提供一个方案,来说明如何进行 rebase:
# p, pick = 使用提交而不更改
# r, reword = 修改提交信息
# e, edit = 编辑提交
# s, squash = 汇合提交
# f, fixup = 类似"squash",但是会丢弃提交信息
# x, exec = 运行命令 (其余行)
# d, drop = 移除提交
保存编辑器后,git 将运行该方案以重写历史记录。e, edit会暂停 rebase,就可以编辑代码仓库的当前状态。完成编辑后,运行git rebase --continue。
如果过程中出现问题(例如合并冲突),我们需要重新开始,可以使用git rebase --abort。
https://git-scm.com/docs/git-rebase
10、技巧 10:存档跟踪文件
可以使用不同格式(zip或tar)来压缩特定引用的跟踪文件:
git archive --format <format> --output <filename> <ref>
<ref>可以是一个分支、commit hash 或者一个标签。
https://git-scm.com/docs/git-archive
11、额外提醒:单破折号
有一个快捷方式可以表示刚用过的分支:一个单破折号-
git checkout my-branch
# 当前分支:my-branch
<do some git operations, e.g. adding/commiting>
git checkout develop
# 当前分支:develop
git merge -
# 将 my-branch 合并到 develop
单破折号等同于@{-1}。
https://git-scm.com/docs/git-checkout#Documentation/git-checkout.txt-ltbranchgt
12、总结
Git 还有很多话题可谈,这里只涉及一些皮毛。在另一篇文章中,我想展示如何用git bisect有效查找损坏的 commit,或者如何通过git reflog来运用任意git操作的完整历史记录。
相关阅读:
https://levelup.gitconnected.com/10-git-tips-to-save-time-and-improve-your-workflow-db45877a1152
声明:文章收集于网络,版权归原作者所有,为传播信息而发,如有侵权,请联系小编删除,谢谢!
时间:2020-03-02 23:12 来源: 转发量:次
声明:本站部分作品是由网友自主投稿和发布、编辑整理上传,对此类作品本站仅提供交流平台,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,不为其版权负责。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。
相关文章:
- [数据挖掘]Angular、React 和 Vue 三大框架,Web 开发该如何选择
- [数据挖掘]Pinterest 搜索系统实时化的挑战和建设实践
- [数据挖掘]计算虚拟化:VMware和Nvidia联手!
- [数据挖掘]容器or虚拟机?
- [数据挖掘]DataOps、MLOps 和 AIOps,你要的是哪个Ops?
- [数据挖掘]轻松快速地调整Kubernetes的CPU和内存
- [数据挖掘]Rust 和 C 性能对比:排序
- [数据挖掘]使用Prometheus和Grafana构建Redis实时监控平台
- [数据挖掘]让你大吃一惊的10个大数据统计
- [数据挖掘]2021年编程语言趋势预测:Python和JavaScript仍火热,
相关推荐:
网友评论:
最新文章
热门文章