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


101

当出现错误消息告诉我合并被中止时,我尝试使用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分支中所做的更改已合并到master分支中?

Answers:


96

这些是冲突标志。您仍在合并过程中,但是有些部分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(""); }

4
@lowerkey正是您希望最终合并结果的外观。我的猜测是,您确实只需要gh-pages版本中的该部分,因此您只需从中删除内容<<<<<<======然后删除单行>>>>>>,而在=======和之间保留两行实际代码>>>>>>
2012年

谢谢,我想我已经掌握了。从头删除所有内容,直到======,然后删除剩余的HEADmark。
lowerkey

1
是的,没错。(没有真正的“休息”需要照顾-您只是提交合并的结果,如果没有冲突,Git通常会自动执行合并的结果。)
2012年

2
@lowerkey,也请考虑阅读有关该主题的书。我建议您完整阅读该书,因为您似乎缺乏关于VCS的某些基本知识,最好为将来可能出现的问题做好准备。
kostix 2012年

1
那真有趣。您可以指向该问题的答案,该答案被标记为与该问题重复的答案,尽管可以在另一个问题中找到该问题的答案。
t3chb0t

22

绝对从“ 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

6
我绝对想赞同“从开始git status看您所拥有的”建议:在某些圈子里怪怪Git的想象复杂性git status是可以理解的,但是实际上仔细阅读Git的输出足以理解下一步该做什么。在最常见的情况下。因此,实际上是:如果出现问题,请停止阅读git status,思考。
2012年

4

所有答案都是正确的,但是如果您要自动删除所有冲突标记并希望自动更改文件以保留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。



0

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

现在,请记住,只有在紧接之后merge->add->commit,您才意识到自己搞砸了,并希望重新进行此过程,这才有效。

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

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.