我们一般都有主人的分支机构。例如,我们有一个名为“JohnMaster”的分支。 John在JohnMaster本地开发他的开发,当他准备推动他的代码掌握时,他将他的分支推到远程,然后从JohnMaster做一个拉取请求。问题在于我们在执行拉取请求时遇到了冲突。
我认为我们可以解决合并冲突的方式是让master关闭并在master中执行rebase - > JohnMaster,然后在rebase期间解决合并冲突。在做了rebase后,它不会让我把我的代码推回到远程,因为它说我是远程的2次提交(在rebase之前它们是相同的)但是当我做git pull
时我得到另一个合并冲突。
我知道最好的做法可能是从master做一个pull请求 - > JohnMaster(反向合并)然后在JohnMaster上做git pull
之后再将你的提交推送到远程,但有时人们忘记然后我们遇到这个问题。
所以我的问题是:
请注意我们不能直接提交给主人。分支上有安全性需要拉取请求。
答案 0 :(得分:11)
简短回答:
将origin / master合并到JohnMaster中并将其推送到其远程(origin / JohnMaster)。现在你可以从origin / JohnMaster执行pull请求来掌握,只要master上没有新的提交(master中的提交没有包含在JohnMaster中),你就不会遇到合并冲突。
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''。在变基之前你有A - > B' - >您的功能分支上的C',在推送之前,您仍然可以在远程分支上使用它。在这一点上,Git告诉你,你没有本地B'和C',因为它们已被重写为B''和C'',因此提交了不同的。
此时,您可以使用git push -f
强制推送您当地的重定历史记录。通过这种方式,您可以消除远程提交B'和C',并获得与本地原点/ JohnMaster相同的信息,这是A - > B - > C - > B'' - > C''。现在你执行pull请求,如果它被接受,那么你在master分支上确切地提交了这个提交历史记录。
就我个人而言,我不喜欢重写远程,已推送的历史记录,我认为应该尽可能避免这种情况,但实际上这是你的选择。
如果您将origin / master合并到JohnMaster中(这是我认为的首选方式),您可以保留所有现有提交:A - > B - > C和A - > B' - > C',你添加一个新的合并提交M,其中两个分支再次聚集在一起。合并提交是一个包含两个父项的提交,在本例中为C'和C.您可以安全地推送此合并提交而无需强制推送。