リモートリポジトリにリセットを強制的にプッシュする方法は?


94

リモートのmasterブランチがどういうわけかめちゃくちゃになりました。現在の開発コードは、最新のコミットとともにmasterブランチにあります。明らかに、開発コードはマスターブランチの準備ができていません。

そのため、私のローカルリポジトリで、最新のタグにリセットしましたgit reset --hard (Tag)。マスターブランチがローカルリポジトリで正しくなりました。変更をリモートリポジトリにプッシュしようとするとgit push origin master、エラーが発生します。

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

だから周りを見回した後、私は--forceオプションを見つけました。そのため、リモートリポジトリに強制的にプッシュしましたgit push --force origin masterが、それでもエラーが発生しました。

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

マスターにできない開発コードが含まれているため、マスターをプルできません。


3
このメッセージは、早送り以外のプッシュを実行する権限がないことを意味していると思います。
スビック

3
あなたは正しかった、ありがとう。リモートのリポジトリの設定ファイルで、denyNonFastforwards = true。これをfalseに変更し、変更をプッシュしてから、trueに戻しました。助けてくれてありがとう、みんな。
Samwell

2
@samwellはsvickの回答を承認
済み

@samwell svickの答えはあなたのために機能しましたか?
Songo

samwellのようにdenyNonFastForwardsを無効にする方法の詳細が必要な場合は、こちらの手順をご覧ください:stackoverflow.com/a/43721579/2073804
ron190

回答:


152

このメッセージは、早送り以外のプッシュを実行することはできないことを意味します。

あなたのリモートリポジトリはおそらくdenyNonFastforwards = trueその設定にあります。あなたがそれを変えれば、うまくいくgit push --forceはずです。

設定を変更するには、リモートリポジトリがあるマシンにアクセスする必要があります。そこから、やりますgit config receive.denynonfastforwards false


1
あなたはgit configサーバーのためにできますか?あるいは多分それを比喩的に使っていたのかもしれません。これらのアイデアを試すために、/opt/git(私のgitサーバースペース)にテストリポジトリを作成し、次にこの設定をで変更しました/opt/git/the_repo/the_repo.git/config。しかし、一度完了するとgit push --force origin SHA:branch、必要に応じて機能します。
HankCa、2015

4
エラーメッセージには「error:failed to push refs to <your repository>」という行が含まれます。<your repository>は、「config」というファイルを含むディレクトリである.gitで終わるパスです。この「構成」ファイルでは、denyNonFastforwards = false
emery

1
@emeryのコメントは貴重です。サーバー上のフォルダーの起点が/srv/git/repo.gitのように設定されている場合があります。これは、アプリケーションフォルダではなく、denyNonFastForwardsが設定されている構成です。
Elijah Lynn

1
@hsalimiサーバーにアクセスできない場合は、サーバー管理者に連絡して一時的にオフにする必要があるため、強制的にプッシュしてからオンに戻すことができます。しかし、ほとんどがこれを行う立場にあるとは考えられません。独自のホスティングチームがいる内部環境ではより一般的です。
Elijah Lynn

1
これは最初はイライラしますが、その美しさは次のとおりです。リモートはデフォルトで完全に保護されています。開発者が意図的に正しくリベースしている場合は、この構成をオーバーライドして危険な動作を許可できます。リベースは、すべてのgitユーザーが実行方法を知っている必要があり、実行しない場合は知っている必要があります。 doc1 doc2
moodboom 2017

15

リモコンは非早送りを許可していません。

あなたの最善のオプションは、git revertそこにあるべきではないすべてのコミットと将来的にもっと注意することです。

git revert [commit]行ったことを元に戻す新しいコミットを作成[commit]します。


高速転送以外のすべての変更をブロックしたのは、リモートリポジトリの一部の設定でした。
samwell

これを行ってコミットを再適用する必要がある場合、コードの変更を元に戻すと履歴は削除されず、コミットを選択したりマージしたりできなくなります
mtpultz

12

次のスタイルでフォースプッシュを永続的に有効にする手順

git push -f myrepo my-branch

リモートリポジトリの「.git」で終わるフォルダにある「config」という名前のファイルを編集します

失敗したプッシュからのgitのコマンドライン出力で、次のような行を探します。

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

その後

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

「denyNonFastforwards」をfalseに設定します

「config」で設定

[receive]
        denyNonFastforwards = false

-fを使用してローカルマシンからプッシュできるようになりました

git push -f myrepo my-branch

SSHにアクセスせずにこれを行うにはどうすればよいですか?
Vladimir Vukanac

たぶん、richoが示唆するようにgit revertコマンドを使用しますか?リポジトリの現在の状態を最初にバックアップした場合でも、コードをマージして先に進むことができます。
エメリー、2016年

git revertマージがあると、ちょっと複雑になります。さらに複雑なのは、私のケースには3つのマージがあり、そのうちの1つは非常に古い〜20のコミットが開発から分岐していること、2つ目はマスターからのマージの一種です-地獄のように醜いことです。
Vladimir Vukanac

1
おそらく解決策は、目的の状態にリセットし、バックアップ(stash)、再度プルして、バックアップ(stash)を適用することです。
Vladimir Vukanac

1
mrWでも、リバート/プルされたコードベースの上に、必要なコードベースをマージできます
emery

11

-fフラグを使用して、リモートブランチ名の後に置きます。

git push origin master -f


1
いいえ、それもうまくいきませんでした。私もgit push -f origin master同じ結果を試しました。どちらの場合も、2回目のエラーメッセージが表示されました。
Samwell

2

早送りではないgit pushを実行することはできません。

  1. リモートがGitHubの場合はhttps://github.com/$USER/$REPO/settings/branches、問題のブランチに移動して、保護を解除します。

    ここに画像の説明を入力してください

    そのためには、リポジトリの管理者である必要があります。

  2. リモートが自分のgitサーバーである場合は、git config receive.denynonfastforwards falseそこで実行します。


Git Hub Enterpriseインスタンスの場合、デフォルトブランチ(通常は「マスター」)へのプッシュをインスタンスレベルで無効にできることに注意してください。つまり、「マスター」が保護されていなくても、サイト管理者であっても、デフォルトのブランチに強制的にプッシュすることはできません。権限があると仮定すると、デフォルトのブランチを別のものに切り替え、強制プッシュを実行してから元に戻すことで、一時的にこれを回避できます。
クリストファーハンター


0

現在のブランチがPULLに対して適切に構成されていないため、問題が発生します。まず、-を使用して、上流のブランチがプル用に適切に構成されているかどうかを確認しますgit remote show origin。これは、「git pull」用に構成されたローカルブランチのセクションにあります。そうでない場合は、以下を使用して構成します。

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

プレースホルダーに適切なブランチ名を付ける-MYBRANCH


0

私はこのコマンドグループを使用してリモートリポジトリをリセットします。これにより、ローカルリポジトリが再初期化されてリモートリポジトリと再リンクされ、更新が強制的にプッシュされます。

この方法はあなたのケースではうまくいかないと思いますが、他の人にとっては役立つかもしれません

ソースフォルダーに移動し、コマンドを実行します。これhttps://github.com/*.gitはリモートリポジトリリンクです。

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**


0

私にとって、@ svickのヒントは正しい方向を指しています。変更したいgitサーバーは実際には私のボックスなので、ログインして、git config --global receive.denynonfastforwards falseすべてのリポジトリを変更して、強制的な非ffプッシュを受け入れるようにしました。そのままでは機能しませんでした。私が見つけたのは、設定にすでにreceive.denynonfastforwards=true設定されており、で消去できないことgit config --global --unset receive.denynonfastforwardsです。vi configただし、リポジトリで手動で編集する()ことはできました。


0

マスターブランチを保護されたデフォルトから削除することで解決しました。これは、リポジトリの設定で保護されたブランチルールを超えたデフォルトです。

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