Gitは私のファイルに左のヘッドマークをマージします


101

コマンドラインで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ブランチで行った変更がマスターブランチにマージされた方法を誰かが知っていますか?

回答:


96

それらは競合マーカーです。まだマージ処理中ですが、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(""); }

4
@lowerkeyマージされた最終結果がどのように見えるかを正確に示します。私の推測では、gh-pagesバージョンの一部だけが本当に必要なので、<<<<<<to からのものを======削除し、1 >>>>>>行も削除して、実際のコードの2行を=======との間に残し>>>>>>ます。
アンバー

おかげで、コツをつかんでいると思います。頭から======までをすべて削除してから、残りのHEADmarkを削除します。
12

1
はい、そうです。( -あなただけの競合がなかった場合はGitが正常に自動的に行うことになる、マージの結果をコミットしている。本当の世話をするために「休止」はありません)
アンバー

2
@lowerkey、トピックに関する読むことも検討してください。VCSがどのように機能するかについての特定の基本的な知識が不足しているようであり、将来起こり得る問題に備えておく方がよいので、この本全体を読むことをお勧めします。
kostix

1
面白いですね。この質問への回答は他の質問で見つけることができますが、この質問の複製としてマークされている質問の回答を指し示します。
t3chb0t 2017

22

絶対に '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

6
私は絶対に「最初にgit statusあなたが得たものを見る」というアドバイスをしたいと思います:いくつかのサークルではGitの想像上の複雑さを非難するのは魅力的ですが、実際にgit statusはの出力を注意深く読むだけで次に何をすべきか理解するのに十分です最も一般的な状況で。したがって、本当に:何かがうまくいかない場合は、止めて、読んでgit status、考えてください。
kostix

4

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


0

Atomでは、解決されたマージの競合をドライブに保存しないファイルがあるため、手動で[保存]をクリックする必要があるという問題がありました。理解するのにかなり時間がかかりました。


0

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

覚えておいてください。これは、の直後に、merge->add->commit混乱したことに気付き、プロセスをやり直したい場合にのみ機能します。

ステップ1:以前のコミットにリセットします。

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ステップ2:ブランチのマージを再試行する

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.