web-dev-qa-db-ja.com

どのようにgit pullを強制して全てのpullで全て​​を上書きするのですか?

私はCENTRALの裸のリポジトリを持っています。そこには3つの開発者リポジトリが普通に引っ張ってプッシュしています。

私はCENTRALの裸のリポジトリから引き出す他の2つのリポジトリも持っています。1つはライブサーバー、もう1つはテスト/ステージサーバーです - それぞれがそれぞれのブランチから引っ張ってきます。

シナリオは次のとおりです。CENTRALリポジトリにpost-updateフックスクリプトがあり、テストリポジトリとライブリポジトリに自動的にアクセスし、それぞれに対してpullコマンドを実行します。これによりテストサーバーとライブサーバーの両方が更新されます。すべてのブランチで新しいコミットが行われているかどうかによって異なります。これはすべてうまくいきます。

問題はこれです。緊急時にはファイルが(ftpなどを介して)サーバー上で直接更新され、マージ/上書きの競合が発生するためCENTRAL更新後スクリプトが失敗することがあります。このシナリオを回避する方法はありません、そしてそれは避けられません。

ライブサイトとテストサイトからalwayspull/mergeにpullしたいのです。 Always.これらのリポジトリは開発用ではないためプルのみになります。

私のすべての調査では、pullalwaysにしてローカルファイルを強制的に上書きする良い解決策は見つかりません。これは可能ですか。もしそうなら、それは素晴らしい開発シナリオになるでしょう。

187
bmilesp

これを行うための理想的な方法は、pullをまったく使用せず、代わりにfetchresetを使用することです。

git fetch Origin master
git reset --hard FETCH_HEAD
git clean -df

(あなたがフォローしたいブランチにmasterを変更すること。)

pullは何らかの方法で変更をマージするように設計されていますが、resetは単にローカルコピーを特定のコミットに一致させるように設計されています。

あなたはあなたのシステムの必要性に応じてcleanへのわずかに異なるオプションを考慮したいかもしれません。

465
Amber

あなたはこれを試すことができます:

git reset --hard HEAD
git pull

(from どうやって "git pull"でローカルファイルを上書きするのですか?

もう1つのアイデアは、git全体を削除して新しいクローンを作成することです。

20
user1251007

1つのコマンドでそれを実行する方法がわかりませんが、次のようにすることができます。

git reset --hard
git pull

あるいは

git stash
git pull
6
Matt Wolfe

ブランチからコピーを取得し、Originからローカルファイルを強制的に上書きするには:

git reset --hard Origin/current_branch

現在の作業はすべて失われ、Originブランチと同じになります。

5
Andrew Atkinson
git reset --hard HEAD
git fetch --all
git reset --hard Origin/your_branch
4
Dzmitry

あなたはすべてをきれいに拭くためにフックを変えることができます。

# Danger! Wipes local data!

# Remove all local changes to tracked files
git reset --hard HEAD

# Remove all untracked files and directories
git clean -dfx

git pull ...
2
Dietrich Epp

前回のpull/clone以降、まだローカルの変更をコミットしていない場合は、次のようにします。

git checkout *
git pull

checkoutは最後のローカルコミットであなたのローカルな変更をクリアし、pullはそれをリモートリポジトリに同期させます。

2
Maviles