【问题标题】:Git merge left HEAD marks in my filesGit合并在我的文件中留下了HEAD标记
【发布时间】:2012-05-26 07:18:34
【问题描述】:

我尝试使用 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 (&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD)
  • 更改的代码行数
  • 一串等号 (=======)
  • 新版代码
  • 另一行以大于号和分支名称 (&gt;&gt;&gt;&gt;&gt;&gt;&gt; gh-pages) 开头

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

【问题讨论】:

  • 如果你真的不想合并任何东西(或者认为没有必要),来到这里,并且对在几十个文件中“手动编辑这些部分”的建议感到害怕, git merge --abort 将我的本地文件夹恢复到以前的状态。 git status 向我建议。如果您真的想编辑它们,git mergetool(如下面的答案)可能就足够了。

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


【解决方案1】:

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

【讨论】:

  • @lowerkey 您希望最终合并结果的外观。我的猜测是你真的只想要gh-pages 版本中的部分,所以你只需删除从&lt;&lt;&lt;&lt;&lt;&lt;====== 的内容,并删除单个&gt;&gt;&gt;&gt;&gt;&gt; 行,留下两行实际代码在=======&gt;&gt;&gt;&gt;&gt;&gt; 之间。
  • 谢谢,我想我已经掌握了窍门。删除从 head 到 ====== 的所有内容,然后删除剩余的 HEADmarks。
  • 是的,没错。 (没有真正的“休息”需要处理——你只是提交合并的结果,如果没有冲突,Git 通常会自动完成。)
  • @lowerkey,也请考虑reading a book 的主题。我建议您完整阅读该书,因为您似乎缺乏有关 VCS 工作原理的某些基本知识,最好为将来可能出现的问题做好准备。
  • 这太有趣了。尽管可以在另一个问题中找到该问题的答案,但您指向的问题的答案被标记为与该问题重复。
【解决方案2】:

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

【讨论】:

  • 我绝对愿意支持“从git status 开始,看看你有什么”的建议:在某些圈子里指责 Git 想象中的复杂性是合理的,但实际上仔细阅读git status 的输出足以理解在最常见的情况下下一步该做什么。因此,真的:如果出现问题,停下来,阅读git status,思考。
【解决方案3】:

所有答案都是正确的,但是如果您想自动删除所有冲突标记并希望自动更改文件以保留 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 &lt;path_to_repo&gt;
$ solve.git

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

【讨论】:

  • 糟糕。只需支付一个合适的差异工具来智能地处理合并冲突。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    现在,请记住,这仅适用于在 merge-&gt;add-&gt;commit 之后,您意识到自己搞砸了,并想重新完成该过程。

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

    git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 2018-02-28
      • 2020-12-13
      相关资源
      最近更新 更多