我尝试使用 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
(如下面的答案)可能就足够了。
那些是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(""); }
绝对从“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
,思考。
所有答案都是正确的,但是如果您想自动删除所有冲突标记并想自动更改文件以保留 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。
在 Atom 中,我遇到了一些文件没有将已解决的合并冲突保存到驱动器的问题,因此我不得不手动单击“保存”。我花了很长时间才弄清楚。
我来自this question。而且我想要一些自动合并半合并文件的方法,而不是手动编辑文件(正如其他答案中所建议的那样,我不太习惯这样做)。所以这就是我最终通过 netbeans 做的事情,但也可以通过命令行完成。
现在,请记住,这仅在 merge->add->commit
之后立即有效,您意识到自己搞砸了,并希望重新完成该过程。
第 1 步:重置为之前的提交。
git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e
第 2 步:重新尝试合并分支
git merge --ff origin/feature/YOUR-Branch_here
如果您使用的是 GUI,此时将提示您合并窗口。然后您可以正常进行。
如果要考虑新的更改(来自要合并的分支),则删除属于 HEAD 的所有代码。如果你想保留自己的代码而不是新分支的代码,那么删除另一个并保留 HEAD 的代码
不定期副业成功案例分享
gh-pages
版本中的部分,所以您只需删除<<<<<<
到======
中的内容并删除单个>>>>>>
行,留下两行实际代码在=======
和>>>>>>
之间。