git pull origin master出现合并冲突:该怎么办?

8

我正在一个分支(my-branch)上工作,这个分支是从主分支创建的。

$ git checkout -b my-branch

我编辑了一些文件,然后将它们检入到新分支中:

$ git commit -a -m 'Add new feature'

然后我从主分支(我不完全确定为什么这样做,或者它是否是良好的实践)拉取了代码:

$ git pull origin master 

但是拉取时出现了许多错误消息:
   From github.com
 * branch            master     -> FETCH_HEAD
Auto-merging styles/common/module_more_info.scss
CONFLICT (add/add): Merge conflict in styles/common/module_more_info.scss
Auto-merging app/support/stagecraft_stub/responses/cloud.json
CONFLICT (content): Merge conflict in app/support/stagecraft_stub/responses/cloud.json
Auto-merging app/support/backdrop_stub/response_fetcher.js
CONFLICT (content): Merge conflict in app/support/backdrop_stub/response_fetcher.js
Automatic merge failed; fix conflicts and then commit the result.
vagrant@pp-development-1:/var/apps/spotlight$ git status

现在运行 git status 命令将会显示许多更改过的文件:

# 在分支 my-branch 上

# Changes to be committed:
#
#       modified:   CONTRIBUTING.md
#       modified:   README.md
#       modified:   app/appBuilder.js
[lots more files]
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      app/support/backdrop_stub/response_fetcher.js
#       both modified:      app/support/stagecraft_stub/responses/cloud.json
#       both added:         styles/common/module_more_info.scss

首先,发生了什么事情,其次,我该怎么办?

如果我尝试查看上面文件列表中的任何文件的差异,我会得到空输出,这很令人困惑(如果没有差异,为什么它要求我提交文件?):

$ git diff CONTRIBUTING.md
$

我应该审核位于未合并路径下的三个文件,然后将其提交为合并提交吗?更新:更重要的是,我能否在不搞乱主分支的情况下将其推送到我的分支上?

我似乎无法回滚最后一次提交。

5个回答

4
请不要使用合并工具,因为它可能会让你感到困惑。请备份您当前的代码并还原您在当前分支所做出的更改。然后检出您的主分支(dev),获取最新代码,重新编写您的更改,然后推送。
首先,在您的github中输入gitk --all,以查看当前打开的分支。
然后,您需要使用revertrebase将您的代码与服务器上的最新代码合并:
最后,请执行以下步骤将您的分支推送到服务器主分支。
git status

git add .

git status

git commit -a -m "Comments"

git push origin yourbranchname

That's all...


1

基本上是这样的。 git mergetool 可能有所帮助。它只是打开一个合并工具,显示需要您处理的文件,并在之后将它们添加到索引中。通过简单的 git commit,您可以创建合并冲突。

您始终可以通过执行 git reset --hard HEAD 返回到拉取之前的状态。


谢谢 - 但是 git reset --hard HEAD 会丢失我之前提交的代码吗? - flossfan
不。在你的情况下,HEAD 引用了 refs/heads/my-branch,这应该链接到合并开始前分支 my-branch 上的最后一次提交。因此,通过硬重置到 HEAD,你可以回到上次提交的状态。 - gregor

0

可能发生的情况是:

  1. 其他人正在编辑或将其代码合并到主分支。
  2. 您的字符集与上一个编辑主分支的用户不同。

解决方案是:

git mergetool <you can left here blank your choose a mergetool from those you have installed in your machine>

0

首先配置您的合并工具。我建议安装this

  • 现在您的更改与远程更改冲突,您需要解决这些冲突。 对于每个文件执行以下操作:

    • git merge tool

    • 保存文件。

现在您告诉git,您知道存在冲突,但您希望使用合并工具解决它们。因此,冲突现已解决。

git status

现在您需要提交已解决的文件并将它们推送。 PS. 另一种方法是将更改暂存而非提交,然后从源拉取并弹出您的暂存。
git stash save
git pull
git stash pop
git commit
git pull

但是根据我所读的,如果您对自己的更改确信无疑,您必须像之前一样提交它们,然后合并它们。合并非常频繁,您必须知道如何处理它。


-2

打开冲突文件并解决移除差异。

然后:

git add . 
git commit -am "resolve conflicts"
git push origin master

1
推送到主分支?但我只想推送到我的分支,我不想推送到主分支...我能否推送到我的分支而不触及主分支? - flossfan
使用-am选项时,不需要执行git add .命令。同样地,使用git add .命令时,不需要加上-a选项。 - emmagras

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