GitHub无法修改我的功能分支:"由于冲突,该分支无法重新定位"

时间:2018-04-24 23:30:32

标签: git github

即使我的功能分支从最新版本的master分支出来,当我尝试重新定义我的PR(从功能X到主人)时,我最终看到了:

此分支因冲突无法重新定位 由于在从头部分支重新应用单个提交时遇到冲突,因此无法自动执行在基本分支之上重新分配此分支的提交。

我知道这可以通过以下方式解决:

git checkout master
git rebase feature/x
(resolve conflicts)

然而,直接推送到master已被锁定,我需要通过公关。成功地通过拉取请求将feature/x分支重新绑定到主控的步骤是什么?

3 个答案:

答案 0 :(得分:5)

如果您从master创建了分支,但现在需要重新绑定到master,那么master必须在创建分支后进行更新。冲突来自这些变化。

  

我知道这可以通过以下方式解决:

git checkout master
git rebase feature/x
(resolve conflicts)

这不正确。这会将master重新定义为feature/x;您需要将feature/x重新定义到master

相反,

  1. 通过master或类似的方式在gase之前从GitHub更新您的本地pull
  2. 检查feature/x
  3. 运行git rebase master
  4. 解决冲突。
  5. 然后将您的功能分支推送到GitHub(您需要使用--force-with-lease,因为这会重写提交哈希值)。拉取请求将相应更新。

答案 1 :(得分:1)

首先让我们看看是什么导致了这个问题,从问题:

<块引用>

由于冲突,此分支无法重新定位 由于在从头分支重新应用单个提交时遇到冲突,无法自动执行将此分支的提交重新定位在基本分支之上。。 >

这种情况发生在不可能将每个单独的提交干净地重新设置到 master 上时。

例如,如果 PR 有合并冲突,并且通过合并 master 并在新提交中修复冲突解决了新提交,则不会对此警告产生影响,因为它不允许 GitHub干净地重新调整 PR。

请注意,所有解决方案都涉及为 PR 分支重写历史并通过 GitHub 的 UI 进行合并。

使用 git rebase 修复

如果您希望保留所有单独的提交:

$ cd /my/repo
$ git checkout my-feature-branch
$ git fetch
$ git rebase origin/master             # 1
$ git push -f origin/my-feature-branch # 2

这将:

  1. Rebase (Reapply) each commit 在母版之上的 PR
  2. 更新 GitHub 上的 PR 分支

如果 PR 有大量提交,这可能是一个痛苦的过程 - 肯定会至少有一个合并冲突需要解决(否则,GitHub 不会在 PR 上收到警告( :) - 如果您开始此过程并认为 git rebase --abort 返回到干净的工作副本是错误的举动。

使用 git rebase -i 修复

如果您希望通过调整保留所有/大多数个人提交:

$ cd /my/repo
$ git checkout my-feature-branch
$ git fetch
$ git rebase origin/master -i          # 1
$ git push -f origin/my-feature-branch # 2

这将:

  1. 在主节点 interactively 之上重新定义 PR 中的每个提交
  2. 更新 GitHub 上的 PR 分支

例如,如果您认识到通过将几个提交压缩在一起或重新排序提交等可以获得干净的历史记录,这会很方便。

同样,如果您开始此过程并确定这是错误的举动(或想再试一次)git rebase --abort 返回到干净的工作副本。

使用 git reset 修复

如果您不关心保留单个 PR 提交,则有一个更简单/更容易的选择:

$ cd /my/repo
$ git checkout my-feature-branch
$ git fetch
$ git merge origin/master              # 1
$ git reset --soft origin/master       # 2
$ git commit -va                       # 3
$ git push -f origin/my-feature-branch # 4

这将:

  1. 确保分支与 origin/master 保持同步
  2. Reset 匹配 origin/master 的本地分支(但不修改工作副本)
  3. 为 PR 创建一个新的单一提交(这是一个提交,记得写一个详细的提交信息!)
  4. 更新 GitHub 上的 PR 分支

此过程不需要您解决中间冲突。

避免在未来

Github 允许 multiple merge strategies for PRs

enter image description here

问题中的问题仅针对 rebase and merge,因此要避免:只是不要使用/强制变基和合并策略。

答案 2 :(得分:0)

执行rebase的步骤:

x @ xyz-pc:〜/ workspace $ git branch

  • xyzBranch

x @ xyz-pc:〜/ workspace $ git checkout master

切换到分支'master'

您的分支机构与'origin / master'保持同步。

x @ xyz-pc:〜/ workspace $ git branch

  • xyzBranch

x @ xyz-pc:〜/ workspace $ git pull

更新...... 快进....

x @ xyz-pc:〜/ workspace $ git pull

已经是最新的。

x @ xyz-pc:〜/ workspace $ git checkout xyzBranch

切换到分支'xyzBranch'

x @ xyz-pc:〜/ workspace $ git branch

  • xyzBranch

x @ xyz-pc:〜/ workspace $ git rebase master

首先,倒带头重播你的作品......

快速转发xyzBranch到掌握。

冲突情景:

x @ xyz-pc:〜/ workspace $ git rebase master

  • 如果没有冲突,则rebase成功并显示更新的消息。

  • 如果您发现错误,则需要解决冲突,因此“git status”会显示如下所示的冲突文件:

x @ xyz-pc:〜/ workspace $ git status

正在进行的改革; ..... 未合并的路径:

    both modified:   conflicting-file

它将显示未合并路径下的冲突文件。

解析该文件并提交并执行'git rebase --continue'