マージの競合に対処することなく、ローカルファイルをプッシュしてリモートリポジトリに配置したいと考えています。ローカルバージョンをリモートバージョンよりも優先したいだけです。
Gitでこれを行うにはどうすればよいですか?
config receive.denyNonFastforwards
。
マージの競合に対処することなく、ローカルファイルをプッシュしてリモートリポジトリに配置したいと考えています。ローカルバージョンをリモートバージョンよりも優先したいだけです。
Gitでこれを行うにはどうすればよいですか?
config receive.denyNonFastforwards
。
回答:
次のコマンドを使用して、ローカルリビジョンをリモートリポジトリに強制できるはずです。
git push -f <remote> <branch>
(例git push -f origin master
)。立ち去る<remote>
と、<branch>
設定したすべてのローカルブランチが強制的にプッシュされ--set-upstream
ます。
注意してください。他の人がこのリポジトリを共有している場合、その変更履歴は新しいリポジトリと競合します。また、変更後のローカルコミットがある場合、それらは無効になります。
更新:サイドノートを追加すると思いました。他の人がレビューする変更を作成している場合、それらの変更を含むブランチを作成し、定期的にリベースしてメインの開発ブランチで最新の状態に保つことは珍しいことではありません。これが定期的に行われることを他の開発者に知らせて、彼らが何を期待するかを知ってもらいます。
アップデート2:視聴者の数が増加しているためupstream
、フォースプッシュが発生した場合の対処方法について追加情報を追加したいと思います。
私があなたのリポジトリを複製し、そのようないくつかのコミットを追加したとしましょう:
D ---- Eトピック / A ---- B ---- C開発
しかし、後でdevelopment
ブランチはでヒットされ、rebase
実行するとgit pull
次のようなエラーが発生します。
オブジェクトの解凍:100%(3/3)、完了。 <repo-location>から *ブランチ開発-> FETCH_HEAD <ファイル>の自動マージ CONFLICT(コンテンツ):<場所>での競合のマージ 自動マージが失敗しました。競合を修正してから結果をコミットします。
ここで私は衝突を修正することができましたcommit
が、それは私に本当に醜いコミット履歴を残すでしょう:
C ---- D ---- E ---- Fトピック / / A ---- B -------------- C '開発
魅力的に見えるかもしれませgit pull --force
んが、取り残されたコミットが残るので注意してください。
D ---- Eトピック A ---- B ---- C '開発
したがって、おそらく最良のオプションはを実行することgit pull --rebase
です。これにより、以前と同様に競合を解決する必要がありますが、コミットする代わりに各ステップでを使用しますgit rebase --continue
。結局、コミット履歴はずっと良く見えるでしょう:
D '--- E'トピック / A ---- B ---- C '開発
更新3:カップケーキの回答で述べられているように--force-with-lease
、このオプションを「より安全な」強制プッシュとして使用することもできます。
「リース」を使用した強制プッシュでは、リモートに予期しない新しいコミットがある場合(技術的には、まだそれらをリモート追跡ブランチにフェッチしていない場合)、強制プッシュが失敗します。これは、次の場合に便利です。まだ知らない他人のコミットを誤って上書きしたくないので、自分のコミットを上書きしたいだけです。
git push <remote> <branch> --force-with-lease
--force-with-lease
次のいずれかを読むと、使用方法の詳細を知ることができます。
-f
フラグを使用して、初めてOpenShiftにプッシュします。基本的に、ローカルgitをOpenShiftに配置します。
基本的には、リモートブランチを上書きするためにローカルブランチを強制的にプッシュする必要があります。
次の各コマンドの詳細な説明が必要な場合は、以下の詳細セクションを参照してください。基本的に、Gitでの強制プッシュには4つの異なるオプションがあります。
git push <remote> <branch> -f
git push origin master -f # Example
git push <remote> -f
git push origin -f # Example
git push -f
git push <remote> <branch> --force-with-lease
各コマンドの詳細な説明が必要な場合は、以下の私の長い回答のセクションを参照してください。
警告:強制プッシュは、リモートブランチを、プッシュしているブランチの状態で上書きします。これが実際に使用したいことを確認してから使用してください。そうしないと、実際に保持したいコミットが上書きされる可能性があります。
特定のブランチとリモートを完全に指定できます。-f
フラグの短いバージョンであります--force
git push <remote> <branch> --force
git push <remote> <branch> -f
pushブランチへのブランチが省略されている場合、Gitは構成設定に基づいてそれを理解します。2.0以降のGitバージョンでは、新しいリポジトリには、現在チェックアウトされているブランチをプッシュするデフォルト設定があります。
git push <remote> --force
2.0より前のバージョンでは、新しいリポジトリにはデフォルト設定があり、複数のローカルブランチをプッシュします。問題の設定はremote.<remote>.push
およびpush.default
設定です(以下を参照)。
リモートとブランチの両方が省略されている場合、justの動作はGit構成設定git push --force
によって決まりpush.default
ます。
git push --force
Git 2.0以降、デフォルト設定のはsimple
、基本的には現在のブランチを上流のリモートカウンターにプッシュするだけです。リモートはブランチのbranch.<remote>.remote
設定によって決まり、それ以外の場合はデフォルトでオリジンリポジトリに設定されます。
Gitバージョン2.0より前のデフォルト設定はmatching
、基本的に、すべてのローカルブランチをリモート上の同じ名前のブランチにプッシュするだけです(デフォルトはoriginです)。
git-config(1)マニュアルページをpush.default
読んgit help config
だり、オンライン版を読んだりして、より多くの設定を読むことができます。
--force-with-lease
「リース」を使用した強制プッシュでは、リモートに予期しない新しいコミットがある場合(技術的には、まだそれらをリモート追跡ブランチにフェッチしていない場合)、強制プッシュが失敗します。これは、次の場合に便利です。まだ知らない他人のコミットを誤って上書きしたくないので、自分のコミットを上書きしたいだけです。
git push <remote> <branch> --force-with-lease
--force-with-lease
次のいずれかを読むと、使用方法の詳細を知ることができます。
別のオプション(他の貢献者にとって問題になる可能性のある強制プッシュを回避するため)は、次のとおりです。
master
にしますorigin/master
master
、常に専用ブランチからのコミットを維持します(つまり、master
その上に新しいリビジョンを作成すると、専用ブランチがミラー化されます)。をシミュレーションする方法については、「あるブランチを別のブランチにするためのgitコマンドgit merge --strategy=theirs
そうすれば、何も強制せずにマスターをリモートにプッシュできます。
git push -fは、チームの他のユーザーが行ったリモートの変更をリセットするため、少し破壊的です。より安全なオプションは{git push --force-with-lease}です。
{--force-with-lease}が行うことは、私たちが期待する状態でない限り、ブランチの更新を拒否することです。つまり、誰も上流のブランチを更新していません。実際には、これは上流のrefが期待どおりであることを確認することで機能します。これは、refがハッシュであり、親のチェーンをその値に暗黙的にエンコードするためです。何をチェックするかを正確に{--force-with-lease}に伝えることができますが、デフォルトでは現在のリモート参照をチェックします。これが実際に意味することは、アリスがブランチを更新してリモートリポジトリにプッシュすると、ブランチの参照ポインティングヘッドが更新されるということです。ここで、ボブがリモートからプルしない限り、リモートへのローカル参照は古くなります。{--force-with-lease}を使用してプッシュしようとすると、gitはローカル参照を新しいリモートに対してチェックし、プッシュの強制を拒否します。{--force-with-lease}を使用すると、変更を暫定的にリモートにプッシュした人が他にいない場合にのみ、強制的にプッシュすることができます。シートベルトを装着した状態で{--force}です。
私のために働く:
git push --set-upstream origin master -f
git push origin --force
うまくいきませんでしたか?