Git在我的文件中合并左HEAD标记

时间:2012-05-18 17:41:34

标签: git git-merge merge-conflict-resolution git-merge-conflict

我尝试使用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中所做的更改合并到主分支?

5 个答案:

答案 0 :(得分:83)

那些是conflict markers。你还在合并的过程中,但有些部分Git无法自动合并。您将need to hand-edit those parts发送到您想要的内容,然后提交结果。


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

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(""); }

答案 1 :(得分:21)

绝对以'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语法查看不同的版本。有关说明,请参阅here。但所有上述假设'git status'将文件显示为需要合并。

最后,您始终可以选择:

git reset --hard   # sounds like --hard is what you need but check other options

答案 2 :(得分:1)

所有答案都是正确的,但如果您想要自动移除所有冲突标记&amp;想要自动更新文件以保持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&amp;文本。

答案 3 :(得分:0)

在Atom中我遇到的问题是某些文件没有将已解决的合并冲突保存到驱动器,因此我不得不手动点击&#34; save&#34;。 我花了很长时间才弄明白。

答案 4 :(得分:0)

我来自this question。我想要一种自动化的方法来合并半合并的文件,而不是手动编辑文件(,正如其他答案中所建议的那样,我做起来并不舒服)。因此,这就是我最终通过netbeans完成的操作,但是也可以通过命令行完成。

现在,请记住,只有在merge->add->commit之后,您意识到自己搞砸了,并想重新执行该过程时,此方法才有效。

步骤1:重置为上一次提交。

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

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

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

这时,如果您正在使用GUI,则将在合并窗口中提示您。然后您就可以照常进行了。