当前位置: 首页 > 科技观察

掌握强大的GitRebase命令

时间:2023-03-16 12:06:02 科技观察

跟人聊起Git的时候,几乎每个人都对gitrebase命令有很深的印象,导致很多人遇到问题不得不改目录,删仓库,再clone又是一个仓库。我认为这是因为他们误解了分支的工作原理,遇到了一个非常糟糕的默认界面,并且有一些合并冲突把事情搞砸了。为什么我找不到gitsquash命令?如果你在本地仓库提交了很多次,想把这些提交合并为一个提交,那我们就介绍一下可以使用哪些Git命令来达到这个目的。Git将这个概念称为“压缩提交”。我在编写文档时发现了这个概念:我花了十几次提交才让我的Markdown文档正确,但是存储库的维护者不想看到我所有的尝试,以免他们弄乱项目的历史,所以我被告知“需要压缩你的提交”。压缩提交听起来是一种有用的方法。但只有一个问题:我不知道该怎么做。作为Git的新手,我做了任何人都会做的事情:我去查阅git-squash的手册,但我立即遇到了障碍:$mangit-squash>Nomanualentryforgit-squashIfoundInsteadofasingleGit在名为squash的命令中,我被要求运行一个完全独立的命令:gitrebase命令,它最终将我所有的提交合并为一个。我知道我遇到过一种常见的情况,即使用某个工具已有一段时间的人使用行话或引用了一个对他们来说非常清楚但对新手来说没有意义的概念。从概念上讲,情况是这样的:6碗不同图像颜色的香料,一个箭头指向混合到一个碗中的所有香料的第二个图像。我说这些是为了鼓励你,你绝对不是第一个或最后一个被Git或谈论Git的人所迷惑的人。您可以请对方澄清他的意见,并帮助您正确使用命令。存储库维护者的实际意思是,“使用gitrebase命令将许多提交压缩为一个提交”。现在让我们学习gitrebase命令。gitrebase命令将从它的第一个父提交链中删除一个提交链,并将其放在另一个提交链的末尾,将两个提交链组合成一个长链而不是两个平行链。我意识到这是一个复杂的定义。回想一下Git的提交是如何链接在一起的,您可以看到,除了最初的主(或主)分支外,任何分支都有一个父提交作为链的“基础”。“Rebase”使另一个链中的最后一次提交成为指定分支的新“基本提交”。在Git中集成来自不同分支的更改主要有两种方式:merge和rebase。您可能更熟悉gitmerge命令。接下来,让我们看看[git-scm.com]如何解释gitmerge和gitrebase之间的区别:Gitmerge与gitrebase的图像显示为带编号的气泡。在合并示例中,它会合并两个分支(C3和C4)和它们最近的共同祖先(C2)的最新快照,而合并的结果是生成一个新的快照(C5)。实验的分支指针依然存在,依然指向C4。在rebase示例中,它提取了C4中引入的补丁和修改,并将它们应用到C3之上,使C3成为C4的新父级,并生成了一个名为C4'的新提交。(LCTT译注:具体命令如下:$gitcheckoutexperiment$gitrebasemainFirst,rewindingheadtoreplayyourworkonit'stop...Applying:addedstagedcommand它的原理是先找到这两个分支——也就是,当前分支experiment,rebase操作的目标基分支main——最近的公共祖先C2,然后比较当前分支相对于祖先的先前提交,提取相应的变化和保存为临时文件,然后将当前分支指向目标库C3,最后依次应用保存为临时文件的修改。)值得注意的是,分支指针main没有移动。要让Git将指针移动到链的末尾(由experiment指向),您还需要执行合并。(LCTT译注:具体命令如下:$gitcheckoutmain$gitmergeexperimentmasterBranchfast-forwardmerge此时,C4'指向的快照与上例中C5使用merge命令的快照相同指向的是完全相同的。)gitrebase不是gitmerge的替代品。gitrebase是一个清理历史的工具,与gitmerge结合使用。(LCTT译注:使用gitrebase命令将所有提交到一个分支的更改移动到另一个分支,就像“重放”一样。)交互式rebase可以给你一个更友好的界面!从命令行执行gitrebase命令最可怕的是它可怕的默认界面。运行命令gitrebase要么有效,要么一团糟,因为它没有太多反馈,也没有办法确保它按照您的意愿进行操作。幸运的是,gitrebase命令和许多其他Git命令一样,具有交互模式,您可以使用参数-i或-interactive来使用交互模式。VSCode中的Gitlens交互式Rebase工具的图像。当使用交互模式时,gitrebase从一个可怕的黑框界面转变为一个选项菜单,允许您选择如何处理您正在变基的提交链。做。对于每个提交,您可以选择:pickpick:按原样包含rewritereword:重写提交消息writeedit:在rebase完成之前对提交中的文件进行进一步更改squashsquash:将多个提交压缩为一个提交,keepallcommitmessagesfixup:compressmultiplecommitsintoacommit,butkeeponlythelastcommitmessagedropdrop:discardthiscommit个人比较喜欢VSCode的开源GitLens扩展下拉选择列表的使用方式布局选项,但Git允许您使用任何编辑器选择这些选项。使用Emacs或Vim等纯文本工具,您需要键入选择而不是从菜单中选择,但最终结果仍然相同。何时变基知道何时变基与知道如何做一样重要。事实上,如果您不关心您的存储库的提交历史有点混乱,您永远不能使用gitrebase命令。但是,如果您想要更清晰的历史提交消息,并且希望更少的提交使您的图形视图变得混乱,那么在使用gitrebase命令时请牢记一条重要的经验法则:“不要在您的存储库之外对提交进行变基,这可能成为别人工作的基础。”如果您遵循该准则,则不会发生重大问题。简而言之,如果您让本地分支机构完成您的工作,那么rebase是没有问题的。但是一旦该分支被推送,希望您会认为以上内容可以帮助您了解gitrebase命令的工作原理,并让您更有信心地使用它。与任何Git命令一样,实践是学习和理解如何执行它的唯一途径。我鼓励你勇敢地尝试interactiverebasegitrebase-i!接下来,学习Gitcherry-pick命令。大多数开发人员将他们的更改提交到某个分支,却发现他们一直提交到错误的分支。理想情况下,他们可以接受该提交并将其移动到正确的分支,这就是gitcherry-pick命令所做的。gitcherry-pick命令利用了变基单个提交的方法。这种用法非常普遍,以至于它有自己的命令。一个女人从一棵树上摘下一颗樱桃并放在另一棵树上的图像。要使用gitcherry-pick你只需要告诉Git你想要移动到“那个分支”的提交ID(通过HEAD指向):$gitcherry-pick如果出现问题,你可以根据到Git提供的错误消息:$gitcherry-pick-i2bc01cdAuto-mergingREADME.mdCONFLICT(content):MergeconflictinREADME.mderror:couldnotapply2bc01cd…addedEOFlineshint:Afterresolvedtheconflicts,markthemwithhint:“gitadd/rm”,然后运行提示:“gitcherry-pick--continue”。提示:您可以使用“gitcherry-pick--skip”跳过此提交。提示:中止并返回之前的状态“gitcherry-pick”,提示:运行“gitcherry-pick--abort”。$gitcherry-pick--abort让Git变得强大gitrebase命令是Git实用程序的强大力量之一。你最好先在测试仓库中练习如何使用它。一旦熟悉了它的概念和工作流程,就可以给仓库一个清晰的历史消息记录。