GitHubにプッシュできません-マージが必要だと何度も言っています


743

GitHubは初めてです。今日、コードをGitHubにプッシュしようとしたときにいくつかの問題に遭遇しました。

Pushing to git@github.com:519ebayproject/519ebayproject.git
To git@github.com:519ebayproject/519ebayproject.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:519ebayproject/519ebayproject.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

リポジトリにはまだ何もプッシュしていませんが、なぜ何かをプルする必要があるのですか?


6
これは、以前にローカルにアクセスしたブランチでも発生する可能性があることに注意してください。そのような古いブランチを早送りする、または単にローカルリポジトリでgitにそれを忘れさせる簡単な方法はありますか?
–ThorbjørnRavn Andersen 2013

50
@ThorbjørnRavnAndersen-私は 'git push -f'を使用してこのシナリオをなんとか修正しました。これにより、gitは架空の問題を忘れるように見えました:)
エシェロン

6
git newcomerからこれについて文句を言った。その理由は、GitHubで新しいプロジェクトを作成するとき、チェックボックスを「Readmeで初期化」のままにするか、.gitignore / GPLオプションを選択するため、新しいプロジェクトにはローカルにないコミットがすでに存在するため、上記のエラーによって混乱が生じます。
Ruslan Kabalin 2013年

4
@Echelonプッシュを強制する-fオプションは危険です。私はそれをチームプロジェクトで使用しただけで、6つのコミットが「ストライプ化」され、サーバーから削除されただけで、元に戻す方法がありませんでした。
Deleplace 2014年

42
gitを賞賛するのはその流行。しかし、私が話をしたほとんどすべての開発者は、個人的にgitを嫌うことに個人的に同意しています。gitを使用するようになったため、perforceやTFSを使用していたときと比べて、ソース管理により多くの時間を費やしています。
developer747

回答:


762

これにより、リモートリポジトリがコミットを失う可能性があります。注意して使用してください。

リモートブランチをローカルブランチにマージしたくない場合(git diffとの違いを参照)、強制プッシュを実行するには、-fを指定しpushコマンドを使用します。

git push -f origin <branch>

リモートリポジトリのorigin名前はどこですか。

通常、コマンドは、それを上書きするために使用されたローカル参照の祖先ではないリモート参照の更新を拒否します。このフラグはチェックを無効にします。これにより、リモートリポジトリがコミットを失う可能性があります。注意して使用してください。


1
これは、Githubにあるリポジトリでうまくいきましたが、アプリ内にHerokuのサブモジュールがありました。ファイルをサブモジュールから取り出して、更新されたアプリをHerokuにプッシュする必要がありました。
JGallardo 2013年

24
この投稿のコメントの最後の行を必ずお読みください。「これによりリモートリポジトリのコミットが失われる可能性があります。慎重に使用してください。」チーム環境で強制的にプッシュすることは危険なことであり、通常は回避する必要があります。
Adam Kalnas 14

また、チェリーピックを使用して、元のリポジトリからリモートにすべての履歴を追加し、「1つの」コミットを移動することもできます。バックアップからの復元が必要です...
rickfoosusa

また、Githubを使用している場合、これにより、最新のコミットで以前に作成したオープンプルリクエストが上書きされる可能性があることにも言及する価値がありますGithub Docsから:「強制プッシュはプルリクエストを破壊する可能性があります」。
アームフット2017

これでうまくいきました。試し$ git pull origin master -vましたがエラーになりますfatal: refusing to merge unrelated histories。それから私はこれを試しました、そしてそれはうまくいきました、そして私のローカルファイルはgithubリモートレポに現れました。
Vir

238

メッセージが伝えるように、

リモートの変更をマージします( 'git pull'など)

git pullリモートリポジトリからローカルリポジトリに最新の変更をプルするために使用します。この場合、ローカルリポジトリに変更を加えたため、変更をプルするにはマージが必要です。

説明する例と画像を提供します。起点/分岐からの最後のプルがコミットBであったと仮定します。いくつかの作業を完了してコミットしました(コミットC)。同時に、他の誰かが作業を完了し、それをオリジン/ブランチにプッシュしました(コミットD)。これらの2つのブランチをマージする必要があります。

local branch:                         --- Commit C 
                                    /
                                   /
                                  /
origin/branch: Commit A ------ Commit B ---- Commit D

あなたがプッシュしたい人なので、Gitはマージを実行するように強制します。これを行うには、最初にorigin / branchから変更をプルする必要があります。

local branch:                         --- Commit C -- Commit E
                                    /               /           
                                   /               /             
                                  /               /               
origin/branch: Commit A ------ Commit B ---- Commit D 

マージが完了したら、変更をプッシュすることにより、オリジン/ブランチをコミットEに早送りすることができます。

マージは競合を引き起こす可能性があるため、Gitではマージを自分で処理する必要があります。


7
マージしたくない場合はどうなりますか?そして、Dを(少なくとも今のところは)側枝のままにしておきます。後で、Cの後でもっとコミットするかもしれません。他の誰かがDの後にもっとコミットするかもしれません。マージせずにサイドブランチをプッシュするにはどうすればよいですか?~~~
スティーブピッチャー

3
local / branchおよびorigin / branchは、同じブランチを表すが、異なるマシン上にあることを意味します(ローカルとオリジン)。ローカル/ブランチをプッシュすることは、オリジン/ブランチを更新することです。ブランチの状態を他のユーザーに表示したい(つまり、オリジン上)が、オリジン/ブランチとマージしたくない場合は、ローカル/ブランチ(gitブランチ[名前])から新しいブランチを作成し、そのブランチをオリジンにプッシュします(git push -u origin [name])
Jake Greene

1
素晴らしい説明。このビデオでは、@ JakeGreeneで説明されている問題の簡単なデモンストレーションとその解決方法、および新しいリポジトリを設定するときに最初に問題を回避する2つの方法を示します。
Kevin Markham 2014年

4
年後、この回答は他の
スーパージョー

1
私にとってgit pullも印刷Already up-to-date。私はブランチiにいましたが、分離されたHEADブランチ(おそらく失敗したマージから?)にいることがわかりました。これは実行後に明らかgit branchでした。実行した後、git checkout mybranchすべてが期待どおりに機能しました。
ストライダー、

200

プッシュする前にコードを更新しましたか?

git pull origin master何かを押す前に使用してください。

私はあなたがoriginリモコンの名前として使っていると思います。

何かをプッシュする前にローカルリポジトリを最新の状態にするには、プッシュする前にプルする必要があります(他の誰かがですでにコードを更新している場合に備えてgithub.com)。これは、ローカルで競合を解決するのに役立ちます。


1
リポジトリ名を知るにはどうすればよいですか?私がgit pull origin mastergit と入力すると、文句を言われます'origin' does not appear to be a git repository
ziyuang

3
'origin'はリモートです。を使用git remote --verboseして、gitフォルダーの下に構成されているすべてのリモートを表示できます。画面に表示される情報には、「git@github.com」パスまたはHTTPSパスも含まれます。そこから、どこからプッシュするかを識別できます。お役に立てれば !
AYK

16
git pull origin master示すすでに最新の状態です。しかし、それからorigin_branchをプッシュしようとすると、これは問題になっている同じ警告を言います。なにか提案を !!
CoDe 2016

2
@Shubh問題を解決したことがありますか?私は同じものを得ています!
OriginalAlchemist

3
@OriginalAlchemistはい..リモートローカルブランチで作業しているのは私だけの開発者なので、ローカルブランチを強制的にプッシュしたので、ローカルシステムからの変更でサーバー上のオープンブランチのすべての変更を上書きします。git push -f <remote> <branch>例:git push origin <your_local_branch>このスレッドを確認してください。
CoDe 2016年

122

これは通常、他の誰かがすでに変更を加えたブランチで、前に変更git commitしようとしたときに発生します。git pushgit pullingx

通常の流れは以下のようになります、

ステップ1git stashそのブランチでのローカルのコミットされていない変更。

STEP 2git pull origin branch_name -vpull and mergeへ、ローカルにコミットし、そのブランチ上の変化(もしあれば、このマージにいくつかのメッセージを与え、修正競合しています。

STEP 3:EDの変更(あなたが望むなら、あなたはポップされたファイルにコミットを行うことができますか最初すでにコミットされた変更(STEP4)を押して、新しい以降のファイルにコミットします。git stash popstash

ステップ4git push origin branch_name -vマージされた変更。

元に戻しbranch_namemaster(のためのmaster分岐)。


3
どこにあるのcommit?後で変更をコミットすべきではありませんstash popか?
メフメット2016年

そうするべきです。通常、最初にマージされたコードをプッシュしてから、ローカルのコミットされていない変更をコミットします。一度にコミットしてプッシュすることもできます。ただ好み。
prayagupd

51

最初の簡単な解決策(非推奨)

  • このコマンドを試してくださいgit push -f origin master
  • このコマンドはリモートリポジトリを強制的に上書きします(GitHub)

推奨される解決策

  • 次のコマンドを実行します。
git pull --allow-unrelated-histories  //this might give you error but nothing to worry, next cmd will fix it
git add *
git commit -m "commit message"
git push

これがうまくいかない場合は、以下に従ってください🔰

  • .gitフォルダからディレクトリを削除します。
  • 次に、次のコマンドを実行します。

    git init
    git add .
    git commit -m "First Commit"
    git remote add origin [url]
    git push -u origin master
    

または

git push -f origin master 

git push -f origin masterうまく-uいかない場合にのみ使用してください。

これにより、ファイルのプッシュ中に発生するほとんどすべての種類のエラーが解決されます。


4
gitリポジトリを削除してコミット履歴全体を失うことは、「推奨」ソリューションですか?急いでいるようです。
Nils Guillermin、

@ニルスギレルミンそれはあなたの状況に依存します。すべてのマージの競合を修正する必要がある大規模なプロジェクトで作業している場合、vscodeを使用してすべての変更を簡単に確認およびマージします。しかしあなたの意見をありがとう。
Smit Patel

47

時々私たちは引っ張ることを忘れて、地元の環境で多くの仕事をしました。

引っ張らずに押したければ

git push --force

仕事中。これは他の人と一緒に作業する場合はお勧めできませんが、あなたの作業が単純なものや個人のおもちゃプロジェクトである場合は、すぐに解決できます。


$ git push --force origin master
shaurya uppal 2017年

2
これは私のために働いた:0人の他の協力者との個人的なプロジェクト。ここで他のいくつかの提案された「解決策」をSOで試しましたが、どれも非常に単純な問題であったものを修正しませんでしたreset --hard。その後、私はただ望んでいましたpushが、リモートリポジトリは私を許可する準備ができていませんでした。WarrenPは、runicを少なくすることでgit学習者を実際に助けることができます。多分彼は望んでいない。
マイクげっ歯類

2
使用しないか、正しく使用する方法を学んでください。チームが共有する重要な中央リポジトリへのプッシュを強制すると、すべての重要なリポジトリへのすべてのプッシュアクセスが失われるはずです。別の方法を学ばないようにするために自分のリポジトリで何をするかは、最終的に共有リポジトリで作業する能力に影響します。フォースプッシュの前に何が起こっているかがわかっている場合は、フォースプッシュで問題ないこともあります。そうでなければ、それは決して大丈夫ではありません。
Warren P

35

あなたがプッシュしようとしているブランチをGitが認識していないため、このエラーが発生する場合があります。

エラーメッセージにも含まれている場合

error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

次に、Jim Kubicekの便利なヒント、「現在のブランチのみをプッシュするようにGitを構成する」に従って、デフォルトのブランチを現在のブランチに設定します。

git config --global push.default current

32
git pull origin branch_name --rebase

これは私にとってはうまくgit pull origin branch_name --rebaseいきました-コマンドは最初にリモートのbranch_nameから変更をプルし、次にrebase現在のブランチをその上部にプルします。


20

上記の回答に加えて、以下が私にとってうまくいきました:-

シナリオ-

  1. my_branchをoriginに正常にプッシュしました。
  2. さらに変更を加えました。
  3. もう一度プッシュしようとすると(もちろん、追加、コミットを実行した後)、上記のエラーが発生しました。

解決 -

 1. git checkout **my_branch**
 2. git add, commit your changes.
 3. git pull origin **my_branch** (not origin, master, or develop)
 4. git push origin **my_branch**

証明


1
あなたは私を助けました。--allフラグを使用して別のブランチをプルしていても、別のブランチにチェックアウトしてリモートからプルする必要があることに気づくのに苦労しました。
MZanetti、

18

私は同じ問題を抱えていました、私がしたことは私がこれを使って最初に力でそれを押したということでした

git push --force

ファイルをコミットしてからエラーが発生した後、これを実行しました。すべてのファイルをコミットしてプッシュしました。その後、私がgithubにプッシュしたとき、私はそれが私に要求したことをしました、そしてそれはそれで大丈夫でした。これもあなたのために働くことを願っています:)


それは機能しますが、あなたが望むものではないかもしれません!これは、基本的に、永久に失われる変更を無視していることを意味します。
ロール

3
git push --set-upstream origin master --force
レジェンド

1
リポジトリを破壊する素晴らしい方法。プッシュを強制すると、履歴が破壊されます。また、プロがセットアップしたgitコードベースの多くは、これを行うことができません。
Oliver Dixon

これは重複した回答であり、元の質問はとにかく素晴らしいアドバイスではありませんでした。
ムーペット

これは実際に私がやりたいことですが、Gitlabで試したところ、Gitlabは「保護されたブランチ」でこれを許可していません
jeffery_the_wind

13

これについては、チュートリアル「GitHubの使い方:初心者向けのチュートリアル」で触れました。

GitHubに新しいリポジトリを作成すると、GitHubからreadmeファイルの作成を求められる場合があります。GitHubでreadmeファイルを直接作成する場合、「プッシュ」リクエストが成功する前に、まず「プル」リクエストを行う必要があります。これらのコマンドは、リモートリポジトリを「プル」し、それを現在のファイルとマージしてから、すべてのファイルをGitHubに「プッシュ」します。

git pull https://github.com/thomas07vt/MyFirstRepo.git master

git push https://github.com/thomas07vt/MyFirstRepo.git master

私はこれが1年後であることを知っていますが、これらのすべての回答のうち、私がgithubで1日目の問題を抱えている理由を実際に説明したのはあなただけです。プルとフェッチの違いは何ですか?
Xander Luciano

1
Fetchを使用すると、変更をローカルブランチにマージせずに、変更をうろつくことができます。プルはフェッチしてからマージするショートカットです。過去13か月でそれがわかったと思います。私は自分自身の混乱を作成したので、私はただ通過しています。;-)
wolfhoundjesse 2017

6

現在のブランチをプッシュしようとすると、上記のエラーメッセージが表示されましたfoobar

git checkout foobar
git push origin foo

同じリモートブランチを追跡する2つのローカルブランチがあったことがわかりました。

foo -> origin/foo (some old branch)
foobar -> origin/foo (my current working branch)

次を使用して現在のブランチをプッシュするのは私にとってうまくいきました:

git push origin foobar:foo

...そしてクリーンアップする git branch -d


6

git push -f origin ブランチ名

上記のコマンドは、リモートブランチコードが不要であることが確実な場合にのみ使用してください。そうでない場合は、最初にマージしてからコードをプッシュします。


5
これは悪い答えの複製です。
ムーペット

5

現在のプロジェクトを引き込みたくなく(そして、解決する必要のないマージの競合に直面する可能性がある)、別のブランチを作成したくない場合(これは別のブランチを管理するのは面倒です)、そして危険で永続的なgitを実行したくない forceコマンドを実行(コマンドを読んだ後でも、その実行の影響について私はしばしば驚きます)。

解決:フォルダのコンテンツを別のフォルダにドラッグし、プロジェクトを空のフォルダにプルし、プルしたコンテンツをゴミ箱にドラッグしてから、正しいプロジェクトをフォルダにドラッグします。適切にプッシュして、希望する結果を得ることができるはずです。これを行うのに文字通り10秒もかかりません。

結果を引用せずにこれを適切とは思わない人々、または将来私に不快感を与えるコマンドを使用するように人々に言うと、私はこう言います。「この方法では、文字通り10秒もかかりません。」実装に10秒もかからず、まったく同じ効果を持つgitコマンドが見つかった場合は、それを採用します。それまでは、この方法を使用しています。

この方法の欠点の1つは、マージが文書化されていない状態で実際にブランチにマージすると、コミット履歴が直線的に表示されることです。これは、グループを操作する場合の最良の方法ではない可能性があります。そのような場合はブランチで作業してください!


4

ちょうど同じ問題がありましたが、私の場合、リモートで間違ったブランチを入力しました。したがって、それはこの問題の別の原因であるようです...正しいブランチにプッシュしていることを再確認してください。


1
そして、私は前のコマンドをリコールした同じようなものを持っていました、それは完全に異なるリポジトリのためのものでした!
Clare Macrae 2013

4

私はまったく同じ問題を経験しましたが、自分が思っていたのとは異なる(ローカル)ブランチを使用しており、リモートからのコミットで正しいローカルブランチが遅れていることがわかりました。

私の解決策:正しいブランチをチェックアウトし、他のローカルブランチからコミットをチェリーピックし、git pullとgit push


4

同様の問題があり、ブランチを最新の状態に保つためのワークフローに誤りがあることがわかりました。私は次のことをしていました:

私の地元の「マスター」で

git fetch upstream
git merge upstream/master --ff-only

それから私の地元の支店に戻ります

git rebase master

これは以前のgitフローではうまくいきましたが、githubではうまくいきませんでした。これgit rebaseが同期の問題を引き起こしている問題でした(そして、私はそれを完全に理解せずに受け入れる必要があったことを認めます)残念ながら、git push -fおそらく最も簡単なオプションになった位置に私を置きました。良くない。

私の新しいフローはgit merge、次のように直接使用してブランチを更新することです。

私の地元の支店で

git fetch upstream
git merge upstream/master

もちろん、ローカルブランチで変更を加えるので、早送りする必要はありません。

おそらくおわかりのように、私はgitの専門家ではありませんが、このワークフローによっておそらく私が抱えていた特定の問題を回避できることを確信しています。


3

私の場合、「mybranch」をチェックアウトして実行していgit pullたため、プッシュが機能しなかった理由を理解できませんでした。最終的に、私は間違ったブランチをプッシュしていることに気付きました。のgit push origin master代わりに入力していたgit push origin mybranch

そのため、既にgit pullこのメッセージが表示されている場合は、正しいブランチをプッシュしていることを確認してください。


3

ブランチ名はリモートブランチ名と同じですか?

いいえの場合は、リモートブランチと同じ名前の新しいブランチをチェックアウトして、もう一度プッシュしてみてください。

プッシュするリモートブランチが[ testing ]で、ローカルブランチの名前が[ test ]であるとします。

testブランチにいない場合は、まずそれに切り替えます。

git checkout test

次に、新しいブランチを開いて、testingという名前を付けます

git checkout -b testing

さて、それをプッシュする時が来ました:

git push [remote repo] testing

2
$git branch -M <new_name>ローカルブランチの名前を変更するために使用してください。
coms '19年

3

私のGITリポジトリでこの問題を解決しました。この場合rebaseforceコミットする必要はありません。これを解決するには、以下の手順を使用します-

local_barnch> git branch --set-upstream to=origin/<local_branch_name> 

local_barnch>git pull origin <local_branch_name>

local_barnch> git branch --set-upstream to=origin/master

local_barnch>git push origin <local_branch_name>

お役に立てば幸いです。


2

別の解決策は、可能であれば、別のコミットを行うことによってリモートのヘッドを進めることです。この高度なヘッドをローカルサブツリーにプルした後、そこから再度プッシュすることができます。


2

最新の変更をgitwebに使用するベアGitリポジトリにプッシュしているときにも、同様のエラーが発生しました。私の場合、私はベアリポジトリに変更を加えなかったので、ベアリポジトリを削除して再度クローンを作成しました。

git clone --bare <source repo path> <target bare repo path>

2

gitリポジトリに誰も変更を加えておらず、最新バージョンで作業していることが確かな場合は、心の中での解決策としては意味がありません...git pull

次に、これはおそらく起こったことです、あなたは使用しました git commit --amend

完全に新しいスナップショットとしてコミットする代わりに、段階的な変更を以前のコミットと組み合わせることができます。また、スナップショットを変更せずに、以前のコミットメッセージを単に編集するためにも使用できます。

アトラシアンチュートリアル:履歴の書き換え

ただし、git commit --amend コミットをGitHubにすでにプッシュしている場合は実行しないことをお勧めします。これは、「修正しても最新のコミットが変更されるだけではなく、完全に置き換えられるためです。Gitにとっては、まったく新しいコミットのようになります」これは、GitHubの他の開発者にとって、履歴はA-> B-> Cのように見えますが、A-> B-> Dのように見えます。GitHubで許可された場合push、他の全員が手動で履歴を修正する必要があります

これがエラーメッセージが表示される理由です! [rejected] master -> master (non-fast-forward)。最新の変更を誰もプルしていないことがわかっている場合はgit push --force、これを実行できます。これにより、パブリックリポジトリのgit履歴変更されます。そうでなければ...あなたは実行できますがgit pull、これはあなたが通過しなかったのと同じ結果になると私は信じていますgit commit --amend、それは新しいコミットを作成します(すなわち:git pull後のgit history:A-> B-> C-> D )

詳細:最新のコミットを変更する方法


2

別のオプション:ブランチの名前をローカルで新しい名前に変更します。

その後、それをリモートリポジトリにプッシュすることができます。たとえば、それがコピー(バックアップ)を保持し、何も失われないようにする方法である場合です。

リモートブランチをフェッチしてローカルコピーを取得し、(i)リモートが持っていたもの(古いブランチ名で)と(ii)持っているもの(新しいブランチ名で)の違いを調べて、何をするかを決定できます。そもそもリモートの違いに気付いていなかったので(したがって問題)、どこかで変更をマージしたり強制したりするのはあまりにも残酷です。

違いを見て、作業するブランチを選択するか、他のブランチから必要な変更を選択するか、または取得したブランチで不要な変更を元に戻します。

次に、クリーンバージョンをリモートに強制するか、新しい変更を追加するかなどを決定する立場にいる必要があります。


1

pushコマンドの問題は、ローカルリポジトリとリモートリポジトリが一致しないことです。gitハブから新しいリポジトリを作成するときにデフォルトでreadmeを初期化すると、マスターブランチが自動的に作成されます。ただし、プッシュしようとすると、ブランチがありません。プッシュすることはできません...したがって、ベストプラクティスは、デフォルトのreadme初期化なしでリポジトリを作成することです。


1

この問題は通常、readme.mdファイルの作成が原因で発生します。これはコミットとしてカウントされ、システム上でローカルに同期されず、ヘッドの後ろに欠けているため、git pullリクエストが表示されます。readmeファイルを回避してから、コミットしてみてください。私の場合はうまくいきました。


0

この問題の別の原因(明らかにそれほど一般的ではない)...

私がプッシュしたとき、サーバーは約12時間遅れていました

サーバーのNTPをクロックに同期しました。

この投稿で説明したエラーを引き起こした新しいgit pushを実行しました。


0

万が一git pull印刷された場合Already up-to-dateは、グローバルgit push.defaultparam(In ~/.gitconfig)を確認してください。simpleにあった場合はに設定しmatchingます。以下の答えはその理由を説明しています:

Git-push.defaultの「matching」と「simple」の違いは何ですか

また、ローカルブランチが古いgit remote show originかどうかを確認し、必要に応じてプルを行うことも重要です。


0

使用git pull https://github.com/username/repository GitHubのリポジトリとリモートリポジトリが同期していないためです。あなたpullがリポジトリであれば、Pushすべてが同期され、エラーはなくなります。

`


0

git pull 印刷済み up-to-date

解決:

あなたはremote(server)でリポジトリ/プロジェクトを作成し、そこにいくつかのファイルを追加し、次にローカルでフォルダを作成して初期化したgit- git initこれは間違いですgit init、ローカルでは作成せず、代わりにプロジェクトをローカルにクローンしてくださいを使用してgit clone

次に引っ張る

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