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

low*_*key 91 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Amb*_*ber 95

那些是冲突标记.你还在合并的过程中,但有些部分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
Run Code Online (Sandbox Code Playgroud)

因此你将文件保存为......

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Run Code Online (Sandbox Code Playgroud)

  • @lowerkey正是您希望结束合并结果的样子.我的猜测是你真的只想要`gh-pages`版本中的部分,所以你只需删除`<<<<<<`到`======`的东西,并删除单个`>>>>>>`行,将两行实际代码留在`=======`和`>>>>>>`之间. (4认同)
  • @lowerkey,也请考虑就该主题[阅读书籍](http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging#Basic-Merge-Conflicts)。我建议您完整阅读该书,因为您似乎缺乏关于VCS的某些基本知识,因此最好为将来可能出现的问题做好准备。 (2认同)

GoZ*_*ner 21

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

git mergetool
Run Code Online (Sandbox Code Playgroud)

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

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

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file
Run Code Online (Sandbox Code Playgroud)

您可以使用:1:filename语法查看不同的版本.请看这里的解释.但以上所有假设'git status'显示文件需要合并.

最后,您始终可以选择:

git reset --hard   # sounds like --hard is what you need but check other options
Run Code Online (Sandbox Code Playgroud)

  • 我绝对喜欢用"git status'开头来看看你得到了什么"的建议:在某些圈子里,Git因其想象中的复杂性而责备它,但实际上仔细阅读了`git status'的输出足以理解在大多数常见情况下下一步该做什么.因此,真的:如果出现问题,请停止,阅读`git status`,思考. (6认同)

Mr.*_*dir 5

所有答案都是正确的,但是如果您想自动删除所有冲突标记并想自动更改文件以保留 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
Run Code Online (Sandbox Code Playgroud)

# chmod 755 /usr/sbin/solve.git

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

$ cd <path_to_repo>
$ solve.git

注意:- 上面提到的文件扩展名是 php、css、js、html、svg 和 txt。