115

我尝试使用 Git 在命令行中合并文件,但出现一条错误消息,告诉我合并已中止。

我以为这就结束了,但后来我意识到我的文件中有 gitmarks。像这样:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(""); }
=======
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages

这些文件不是由我编辑的,并显示插入的行:

  • 小于号 ( <<<<<<< HEAD)后的 HEAD
  • 更改的代码行
  • 一串等号 ( =======)
  • 新版本的代码
  • 另一行以大于号和分支名称 ( >>>>>>> gh-pages)开头

更糟糕的是文件内容不再按顺序排列。有谁知道我如何让这些文件恢复正常,以及我在 gh-branch 中所做的更改合并到 master 分支中?

4

5 回答 5

107

那些是冲突标记。您仍在合并过程中,但是 Git 无法自动合并某些部分。您需要将这些部分手动编辑成您想要的样子,然后提交结果。


例如,在您的特定情况下,您可能希望像这样解决它(注意 - 右侧的箭头/文本只是我的笔记,而不是您在文件中键入的内容):

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(""); }             |
=======                                       <-+
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages                              <-- and this

因此您将文件另存为...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
于 2012-05-18T17:44:24.327 回答
26

绝对从“git status”开始,看看你有什么。如果您中止了合并(或合并中止)并且工作目录中有冲突的文件,则出现问题。Git 状态会告诉你你在哪里。之后,您有多种选择。您应该手动解决合并提交,这可能具有挑战性,或者使用以下工具:

git mergetool

如果您的文件被列为需要合并,则合并工具将起作用。

您还可以执行以下操作之一:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

您可以使用 :1:filename 语法查看不同的版本。请参阅此处以获取解释。但以上所有假设“git status”将文件显示为需要合并。

最后,您始终可以选择:

git reset --hard   # sounds like --hard is what you need but check other options
于 2012-05-18T19:10:24.547 回答
6

所有答案都是正确的,但是如果您想自动删除所有冲突标记并想自动更改文件以保留 HEAD ,那么您可以创建自己的 bash 脚本,例如:-

示例脚本:

# vim /usr/sbin/solve.git

(附加以下)

#!/bin/bash
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .)
do
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f
sed -i -e '/^>>>>>>> /d' $f
echo "$f Fixed"
done
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify

# chmod 755 /usr/sbin/solve.git

& 只需在您的 GIT 存储库/路径中运行它即可解决:

$ cd <path_to_repo>
$ solve.git

注意:- 上述文件扩展名是 php,css,js,html,svg & txt。

于 2016-05-05T11:13:41.517 回答
0

我来自这个问题。而且我想要一些自动合并半合并文件的方法,而不是手动编辑文件(如其他答案中所建议的那样,我不太习惯这样做)。所以这就是我最终通过 netbeans 做的事情,但也可以通过命令行完成。

现在,请记住,这仅在 之后立即有效merge->add->commit,您意识到自己搞砸了,并想重新完成该过程。

第 1 步:重置为之前的提交。

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

第 2 步:重新尝试合并分支

git merge --ff origin/feature/YOUR-Branch_here

如果您使用的是 GUI,此时将提示您合并窗口。然后您可以正常进行。

于 2018-12-11T16:14:48.660 回答
0

在 Atom 中,我遇到了一些文件没有将已解决的合并冲突保存到驱动器的问题,因此我不得不手动单击“保存”。我花了很长时间才弄清楚。

于 2018-04-05T21:57:29.350 回答