拉取请求包含来自主分支的提交

3

我一周前从主分支上拉出了一个分支。

master -> my_branch_1

在此期间,我对my_branch_1进行了提交,并多次基于origin/master进行了变基以保持同步。

分支的现状(概念化)

commit0
master -> my_branch_1

master:
   commit1
   commit3
   commit10

my_branch_1 (commits from master are marked with *)
   commit1*
   commit2
   commit3*
   commit4...commit9
   commit10

当我试图将PR返回到master时,出现了问题。 PR日志显示所有提交1...10,而我只希望出现提交2、4...9
以下是需要回答的问题:
  1. 我做错了什么?
  2. 我该如何解决这个问题?
--编辑-- 在评论中对origin进行澄清讨论。本意是将发生在主分支上的提交合并到我的分支中。
这是期望的结果,因为我想尽可能地保持与代码库的其他部分同步,与"master"尽可能接近。
我不希望在我向master提出的PR中出现已经在master中的提交。 --编辑2-- 这个问题出现在托管在GitHub上的私有存储库中,而不是派生的存储库。

origin 是你的派生版本,还是你从中派生出来的仓库? - Caleb
我从哪个仓库(Github)进行了fork。 - Maxim Veksler
听起来像是在rebase时拉取了那些提交。我建议检查一下你的origin - Max Baldwin
@MaximVeksler 只要你谈论的是两个不同的分支,那就没关系。 - Caleb
@Caleb 是的,这些是不同的分支。 - Maxim Veksler
显示剩余4条评论
1个回答

5

我做错了什么?

听起来你从origin/master拉取了代码,而不是使用rebase方式获取commit3

我该如何解决这个问题?

首先,在操作前请为你的分支创建一个备份分支以防万一,你可以通过从当前分支创建一个新的分支来实现。例如,如果你正在工作的分支中,你可以执行以下命令:

git checkout -b my_branch_1_backup

要创建一个新分支,然后只需checkout回到您的工作分支:

git checkout my_branch_1

其次,再次进行变基。我建议使用交互式变基来删除您不需要的提交。使用 -i 标志进行交互式变基,例如:

git rebase -I commit1

这将给你一个回溯到commit1的提交列表,你可以像下面一样进行编辑:
pick commit2
pick commit3
pick commit4

等等。如果你不想要commit3(因为它已经在master中),将pick commit3更改为drop commit3。在编辑器的注释中会列出其他选项列表。一旦你整理好了提交记录列表,保存并退出编辑器,然后执行以下命令:

git log

你应该会看到,日志反映了你的更改。
最后,你可以变基到origin/master,这将使git获取master中的任何新提交,然后在它们之上添加你的提交:
git rebase origin/master

再次检查日志,您应该可以看到来自master的提交记录,但是在您分支中添加提交记录之前。

此时,您的拉取请求应仅包含您在分支中添加的提交记录。


请问是否可以提供此操作的命令行步骤? - Maxim Veksler
@MaximVeksler 已添加示例。我是凭记忆打字的,所以请小心。我无法强调第一步的重要性,即在使用非常强大的 rebase 命令更改分支历史记录之前备份您的分支。 - Caleb
非常感谢您的技巧,我认为我仍然不太了解理论。为什么一开始会发生这种情况?您能催眠一下吗?以及为什么您的解决方案可以修复它?(确实可以,谢谢!)我的意思是询问我与您的做法有何不同,因为从表面上看,我们的流程是相同的(在概念上),只是在开发过程中我多次进行了git rebase origin/master,而您只在最后阶段进行了一次。 - Maxim Veksler
如果你只是从一个分支拉取到另一个分支,那么该分支中的任何新提交(即你尚未拥有的提交)都会添加到已经存在的提交之上。rebase 命令允许你重写你的分支历史(这使它非常强大,因此也有点危险)。你可以从另一个分支进行 rebase,这将更改你的分支“基础”为该分支,将你的提交“添加”到该分支的提交之上。 - Caleb
@Caleb git pull origin master应该将提交的更改应用到你的本地分支上。然而,这些更改不应该成为差异的一部分,因为它们已经存在于主分支中。为什么你会说在这种情况下git pull origin main是错误的呢? - HAL9000
显示剩余2条评论

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