五个高级Git概念介绍

127 阅读8分钟

五个高级的Git概念

学习如何利用这5个高级概念掌握GIT

Feature Image

对于一个软件开发者来说,学习使用Git基本上是工作描述中的一个要求。使用本地和远程仓库,提交修改,管理分支:这些都是Git的一些基础知识,你必须了如指掌。

但除了这些基础知识,Git 还提供了更多的高级命令,使你的生活更加轻松。它们可以提高你的工作效率,并解决你在与几十、几百个其他开发者合作项目时遇到的一些不太常见的问题。如果你一直想成为使用Git的专家,那么这些命令就应该放在你的手边。

在今天的教程中,我们将引导你了解这些高级的Git概念中的五个。从git bisectgit rebase,它们可以节省你在版本控制问题发生时翻阅Stack Overflow论坛的大量时间。


用git bisect快速查找bug

假设你正在贡献的版本库因为一个bug而有一些测试失败。没有人能够确定原因,也没有人能够确定是哪次提交导致的。找到那个错误的提交尤其困难,因为在最后一次提交之后,仓库里又有了数百个新的提交。

在这种情况下,Git bisect 可以让你快速找到产生错误的确切提交。当你提供一个已知的 "好 "的提交和 "坏 "的提交时,它使用二进制搜索来在最少的时间内到达第一个有问题的提交。

运行bisect操作时,以命令开始。

git bisect start

你可以通过使用git log 查看提交历史,来确定一个好的提交(一切都在按预期工作)和一个坏的提交(导致测试失败)的引用。你需要用以下两条命令向bisect提供这两个提交。

git bisect good <good-commit-ref>
git bisect bad <bad-commit-ref>

只要你运行git bisect bad ,它就会在好的和坏的提交之间的中点检查出提交,让你审查。如果在检查出来的提交中,测试仍然失败,你可以通过运行git bisect bad 让 bisect 知道。另一方面,如果它是一个好的提交,运行git bisect good

在这一步之后,bisect再次检查出更新的好提交和坏提交之间的中间提交,这样你就可以审查代码并运行测试来确定它是好是坏。它继续这个过程,直到它到达第一个坏提交。

你可以停止bisect操作,并使用到最后的提交。

git bisect reset

用git cherry-pick挑选和应用单个提交

尽管这并不经常发生,但我们有时会遇到这样的情况:我们想从版本库的另一个分支中挑选一个特定的提交,并将其应用到我们正在工作的分支中。

例如,你可能想把你错误地提交到另一个分支的修改,应用到正确的分支。或者你可能想把别人提供的解决方案应用到你正在工作的那个分支,而不需要从头开始写代码。如果你在这样的情况下使用git merge ,它可能会应用与你当前分支不相关的修改。

因此,在这种情况下,git cherry-pick 可能才是你应该使用的命令。

Cherry pick commit demonstration

Cherry pick commit示范

执行这条命令时,你应该先用日志检索出你想挑选的提交的引用。然后,检查出您想应用的提交的分支。

git checkout feature-1

现在,您可以应用该提交了。

git cherry-pick <commit-ref>

如果您想只在这个分支上进行修改而不提交,您应该使用。

git cherry-pick <commit-ref> --no-commit

值得注意的是,在某些情况下,使用这个命令可能不是最好的行动方案。取决于您如何使用git cherry-pick ,它可能会在您的分支中创建重复的提交。你所应用的提交也可能给你的分支带来新的错误和漏洞。因此,如果你使用 Git 来挑选提交,请确保这是你在尝试了所有其他选项后的最后手段。


用git rebase改变一个分支的基数

通常,我们使用git merge 命令来合并两个仓库分支的修改。如果我们在合并操作后查看版本库的提交历史,会因为两个分支的交错提交而感到困惑。

如果我们想通过让合并分支的历史与另一分支的历史保持线性一致,使项目的提交历史更容易被关注,该怎么办?这就是git rebase 的作用。

简而言之,rebase 命令的职责是改变一个分支的基本提交。让我们通过一个例子来讨论这到底是什么意思。

假设你的版本库中有两个分支:main 和 feature。创建特性分支后,你的团队在这两个分支上都添加了提交。但现在,你想在发布前将特性分支合并到主分支。git merge这时,可以在合并前对特性分支运行git rebase 。如下图所示,它会将特性分支的基数改为主干分支的最后一次提交。

Git rebase demonstration

Git rebase演示

与之前不同的是,rebase 命令给你的特性分支提供了一个与主分支线性兼容的历史。现在,如果你运行git merge ,主干分支的提交历史将不那么混乱,更容易理解。

使用这个命令很简单。首先,查看你想重新建立的分支。然后运行这个命令。

git rebase <base-branch-name>

然而,git rebase 是一个你应该谨慎使用的命令,因为它重写了一个分支的历史。在这个过程中,你可能会丢失存储在分支历史中的有用信息。如果你在一个有很多贡献者的分支上工作,它也会产生负面的影响。所以,除非你和所有团队成员100%达成一致,否则最好限制在个人分支上使用。


用git add -p轻松地选择要提交的文件

git add 命令是 Git 工作流程中的重要步骤之一。它对项目目录中需要提交的文件进行分级。根据不同的场合,我们使用不同版本的命令:

  • git add <file-path> 在特定的路径中放置文件。
  • git add . 对修改过的文件和新文件进行分段。

但如果你想在决定是否分阶段之前,逐个查看每个文件的变化(作为补丁),你可以使用git add -p 命令。它把对一个文件所做的修改显示为几个小块,并提示你选择是否对每个小块进行分期。

下面是Git为每块文件提供的选择。当提示你确认你的决定时,你应该输入相应的字母:

  • y: 对这块进行分级
  • n:不对该组块进行分段
  • q:退出;不对该组块或其余任何组块进行编排
  • a:将此块和文件中以后的所有块分阶段进行。
  • d:不对这一节或文件中的任何后一节进行阶段化处理
  • e:手动编辑当前的hunk

用git commit -amend修改您的最后提交信息

有多少次您发现自己想修改最后的提交,因为您犯了一个错误或者忘记添加一些重要的东西?git commit --amend ,您就可以这样做。

使用这条命令,您可以改变您的最后一次提交信息,或者将当前阶段的修改与之前的提交结合起来,而无需创建一个全新的提交。这一步并不只是改变上一次的提交,而是用一个全新的提交来代替它。

我们来看看如何使用这个命令来修改提交。

如果您想修改信息

git commit --amend -m <commit message>

如果您想合并阶段性的修改,首先用git add 添加修改的文件。然后像这样修改最后的提交。

git commit --amend --no-edit

如果你已经把最后一个提交推送到了远程仓库,你就必须使用git push --force-with-lease 命令来推送修改的提交。

还是那句话,由于这种修改操作会改变提交历史,所以你应该小心谨慎地对待何时何地使用它。


总结

在这篇文章中,我们介绍了五个高级的 Git 概念和命令,你可以用它们来实现高效的版本控制。然而,我们在这里讨论的只是Git提供给开发者的几个令人印象深刻的命令。但我们希望,当你遇到类似于我们在这里讨论的问题时,它们会派上用场。

如果你有任何喜欢的Git命令让你的生活更轻松,别忘了在下面的评论区分享它们。谢谢您的阅读!