12个Git高级命令,帮你提升应用Git的效率

众所周知,Git目前是分布式版本控制领域的佼佼者,围绕Git已经形成了完整的生态系统。学习Git,首先当然是学习Git的基本工作流程。与 SVN 等传统版本控制系统相比,Git 是分布式版本控制的强大工具。使用 Git 时常用的命令有 pull、commit、push 等,看起来很简单。但是,有时您会遇到合并冲突,Git 会标记冲突供您手动解决。有时git命令行拉取代码,您不小心将代码提交到错误的分支并推送到远程。有时您需要切换到不同的分支,但 Git 不会让您这样做,因为有未保存的更改。如果代码需要使用来自另一个分支的提交来修补怎么办?本文将介绍 12 个高级 Git 命令。合理使用这些命令可以大大提高 Git 应用的效率。

1. 使用 rebase 而不是 merge 来拉取上游更改

分支合并被记录为合并提交,这是有道理的。例如,这可用于识别新功能已合并到发布分支中。但是,当多个团队成员正在处理一个项目并使用常规 git pull 来同步分支时,提交时间线会被不必要的合并提交污染。更好的是,使用 git rebase 将功能分支变基为 master:

$ git checkout feature

这样做会将整个功能分支移动到主分支的开头,这将合并主分支上的所有新提交。但是,与使用合并提交相比,变基通过为原始分支中的每个提交创建一个新的提交来变基项目历史。变基的主要好处是您可以获得更清晰的项目历史记录。此外,这里有一些关于变基的陷阱的讨论。

2. 在执行 git rebase 后解决合并冲突

正如强大的力​​量伴随着巨大的责任一样。执行 git rebase 时,可能会遇到合并冲突。合并冲突意味着两次提交修改了同一文件的同一行,而 Git 不知道要应用哪个修改。这会导致如下错误消息:

Git 将为您提供 3 个选项来修复导致冲突的提交 (fa39187):

3. 临时保存更改

在工作进行中,有些事情往往处于凌乱的状态。如果此时需要切换到不同的分支怎么办?Git 不允许您这样做,因为仍有未保存的更改。坦率地说,你不想提交一个半成品,然后再修改它。解决这个问题的方法是使用 git stash 命令。Stash 会接收到工作目录的当前状态(如修改过的跟踪文件、暂存区修改等),并保存在未完成的修改栈中,以便以后随时修改。您可以使用以下命令暂存您的工作:

$ git stash

现在,工作目录是干净的:

$ git status# On branch featurenothing to commit, working directory clean

此时可以安全地切换分支来做其他事情。但别担心,暂存提交仍然存在:

$ git stash liststash@{0}: WIP on feature: 3fc175f fix race condition

稍后,回到功能分支后,您可以取回所有阶段性更改:

$ git stash popOn branch feature

关于分期,还有一些其他选项可用,如下所示:

$ git stash save "describe it" # give the stash a name$ git stash clear # delete a stashed commit$ git stash save --keep-index # stash only unstaged files

4. 克隆一个特定的远程分支

如果您想从远程存储库克隆特定分支怎么办?通常你会使用 git clone,但这样做也会克隆所有其他分支。一个方便的方法是使用 git remote add:

$ git init

5. 将cherry-pick 远程提交合并到它自己的分支中

更重要的是,如果您只想将远程存储库中的特定提交合并到您自己的分支中怎么办?您可以使用 git cherry-pick 选择具有给定 SHA 的提交,然后将其合并到当前分支中:

$ git cherry-pick

6. 应用来自不相关的本地存储库的补丁

如果您需要将另一个不相关的本地存储库中的补丁应用到当前存储库怎么办?答案是以下命令:

$ git --git-dir=/.git format-patch -k -1 --stdout | git am -3 -k

7. 忽略跟踪文件中的更改

如果您和您的同事在同一个分支上工作,您很可能需要经常执行 git 合并或 git rebases。但是,这样做可能会重置一些与环境相关的配置文件,这些文件在每次合并后都需要修改。相反,您可以使用以下命令永久告诉 Git 不理会本地文件:

$ git update-index --assume-unchanged

8. 每 X 秒运行一次 git pull

通常git命令行拉取代码,合并冲突的出现是因为您正在处理的本地存储库不再反映远程存储库的当前状态。这就是为什么我们每天早上都会先执行一次 git pull。或者,您可以在后台从脚本(或使用 GNU Screen)中每隔 X 秒调用一次 git pull:

$ screen

9. 将子目录分离到新的存储库中

有时,您可能需要将 Git 存储库中的特定目录转换为全新的存储库。这可以通过 git filter-branch 来实现:

$ git filter-branch --prune-empty --subdirectory-filter master# Filter the master branch to your directory and remove empty commitsRewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)

存储库现在将包含指定子目录中的所有文件。尽管所有以前的文件都被删除了,但它们仍然存在于 Git 历史记录中。现在可以将新的本地存储库推送到远程。

10. 清理

有时,Git 会提示“未跟踪的工作树文件”被“结帐覆盖”。这件事情是由很多原因导致的。不过,一般来说,我们可以通过使用以下命令保持工作树整洁来防止这种情况发生:

$ git clean -f # remove untracked files$ git clean -fd # remove untracked files/directories$ git clean -nfd # list all files/directories that would be removed

11. 将项目文件键入 tarball 并排除 .git 目录

有时,您需要向无权访问 GitHub 存储库的外部成员提供项目的副本。最简单的方法是使用 tar 或 zip 打包所有项目文件。但是,一不小心,隐藏的 .git 目录会包含在 tar 文件中,这会导致文件变大;同时,如果里面的文件和收件人自己的Git仓库混在一起,那就更让人头疼了。. 简单的方法是自动从 tar 文件中排除 .git 目录:

$ tar cJf .tar.xz / --exclude-vcs

12. 查找修饰符

最后,如果有混乱,你肯定想找出是谁造成的。如果生产服务器宕机,找到罪魁祸首就更容易了:只需执行 git blame 即可。该命令将显示文件中每一行的作者,提交哈希会找出该行的最后修改,并且还会查看提交的时间戳:

$ git blame

当然,还有很多 Git 命令。除了上面介绍的 12 条重要命令外,相信 InfoQ 的读者们在日常工作中也有一些自己喜欢且易于使用的命令。您可能希望以评论的形式与其他读者分享。

原文链接:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论