ChatGPT解决这个技术问题 Extra ChatGPT

Git合并在我的文件中留下了HEAD标记

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

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

C
Community

那些是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 版本中的部分,所以您只需删除 <<<<<<====== 中的内容并删除单个 >>>>>> 行,留下两行实际代码在 =======>>>>>> 之间。
谢谢,我想我已经掌握了窍门。删除从 head 到 ====== 的所有内容,然后删除剩余的 HEADmarks。
对,没错。 (没有真正的“休息”需要照顾 - 你只是提交合并的结果,如果没有冲突,Git 通常会自动执行。)
@lowerkey,还请考虑有关该主题的reading a book。我建议您完整阅读该书,因为您似乎缺乏有关 VCS 工作原理的某些基本知识,并且最好为将来可能出现的问题做好准备。
那是多么的好笑。尽管可以在另一个问题中找到该问题的答案,但您指向的问题的答案被标记为该问题的副本。
C
Community

绝对从“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,思考。
M
Mr. Pundir

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


呸。只需为智能处理合并冲突的适当差异工具付费。
T
Timar Ivo Batis

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


M
Mohd Abdul Mujib

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

现在,请记住,这仅在 merge->add->commit 之后立即有效,您意识到自己搞砸了,并希望重新完成该过程。

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

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

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

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

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


a
abbujaansboy

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