即使我的功能分支从最新版本的master
分支出来,当我尝试重新定义我的PR(从功能X到主人)时,我最终看到了:
此分支因冲突无法重新定位 由于在从头部分支重新应用单个提交时遇到冲突,因此无法自动执行在基本分支之上重新分配此分支的提交。
我知道这可以通过以下方式解决:
git checkout master
git rebase feature/x
(resolve conflicts)
然而,直接推送到master
已被锁定,我需要通过公关。成功地通过拉取请求将feature/x
分支重新绑定到主控的步骤是什么?
答案 0 :(得分:5)
如果您从master
创建了分支,但现在需要重新绑定到master
,那么master
必须在创建分支后进行更新。冲突来自这些变化。
我知道这可以通过以下方式解决:
git checkout master git rebase feature/x (resolve conflicts)
这不正确。这会将master
重新定义为feature/x
;您需要将feature/x
重新定义到master
。
相反,
master
或类似的方式在gase之前从GitHub更新您的本地pull
,feature/x
,git rebase master
和然后将您的功能分支推送到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
这将:
如果 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
这将:
例如,如果您认识到通过将几个提交压缩在一起或重新排序提交等可以获得干净的历史记录,这会很方便。
同样,如果您开始此过程并确定这是错误的举动(或想再试一次)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
这将:
此过程不需要您解决中间冲突。
Github 允许 multiple merge strategies for PRs:
问题中的问题仅针对 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'