`git rebase --skip` 在 rebase 过程中跳过了什么内容?

13

当你执行rebase操作时,如果Git无法解决当前分支和新基础分支之间的差异,它会要求手动干预。

如果你解决了冲突并键入git rebase --continue,Git会将解决后的代码视为该提交的“新代码”。

但是当你使用git rebase --skip命令时会发生什么?由于存在冲突,它不能保留代码原样,所以它必须执行更多的操作而不只是“跳过”。

1个回答

21

如果发生冲突,git rebase --skip命令将直接跳过整个提交记录。在成功完成变基后,该提交所做的更改将不会出现在历史记录中。让我们看一个例子。

A-B-C <- master
 \
  D-E <- foo

现在假设D引起了一个冲突。

git checkout foo
git rebase master

然后运行git rebase --skip会得到以下结果:

A-B-C <- master
     \
      E' <- foo

其中E'包含与E相同的文本更改。


@adc17 不,更改一开始就不存在于 E 中。它们在 rebase 完成后不会出现在新分支中。 - Code-Apprentice
1
请注意,每个提交都是自上一次提交以来增量变更的集合。所有文件的本地副本是当前分支(或如果您没有签出分支,则为HEAD)的所有提交的累积。由于 E 不包含 D 的更改,E' 也不会包含它们。 - Code-Apprentice
1
谢谢,这正是阻碍我的问题。所以听起来 git rebase --skip 更像是 git rebase --delete-commit-and-continue - achalk
@adc17 在我的例子中,提交 D 没有 被删除。它仍然存在于存储库中,但已经被孤立,因为它不在任何分支的历史记录中。同样,原始提交 E 也存在。如果您理解每个提交不仅包含我之前描述的代码更改,而且还包含对其父级的引用,则会更有帮助。两个包含相同文本更改但具有不同父级的提交是不同的提交。这就是为什么我在 rebase 后使用名称 E' 的原因。这是一个新的提交,它包含与 E 相同的更改,但具有不同的父级。 - Code-Apprentice
2
@adc17,“跳过”更合适,因为git rebase会在分支“foo”上复制每个提交,我们告诉它只需跳过复制D。 - Code-Apprentice
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接