如何仅通过一个“验证”来进行 Git rebase

Posted

技术标签:

【中文标题】如何仅通过一个“验证”来进行 Git rebase【英文标题】:How to Git rebase with only one "verification" 【发布时间】:2021-11-24 21:47:05 【问题描述】: 你好 !我需要帮助的每个人请... 我有 : (主) (实际上是我的分支) 提交 old-1(今天) 提交 old-2(昨天) commit old-3 (1950...)

我想用 rebase 压缩我所有的旧提交 但是我的分支很老了......而且我有很多无用的提交。 当我这样做时

$ .../.../..(mybranch-actually): git rebase -i origin/master

它让我对每个提交(old-1、old-2、old-3)进行差异检查。但是 没用,我希望他只检查我最近的 提交(旧 1 与主人) 并且 ** 直接压缩 mybranch 中的所有其他提交 - 实际上** 无需验证

【问题讨论】:

git merge --squash 没有成功? 【参考方案1】:

据我了解,您希望将 old-1 保留为单独的提交,但将 old-2 中的所有内容压缩回某个起点,并放入单个提交中。而且你不想用交互式 rebase 来做这件事。

我确信有一些聪明的方法可以做到这一点,但这里有一个简单的方法。我将从这种情况开始:

* 699abbb (HEAD -> actual) e
* 6c924b6 d
* 51c7c64 c
* 2f15c0c b
* ae36341 a
| * c785b2c (main) second
|/  
* e77cdf8 start

我的目标是保留e,但将abcd 转换为单个提交,我将其称为squash。开始了。请注意,我实际上是在 actual 开始的:

git switch -c temp HEAD~1
git reset --soft e77cdf8
git commit -msquash

我们现在有了这个:

* 56d04c1 (HEAD -> temp) squash
| * 699abbb (actual) e
| * 6c924b6 d
| * 51c7c64 c
| * 2f15c0c b
| * ae36341 a
|/  
| * c785b2c (main) second
|/  
* e77cdf8 start

这可能看起来没有任何改进,但实际上squashabcd 挤在一起是一样的。所以我们需要做的就是把它们扔掉,把e贴在temp的末尾,紧跟在squash之后。那好吧:

git switch actual
git rebase --onto temp actual~1 actual
git branch -d temp

现在我们有了这个:

* f259d42 (HEAD -> actual) e
* 56d04c1 squash
| * c785b2c (main) second
|/  
* e77cdf8 start

正如我所说,squash 是旧 abcd 的总和,这正是您要寻找的。现在,如果您想使用 actual 做更多事情,您可以这样做,但分支历史看起来就像您想要的那样。

【讨论】:

这对我来说似乎很复杂,但确实正是我正在寻找的。我会试试这个,非常感谢您的帮助和您花费的时间。 好吧,在现实生活中可能有更短的方法。就我个人而言,我只会使用您不想使用的交互式变基。但这似乎是您的问题的一个前提,您不想这样做。

以上是关于如何仅通过一个“验证”来进行 Git rebase的主要内容,如果未能解决你的问题,请参考以下文章

Git在rebase时如何保留merge commit(实用!)

git rebase 成功之后如何撤销

Git: git rebase 用法小结 (转)

git rebase详解

git rebase 压缩提交

Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别