掌握强大的 Git 变基命令 | Linux 中国

2022-12-30 0 862

原副标题:掌控强悍的 Git 变基指示 | Linux 我国

掌握强大的 Git 变基命令 | Linux 中国

编者按:自学怎样采用 Git 来挖空、变基和优选。                                       

责任编辑页数:4703,写作时数约: 6两分钟

自学怎样采用 Git 来挖空、变基和优选。

当我与自己谈到 Git 时,基本上每一人都对 git rebase 指示 🔗 opensource.com 有两极化的第一印象,那个指示让许多人碰到了难题,而不得已更动产品目录、删掉库房、接着再再次布季夫两个库房。我指出这是因为她们误会了组成部分是怎样组织工作,碰到了两个十分差劲的预设介面,除了许多分拆武装冲突把事搞得一塌糊涂。

是不是找不出 git squash 指示?

假如你曾在邻近地区的库房递交过很数次,并期望能把那些递交都分拆为两个提交,接下去,我们就来如是说能用甚么 Git 指示达至那个目地。Git 称那个基本概念为 “ 挖空递交 (squash commits) ”。我在撰写文件格式时辨认出了那个基本概念:我花了十多个递交才修正好我的 Markdown 文件格式,但库房的贡献者不该看见我的大部份试著,以防搅乱了此项目地发展史,因此我被知会“须要挖空你的递交”。

挖空递交听出来是两个很管用的方式。但多于两个难题:我不晓得该是不是做。做为 Git 的初学者,我做了其他人会做的事:我去翻查 git-squash 的指南,但我立刻碰到了妨碍:

$ mangitsquash

>Nomanual entry forgitsquash

我辨认出没有两个名为 squash 的 Git 指示,而是被要求 运行两个完全独立的指示:git rebase 指示 🔗 opensource.com ,该指示能将我的大部份递交最终分拆为两个递交。

我晓得我碰到两个常见的情形:已经采用工具一段时间的人采用了行话或引用了两个基本概念,那个基本概念对她们来说是十分清楚的,但对初学者来说就不能明白了。从基本概念上讲,那个情况看出来是这样的:

Image of 6 bowls of different colored spices, and an arrow pointing to the second image of all the spices blended into one bowl.

我这样说是为了鼓励你,你绝对不是第两个或最后两个 被 Git 或谈论 Git 的人弄糊涂的人。你可以要求对方说明白他的意见,并帮助你应该采用的正确指示。库房的贡献者实际上的意思是,“采用 git rebase 指示**,将很多递交挖空成两个递交”。

现在就来自学 git rebase 指示吧

git rebase 指示会将两个递交链从其第两个父级中删掉,并将其放置在另两个递交链的末尾,将两个递交链组合成两个长链,而不是两个并行链。我意识到这是两个很复杂的定义。

回想一下 Git 的递交是怎样链接在一起的,你可以看见,除了初始的 main (或 master )组成部分外,任何组成部分都有两个 父递交 (parent commit) 做为该链的 “ 基础 (base) ”。“ 变基 (rebase) ” 能使另两个链中的最后两个递交成为指定组成部分的新 “ 基础递交 (base commit) ”。

在 Git 中整合来自不同组成部分的修正主要有两种方式: 分拆 (merge) 以及 变基 (rebase) ,你可能更熟悉 git merge 指示。接下去,就来看看 [ git-scm.com 🔗 git-scm.com ] 是怎样解释 git merge 和 git rebase 的差异:

Image of Git merge versus git rebase shown as numbered bubbles.

在分拆示例中,它会把两个组成部分的最新快照( C3 和 C4 )以及二者最近的共同祖先( C2 )进行三方分拆,分拆的结果是生成两个新的快照( C5 )。 experiment 的组成部分指针仍然存在,仍然指向 C4 。

在变基示例中,它提取在 C4 中引入的补丁和修正,接着在 C3 的基础上应用一次,使 C3 成为 C4 的新父级,并产生了两个名为 C4 的新递交。

(LCTT 译注:具体的指示如下:

$ gitcheckout experiment

$ gitrebase main

First,rewinding headto replay your work on topof it

Applying:added staged command

它的原理是首先找到这两个组成部分 —— 即当前组成部分 experiment 、变基操作的目标基底组成部分 main —— 的最近共同祖先 C2 ,接着对比当前组成部分相对于该祖先的历次递交,提取相应的修正并存为临时文件,接着将当前组成部分指向目标基底 C3 ,最后以此将之前另存为临时文件的修正依序应用。)

值得注意的是,组成部分指针 main 没有移动。要让 Git 将指针移动到链的末尾(由 experiment 指向),你还须要执行分拆。

(LCTT 译注:具体的指示如下:

$ gitcheckout main

$ gitmerge experiment

master 组成部分的快进分拆

此时, C4 指向的快照就和上面采用 merge 指示的例子中 C5 指向的快照一模一样了。)

git rebase 并不能替代 git merge 。 git rebase 是一种用于制作更清晰的发展史记录,以与 git merge 结合采用的工具。

(LCTT 译注:采用 git rebase 指示将递交到某一组成部分上的大部份修正都移至另一组成部分上,就好像“再次播放”一样。)

交互式变基能给你两个更友好的介面!

从指示行执行 git rebase 指示,最可怕的地方在于它 差劲的预设介面。运行指示 git rebase <target-refr> 要么有效,要么会变得一塌糊涂,因为它没有太多的反馈或方式来确保它做你想做的事。幸运的是, git rebase 指示和许多其他 Git 指示一样,具有 交互模式 (interactive mode) ,你可以采用参数 -i 或者 -interactive 来采用交互模式。

Image of the Git lens interactive Rebase tool in VS Code.

在采用交互式模式时, git rebase 会从两个差劲的黑框介面转换为两个 选项菜单,允许你选择对正在变基的递交链所做的事。对于每一递交,你可以 选择

◈ 选用 (pick) :按原样包含

◈ 重写 (reword) :重写递交消息

◈ 撰写 (edit) :在变基完成之前对递交中的文件进行进一步更动

◈ 挖空 (squash) :将多个递交压缩成两个递交,保留大部份递交消息

◈ 修理 (fixup) :将多个递交压缩成两个递交,但只保留最后两个递交消息

◈ 丢弃 (drop) :丢弃此递交

就我个人而言,我更喜欢 VS Code 的开源 GitLens 扩展 🔗 marketplace.visualstudio.com 采用下拉选择列表布局选项的方式,但 Git 允许你采用任何编辑器选择那些选项。对于 Emacs 或 Vim 等纯文本工具,你须要键入选择,而不是从菜单中选择,但最终结果仍然是相同的。

何时做变基

晓得 何时做变基与晓得 怎样做变基同样重要。事实上,假如你不在乎你的库房历史递交消息有点混乱的话,那么你可以永远都不采用 git rebase 指示。但,假如你想要更干净的发展史递交消息,并且想要更少搅乱你的图形视图的递交,那么当你采用 git rebase 指示时,有两个重要的经验法则须要时刻记住:

“不要变基你存储库以外的的递交,那些递交可能是自己组织工作的基础。”

假如你遵循该准则,不会发生甚么大难题的。

简而言之,假如你让两个 邻近地区组成部分来完成你的组织工作,变基是没有难题的。但一旦该组成部分被 推送 (push) 了,就不要再变基该组成部分了。当然,你想要是不是做完全取决于你自己。

期望你会指出上述内容有助于你理解 git rebase 指示的组织工作原理,并能让你更有信心地采用它。与任何 Git 指示一样,练习是自学和理解是不是做的唯一方式。我鼓励你勇敢地试著 交互式变基 (interactive rebase) git rebase -i <branch name> !

接下去自学 Git cherry-pick 指示吧

大多数开发人员将修正递交到某一组成部分上,但之后辨认出她们一直 递交到了错误的组成部分上。理想情况下,她们可以拿走那个递交,接着把它移到正确的组成部分,这正是 git cherry-pick 指示的作用。

git cherry-pick 指示利用了变基单个递交的方式。这一用法十分常见,以至于有了它自己的指示。

Image of a woman picking a cherry from one tree and putting on another tree.

要采用 git cherry-pick ,你只需告诉 Git 你要移动到“那个组成部分”的递交 ID(由 HEAD 指向):

$ gitcherrypick <targetref>

假如出现难题,你可以根据 Git 提供的错误消息,来进行恢复:

$ gitcherrypick i 2bc01cd

Automerging README.md

CONFLICT (content):Mergeconflict inREADME.md

error:could notapply 2bc01cdadded EOF lines

hint:Afterresolving the conflicts,mark them with

hint:“git add/rm “,thenrun

hint:“git cherry-pick –continue”.

hint:Youcan instead skip thiscommit with“git cherry-pick –skip”.

hint:Toabort andgetback to the state before“git cherry-pick”,

hint:run “git cherry-pick –abort”.

$ gitcherrypick abort

让 Git 更强悍

git rebase 指示是 Git 实用程序强悍的地方之一。你最好在测试库房中先练习一下是不是采用,一旦你熟悉了它的基本概念和组织工作流程,你就可以给库房两个清晰发展史消息记录了。

via: https://opensource.com/article/22/11/advanced-git-commands

作者: Dwayne McDaniel 选题: lkxed 译者: chai001125 校对: wxy

责任编辑由 LCTT 原创编译, Linux我国 荣誉推出

LCTT 译者 :chai001125

🌟🌟🌟

翻译: 21.0

|

贡献: 62

2022-10-06

2022-12-07

https://linux.cn/lctt/chai001125

欢迎遵照 CC-BY-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修正”。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务