为什么拉取请求在变基后显示额外提交?

Why does a pull request show extra commits after a rebase?

所以我从一个 pull request 开始,它比 develop 提前了几次提交,我们称这个分支为 feature.

feature 与开发有 1 次合并冲突。所以我决定对其进行变基并解决冲突。

  1. git checkout develop git pull
  2. git checkout feature git pull
  3. git rebase develop
  4. 合并冲突已修复 - 添加了新提交
  5. git rebase --continue
  6. 变基成功。
  7. git push(我实际上是在使用“同步更改”)

完成这些步骤后,gitHub 上的 PR 从 7 次提交变成了 60 多次提交。

我原以为它只会提交 7 次到 8 次,因为我解决了一个冲突。

知道发生了什么以及如何(如果需要)解决它吗?

如果需要,我可以 post 其他信息


编辑,这就是我遇到问题的原因:

仔细检查您是从控制台使用 git push --force,而不是使用 vscode 中的 git sync 按钮:

REBASE 后永不同步

改用git push --force

问题可能是您的 feature 分支可能已从某个不同的分支签出,比方说 test,这已经有很多提交了。因此,即使你从你提出反对的同一个分支重新建立基础,你也会得到提交不一致。要解决这个问题,我知道的一种方法是,从 develop 分支创建一个新分支,然后从 feature 分支中挑选你们所有的提交。

查看您的分支机构的 git 日志并尝试找出任何异常之处。

一条评论提到使用 git log,但您也可以使用 git log --graph --oneline 来直观地表示您的分支的提交历史记录。如果您的分支正确地重新定位,您会看到类似以下内容的内容:

* 5eccc30d1 (HEAD -> feature, origin/feature) # Your commit message 8
* 5f73d262a # Your commit message 7
* 6c636b744 # Your commit message 6
* 97e17a7cf # ...
* 596297507 # ...
* 4646ce633 # ...
* 9fb61eb95 # ...
* 38dab17ae # Your commit message 1
*   7532142f7 (origin/develop) Merge pull request #...
|\
| * 042303c7e Add feature
* |   008f1e53b Merge pull request #...
|\ \
| * | 5a398f715 Fix issue with #...
# And so on

与此进行比较,并尝试找出任何异常之处。你第一次提交下面的提交应该是你的基础分支,你写的那些之间不应该有任何提交。

我怀疑在您的功能分支中使用 git pull 可能存在问题。如果您自己正在处理此 PR,则没有理由这样做,因此可能会出现问题。

如果您需要拉取您的功能分支,请尝试使用 git pull --rebase 代替,这等同于获取和变基,而不是获取和合并。这确保您的本地提交保持在您的历史记录之上,以防您的本地分支和您的来源之间存在差异。

这是可能发生的想法。

当您继续将提交添加到将变基的分支时,可能会发生这种情况。 假设我们有两个分支 masterdev.

master A-B-C
         |
dev      D-E-F

现在我们推送dev审核。
等审核的时候又有新任务了。分支 dev 获得新提交,因此在本地看起来像:

dev A-B-D-E-F-G

注意分支 dev 中没有 C 提交。之后您的拉取请求被接受并且您远程(例如在 github 中)将您之前的更改重新设置为 master:

master A-B-C-D'-E'-F'

到那时你已经有了分支 master,其中复制了 D'-E'-F' 提交,从 C 提交开始。 但是你的本地 dev 不同,它没有 D'-E'-F' 因为它有 D-E-F。更何况它还没有C提交。

master A-B-C-D'-E'-F'
dev    A-B-D-E-F-G

现在您又想使用变基将提交 G 添加到 master 中。
两个分支的公共部分是 A-B。所以当你重新开始时,git 不承认 D' 和 D 是相同的,因为它们从不同的点开始(对于 dev 它从 B 开始,对于 master 它从 C 开始) .因此,在新拉取请求的预览中,您不仅会看到提交 G,还会看到 D-E-F。