如何仅通过一个“验证”来进行 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
,但将a
、b
、c
和d
转换为单个提交,我将其称为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
这可能看起来没有任何改进,但实际上squash
与a
和b
和c
和d
挤在一起是一样的。所以我们需要做的就是把它们扔掉,把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
是旧 a
和 b
和 c
和 d
的总和,这正是您要寻找的。现在,如果您想使用 actual
做更多事情,您可以这样做,但分支历史看起来就像您想要的那样。
【讨论】:
这对我来说似乎很复杂,但确实正是我正在寻找的。我会试试这个,非常感谢您的帮助和您花费的时间。 好吧,在现实生活中可能有更短的方法。就我个人而言,我只会使用您不想使用的交互式变基。但这似乎是您的问题的一个前提,您不想这样做。以上是关于如何仅通过一个“验证”来进行 Git rebase的主要内容,如果未能解决你的问题,请参考以下文章