Git 合并文件中的左 HEAD 标记

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

我以为事情就这么结束了,但是后来我意识到我的文件里有些标记,就像这样:

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

The files have been edited not by me and show lines inserted with:

  • 后小于标志头(<<<<<<< HEAD)
  • lines of changed code
  • 等号字符串(=======)
  • 新版本的密码
  • 以大于号和分支名称(>>>>>>> gh-pages)开始的另一行

更糟糕的是文件内容不再有序。有人知道我是怎么让这些文件恢复正常的吗? 我在 gh 分支上做的修改又合并到了主分支上?

83427 次浏览

Those are 冲突标记. You're still in the process of merging, but there were some parts that Git couldn't merge automatically. You'll 需要手工编辑这些部分 to what you want them to be and then commit the results.


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

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

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

所有的答案都是正确的,但是如果你想要 Autoremove 所有的冲突标记并且想要自动更改文件以保持 HEAD,那么你可以创建你自己的 bash 脚本,比如:-

Example Script:

# 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。

在 Atom 中,有些文件没有将解决的合并冲突保存到驱动器中,所以我不得不手动点击“保存”。 我花了很长时间才弄明白。

I'm coming from 这个问题. And I wanted some automated method of merging the half merged files, instead of manually editing the files (正如其他答案所暗示的那样,我真的不太愿意这么做). So here's what I ended up doing via netbeans, but can be done via command line too.

Now, bear in mind, this only works if immediately after the merge->add->commit, you realised that you messed up, and want to re-go through the process.

步骤1: 重置为以前的提交。

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

步骤2: 重试合并分支

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

此时,如果您正在使用 GUI,那么合并窗口将提示您。然后你就可以正常进行了。

如果您想考虑新的更改(来自要合并的分支) ,那么删除属于 HEAD 的所有代码。如果您想保留自己的代码而不是新分支的代码,那么删除另一个并保留 HEAD 的代码