GitHubでリモートの変更をマージする方法は?


137

次のエラーが発生します。最初のGithubプッシュを試みます。

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

これを修正してリモートの変更をマージするにはどうすればよいですか?

回答:


106

詳細については、「git push --help」の「非早送り」セクションを参照してください。

「git pull」を実行して、潜在的な競合を解決し、結果を「git push」できます。「git pull」は、コミットAとBの間にマージコミットCを作成します。

または、「git pull --rebase」を使用して、XとBの間の変更をAの上にリベースし、結果をプッシュすることもできます。リベースは、Aの上にXとBの間の変更を構築する新しいコミットDを作成します。


16
「git pull」を実行すると「Already to up-date」と表示されることを除いて、私はこれに遭遇し続けます。「git pull --rebase」を実行すると、「現在のブランチマスターは最新の状態です」と言われます。何か案は?ありがとう!
jwl '09 / 09/28

3
@ larson4同じ問題が発生しましたが、を実行した後git pull、別のコミットを実行すると、問題はなくなります
Patrick

20
@Patrick @larsonエラーメッセージを注意深く読んでいないために、同様の問題が発生しました。拒否は私がチェックアウトしていないブランチにありました。私が実際に行っていたブランチは成功していました。解決策はでしたgit checkout other-branch; git pull; git push; git checkout branch-i-was-working-on
Noah Spurrier 2012

86

ブランチ名の前に+記号を追加して、強制的にプッシュすることもできます。

git push origin +some_branch

1
ありがとう、これは私のために働きます。他の解決策は私の影響を完全に消し去りますgit reset --hard
Oli

1
ありがとう!ブランチ "A"をHerokuステージングアプリにプッシュして、本番環境で一部の機能をテストしました。次に、(ローカルで)「A」と「B」を「マスター」にマージし、ステージングアプリに「マスター」をプッシュしたいと考えました。いろいろな問題がありました。これにより、「マスター」のプッシュが非常に簡単になりました。ありがとう!
Don Leatham、2012年

私も働いた。問題を見つけるのに4時間かかった。どうもありがとう。私はローカルマシン(Windows 7)でNetbeansを実行し、ローカルでプッシュするたびにリモートマシン(Linux)でチェックアウトしたいと思っていました。
Maxim Shoustin、2012年

この方法は安全ではない場合があり、分岐したコミットの一部が到達不能になる可能性があることに注意してください。
samuil 2013

これは受け入れられる解決策です。他の解決策は私にとってうまくいかなかった
banarun 2014年

20

おそらくあなたはマージしていないgithubの変更があります。試しgit pullて変更をフェッチし、マージし、その後はプッシュすることができるはずです。あなたの質問を誤解した場合は申し訳ありません。


18
リモートマスターでの変更を拒否して独自の変更をプッシュする必要がある場合は、-fキーを使用してプッシュしてみてください
Hotsyk

13

「git pull」していて、「Already up-to-date。」と表示されていてもこのエラーが発生する場合は、他のブランチの1つが最新でないことが原因である可能性があります。別のブランチに切り替えて、ブランチが最新であることを確認してから、もう一度「git push」を試みてください。

ブランチ「foo」に切り替えて更新します。

$ git checkout foo
$ git pull

次のコマンドを発行すると、取得したブランチを確認できます。

$ git branch

これが機能し、必要な理由を説明できますか?(それは私の問題を解決しました。)それは私には直感に反するようです。どうしてgitがmasterブランチをプッシュするために、別のブランチを最新の状態にする必要があるのか​​理解できません。
Quinxy von Besiex、2015

@QuinxyvonBesiex自分が理解できるかわかりません。これは、Git自体の基本的な構造、およびブランチの編成方法(基本的には、私が理解している限り、タグと同じです)に関係している可能性があります。
David Calhoun、

7

強制的にプッシュすることもできますが、何をしているのかよくわかっている場合にのみこれを実行してください。

コマンドは次のとおりです。

git push -f 

3

この問題は、タグが競合している場合にも発生する可能性があります。ローカルバージョンとリモートバージョンが異なるコミットに同じタグ名を使用している場合、ここで終了する可能性があります。

ローカルタグを削除することで解決できます:

$ git tag --delete foo_tag

2

このエラーが発生したとき、プロジェクトフォルダ全体をバックアップしました。それから私は何かをしました

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

...ブランチ名に依存します(マスターでない場合)。

それから私はしましたgit pull --rebase。その後、プルしたファイルをバックアップしたプロジェクトのファイルに置き換えました。これで、変更を再度コミットしてプッシュする準備ができました。


0

1)プルを強制してローカル変更を上書きする

ローカル行われた変更を気にせず、リポジトリからコードを取得したい場合は、プルを強制できます。これにより、コンピューターで行われたすべてのローカル変更が上書きされ、リポジトリ内のバージョンの複製コピーが表示されます。

IDEで次のコマンドを実行します。

gitリセット-ハード

git pull

これにより、すべてのローカル変更が即座に破棄されます。そのため、自分が何をしているかを理解し、ローカル変更を必要としないことを確認してください。

2)両方の変更を保持する(ローカルおよびリポジトリから)

両方の変更(ローカルで行われた変更とリポジトリに存在する変更)を保持する場合は、変更を追加してコミットできます。プルすると、明らかにマージの競合が発生します。ここでは、IDEのツール(Difftoolやmergetoolなど)を使用して2つのコードを比較し、保持する変更と削除する変更を決定できます。これは中道です。手動で削除するまで変更は失われません。

git add $ the_file_under_error

git commit

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