マージの競合に対処せずに、ローカル ファイルをプッシュしてリモート リポジトリに置きたいです。ローカル バージョンがリモート バージョンよりも優先されるようにしたいだけです。
Git でこれを実行するにはどうすればよいですか?
ベストアンサー1
次のようにして、ローカルリビジョンをリモートリポジトリに強制的に反映させることができます。
git push -f <remote> <branch>
(例git push -f origin master
)。 と を省略すると<remote>
、<branch>
が設定されているすべてのローカル ブランチが強制的にプッシュされます--set-upstream
。
ただし、他の人がこのリポジトリを共有している場合、その人のリビジョン履歴は新しいものと競合することに注意してください。また、変更後のローカルコミットがある場合は無効になります。
更新: 補足事項を追加しておきます。他の人がレビューする変更を作成する場合、それらの変更を含むブランチを作成し、定期的にリベースしてメインの開発ブランチと最新の状態に保つことは珍しくありません。他の開発者に、これが定期的に行われることを知らせて、何を期待すべきかを知ってもらうようにしてください。
更新 2upstream
: 視聴者数が増加しているため、強制プッシュが発生した場合の対処方法について追加情報を追加したいと思います。
リポジトリをクローンし、次のようなコミットをいくつか追加したとします。
D----E トピック / A----B----C 開発
しかし、その後、development
ブランチは にヒットしrebase
、 を実行すると次のようなエラーが発生しますgit pull
。
オブジェクトの解凍: 100% (3/3)、完了。 <リポジトリの場所> から * ブランチ開発 -> FETCH_HEAD <ファイル> の自動マージ CONFLICT (コンテンツ): <locations> でのマージ競合 自動マージに失敗しました。競合を修正してから結果をコミットしてください。
ここで競合とを修正することはできます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
このオプションを「より安全な」強制プッシュとして使用することもできます。Cupcakeが回答で述べたように:
「リース」を使用した強制プッシュでは、リモートに予期しない新しいコミットがある場合 (技術的には、リモート追跡ブランチにまだフェッチしていない場合)、強制プッシュが失敗します。これは、まだ知らない他の人のコミットを誤って上書きしたくない場合や、自分のコミットのみを上書きしたい場合に便利です。
git push <remote> <branch> --force-with-lease
使用方法の詳細については、
--force-with-lease
以下のいずれかをお読みください。