web-dev-qa-db-ja.com

アップストリームの変更をブランチにマージする際の問題

アップストリームの変更をブランチにマージしようとしているときに競合が発生しており、それらを解決する方法がわかりません。

独自のフォークを作成しました。クローンを作成しました。分岐のブランチに変更を加え、コミットしてプッシュしました。しかし、その後、メインフォークが更新され、次のようにアップストリームをマージして自分のフォークを更新しようとしました。

$ cd repo-name
$ git remote add upstream git://github.com/username/repo-name.git
$ git fetch upstream
$ git merge upstream/master

マージでは、ファイルに何らかの問題があり、自動マージが機能しないと言われています。自分で修正して再マージするように指示されます。そこで、実際にメインフォークのGitHubの(上流)リポジトリに移動し、新しいファイルのすべてのコードをフォークのファイルにコピーして、再度マージを試みました。次に、gitは私にこのエラーを与えます:

致命的:マージされていないファイルがあるため、「マージ」はできません。作業ツリーでそれらを修正してから、必要に応じて「git add/rm」を使用して解決をマークし、コミットするか、「git commit -a」を使用してください。

私が除外している議論はありますか?バカなことをしていますか? 「マージされていないファイル」とはどういう意味ですか?ファイルをマージすることの全体のポイントではありませんか?マージする前に変更をコミットする必要がありますか?

38
anonymous

表示されていることは、自動マージがファイル内の競合を解決できなかったことを意味します。これらの競合を手動で解決する必要があります。実行git mergetoolまたはgit gui

33
Let_Me_Be

「git merge」コマンドは、別のブランチからの変更を現在のブランチに組み込みます。マージがクリーンで、競合がないことを意味する場合、コミットします。マージには競合があったため、コミットしませんでした。競合を解決する必要があります。

アップストリームリポジトリからコピーをプルすることは、それを行う1つの方法です-アップストリームリポジトリのバージョンを受け入れます。 「git checkout --theirs conflicting_file.txt」を使用してgit内でそれを行うことができます

ファイルを編集して目的の形状にすることも、別の方法です。

修正したら、「git add conflicting_file.txt」を使用して追加し、コミットする必要があります。これで作業コピーはクリーンになり、さらにハッキングできるようになります。がんばろう。

12
cbare

Gitでは、マージrefusesがローカルの変更を保護するために開始する場合もあります。これは、次の2つの場合に発生する可能性があります。

  • リポジトリにcomcommitted changesがあり、merge と競合します。 gitは、次のメッセージとのマージを拒否します。

    エラー:次のファイルへのローカルの変更はマージによって上書きされます。
     foo 
    変更をコミットするか、マージする前にそれらを隠してください。
    中止
    

    次に、最初に変更をコミットする必要があります(git commit -aまたはgit add + git commit)、またはgit stash saveでそれらを隠します。

  • あなたはの中にいます未完 merge-y操作。たとえば、いくつかの競合がありました

     foo 
     CONFLICT(コンテンツ)の自動マージ:foo 
    自動マージの競合が失敗しました。競合を修正してから結果をコミットします。
    

    競合の解決が完了していない(ファイルを編集し、git addで解決済みとしてマークするか、git mergetoolを介してグラフィカルマージツールを使用する)か、git commit -aで最終マージコミットを作成しないか、git reset --hardでマージを中止しなかった( NOTE:これにより、すべての変更が破棄され、競合の解決に関する作業が失われます!!!)。

    または、2番目のgit mergeの実行速度が速すぎるか、git mergeの代わりにgit commitを使用してマージコミットを作成しました。

    エラー:マージされていないファイルがあるため、 'merge'はできません。
    ヒント:作業ツリーでそれらを修正し、
     hint:を使用してから 'git add/rm' as 
     hint:解決をマークしてコミットするのに適しています。
     hint:または 'git commit -a'を使用します。
     fatal:未解決の競合のために終了します。 。]

    説明されているように競合を解決します。古い マージを完了して楽しんでください Junio C Hamanoによる記事でgit commitを使用してマージを終了するか、マージを破棄するか、隠します。次に、この2番目のマージを作成するつもりであれば、それを行うことができます。

Sidenote:デフォルトでは、git-aware Shell Promptは、マージ、リベース、またはパッチの適用中かどうかを示します(git am操作)。作業ディレクトリが汚れているかどうかを表示するように設定することもできます(最新バージョン、つまりHEADとは異なります)。

7
Jakub Narębski

git commitではなく、git merge(ファイルの追加後)を2回実行します。

また、競合解決により、マージに役立つファイルが作成されます。 git mergetoolもご覧ください。

3
alternative

マージを解決した後、git addを使用して、変更したファイルをインデックスに追加し、コミットする必要があります(メッセージのように)。これはgitに「はい、本当にこれらの変更を行いたい」と言っています。

コマンドラインインターフェイスを使用している場合は、(通常またはマージをコミットする前に)コミットする前に常にgit addを使用してください。 magitなどのフロントエンドはこれを合理化できるため、毎回「git add」と入力する必要はありません。

2
Robin Green