如何解决拉取请求期间的合并冲突?
How to resolve merge conflict during pull request?
我们通常有独立的 master 分支。例如,我们有一个名为 "JohnMaster" 的分支。 John 在 JohnMaster 的本地进行开发,当他准备好将他的代码推送到 master 时,他将他的分支推送到远程,然后从 JohnMaster 向 master 发出拉取请求。 运行 问题是我们在执行拉取请求时遇到冲突。
我认为我们可以解决合并冲突的方法是降低 master 并从 master-->JohnMaster 本地进行变基,然后在变基期间解决合并冲突。在进行变基之后,它不会让我将我的代码推送回远程,因为它说我是远程的 2 次提交(在变基之前它们是相同的)但是当我做 git pull
我得到另一个合并冲突.
我知道最好的做法可能是从 master-->JohnMaster(反向合并)做一个拉取请求,然后在你将你的提交推送到远程之前在 JohnMaster 上做一个 git pull
但有时人们忘记了,然后我们 运行 进入了这个问题。
所以我的问题是:
- 为什么本地变基不起作用?
- 我们如何解决这个问题?
请注意我们不能直接提交给 master。分支上有安全性需要拉取请求。
简答:
将 origin/master 合并到 JohnMaster 并将其推送到其远程 (origin/JohnMaster)。现在您可以执行从 origin/JohnMaster 到 master 的拉取请求,只要 master 上没有新的提交(JohnMaster 中不包含的 master 中的提交)就不会出现合并冲突
git checkout JohnMaster
git merge origin/master
#solve merge conflicts
git commit
git push
#pull request
git push
长答案
如果你 运行 git rebase origin/master
实际发生的是添加到 JohnMaster 的提交被重写(在你的情况下是两个提交)并放在 master 的提交之后。例如。由于创建了 JohnMaster 分支,B 和 C 已添加到 master,B' 和 C' 已添加到 JohnMaster。变基后你得到 A --> B --> C --> B'' --> C''。在 rebase 之前,您的功能分支上有 A --> B' --> C' 并且在推送之前您仍然在远程分支上有它。此时Git告诉你本地没有B'和C',因为它们已经被重写为B''和C'',因此不同的提交。
此时,您可以使用 git push -f
强制推送您的本地重新设置历史记录。有了这个,你消除了远程提交 B' 和 C',你得到了与本地 origin/JohnMaster 相同的结果,这是 A --> B --> C --> B'' --> C'' .现在你做你的拉取请求,如果它被接受,你就是主分支上的这个提交历史。
就我个人而言,我不喜欢重写远程的、已经推送的历史记录,我认为应该尽可能避免这样做,但它实际上是您的一个选择。
如果您将 origin/master 合并到 JohnMaster(我认为这是首选方式),您将保留所有现有提交:A --> B --> C 和 A --> B ' --> C' 然后你添加一个新的合并提交 M ,两个分支再次聚集在一起。合并提交是有两个父项的提交,在本例中为 C' 和 C。您可以安全地推送此合并提交,而无需强制推送。
我们通常有独立的 master 分支。例如,我们有一个名为 "JohnMaster" 的分支。 John 在 JohnMaster 的本地进行开发,当他准备好将他的代码推送到 master 时,他将他的分支推送到远程,然后从 JohnMaster 向 master 发出拉取请求。 运行 问题是我们在执行拉取请求时遇到冲突。
我认为我们可以解决合并冲突的方法是降低 master 并从 master-->JohnMaster 本地进行变基,然后在变基期间解决合并冲突。在进行变基之后,它不会让我将我的代码推送回远程,因为它说我是远程的 2 次提交(在变基之前它们是相同的)但是当我做 git pull
我得到另一个合并冲突.
我知道最好的做法可能是从 master-->JohnMaster(反向合并)做一个拉取请求,然后在你将你的提交推送到远程之前在 JohnMaster 上做一个 git pull
但有时人们忘记了,然后我们 运行 进入了这个问题。
所以我的问题是:
- 为什么本地变基不起作用?
- 我们如何解决这个问题?
请注意我们不能直接提交给 master。分支上有安全性需要拉取请求。
简答:
将 origin/master 合并到 JohnMaster 并将其推送到其远程 (origin/JohnMaster)。现在您可以执行从 origin/JohnMaster 到 master 的拉取请求,只要 master 上没有新的提交(JohnMaster 中不包含的 master 中的提交)就不会出现合并冲突
git checkout JohnMaster
git merge origin/master
#solve merge conflicts
git commit
git push
#pull request
git push
长答案
如果你 运行 git rebase origin/master
实际发生的是添加到 JohnMaster 的提交被重写(在你的情况下是两个提交)并放在 master 的提交之后。例如。由于创建了 JohnMaster 分支,B 和 C 已添加到 master,B' 和 C' 已添加到 JohnMaster。变基后你得到 A --> B --> C --> B'' --> C''。在 rebase 之前,您的功能分支上有 A --> B' --> C' 并且在推送之前您仍然在远程分支上有它。此时Git告诉你本地没有B'和C',因为它们已经被重写为B''和C'',因此不同的提交。
此时,您可以使用 git push -f
强制推送您的本地重新设置历史记录。有了这个,你消除了远程提交 B' 和 C',你得到了与本地 origin/JohnMaster 相同的结果,这是 A --> B --> C --> B'' --> C'' .现在你做你的拉取请求,如果它被接受,你就是主分支上的这个提交历史。
就我个人而言,我不喜欢重写远程的、已经推送的历史记录,我认为应该尽可能避免这样做,但它实际上是您的一个选择。
如果您将 origin/master 合并到 JohnMaster(我认为这是首选方式),您将保留所有现有提交:A --> B --> C 和 A --> B ' --> C' 然后你添加一个新的合并提交 M ,两个分支再次聚集在一起。合并提交是有两个父项的提交,在本例中为 C' 和 C。您可以安全地推送此合并提交,而无需强制推送。