web-dev-qa-db-ja.com

Git merge left HEADファイル内のマーク

Gitを使用してコマンドラインでファイルをマージしようとしましたが、マージが中止されたことを示すエラーメッセージが表示されました。

これで終わりだと思いましたが、ファイルにgitmarkがあることに気付きました。そのようです:

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ブランチで行った変更がmasterブランチにマージされましたか?

84
lowerkey

それらは 競合マーカー です。まだマージ中ですが、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

したがって、ファイルを次のように保存します...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
91
Amber

絶対に「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
21
GoZoner

すべての答えは正しいですが、すべての競合マークを自動削除し、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です。

2
Mr. Pundir

この質問 から来ています。そして、手動でファイルを編集するのではなく、半分マージされたファイルをマージする自動化された方法が必要でした(他の回答で示唆されているように、これはあまり快適ではありません)。 Netbeansを介して実行することになりましたが、コマンドラインからも実行できます。

今、覚えておいてください、これはmerge->add->commit、あなたは台無しになったことに気づき、プロセスをやり直したい。

STEP 1:前のコミットにリセットします。

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

STEP 2:ブランチを再試行してください

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

この時点で、GUIを使用している場合は、マージウィンドウが表示されます。その後、通常どおり続行できます。

0

In Atom私はいくつかのファイルが解決されたマージの競合をドライブに保存しないという問題があったので、手動で「保存」をクリックしなければなりませんでした。

0
Timar Ivo Batis