プルするたびにgit pullですべてを強制的に上書きするにはどうすればよいですか?


203

CENTRALベアリポジトリがあり、3つの開発者リポジトリが通常の方法でプルおよびプッシュしています。

また、CENTRALのベアリポジトリからプルする他の2つのリポジトリがあります。1つはライブサーバー、もう1つはテスト/ステージサーバーで、それぞれがそれぞれのブランチからプルします。

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

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

私が起こしたいのはこれです:私はライブサイトとテストサイトからのプルを常にプル/上書き/マージして欲しいです。常に。これらのリポジトリは開発用ではないため、プルオンリーになります。

私のすべての調査では、ローカルファイルの上書きを常に強制的に実行させる適切な解決策を見つけることができません。これはまったく可能ですか?もしそうなら、それは素晴らしい開発シナリオを作るでしょう。


1
以下の「先ほど取得したものにリセットする」という回答に投票しましたが、実際の問題の解決策は、帯域外の変更を行わないことです。変更は、緊急度に関係なく、常にバージョン管理を行う必要があります。運営者以外は誰も実行中のサイトに直接アクセスできません(開発者ではありません)。バージョン管理を一貫して使用することは、いつ変更が行われたか、誰が変更したか、およびそれらを操作するためのより良いツールの記録があることを意味します。なぜそれを破壊するのですか?
Phil Miller

1
@Novelocrat右、私はあなたが言っていることを理解しています。残念ながら、誰かがファイルをサーバーに直接アップロードできるシナリオがいくつかあります。その場合、リポジトリを再同期するには、いくつかのコマンドを実行する必要があります。以前は、FTPスクリプトを使用してファイルをリポジトリからサーバーに移動していました。上記の提案された方法は、過去に非常にうまく機能していたFTPステップを単純に排除します。
bmilesp

3
したがって、人々がサーバーに直接アクセスすることを許可しないでください。FTPおよびSSHアクセスをロックアウトするか、責任のない変更を行うと解雇されることを伝えます。この種の練習を続けることは、長期的にはあなたとあなたのチームを傷つけるだけです。
Phil Miller

回答:


510

本当にこれを実行するための理想的な方法は、使用しないことですpullすべてではなく、その代わりfetchreset

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

masterフォローしたいブランチに変更します。)

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

cleanシステムのニーズに応じて、少し異なるオプションを検討することをお勧めします。


3
@ user730569 reset --hardは、作業ディレクトリ(および現在のブランチ)の状態を特定のコミットの状態に一致させるために使用されるコマンドです。
アンバー

25
FETCH_HEADfetch、フェッチされた参照を表すためにによって自動的に作成される参照です。マージされるのではなく、フェッチを行うたびに完全に上書きされます。clean追跡されていないファイル削除コマンドでgit-dfディレクトリを(削除するフラグがそれを教えて-d除去を行い、実際に)とは、( -f)。
アンバー

4
なぜこのためのキーワードがないのですか?私はこれをプルよりもずっと頻繁に必要とします。
Wolfgang Fahl 2013年

14
使用するgit clean -dn前に使用git clean -dfすると、どのファイル/フォルダーが削除されるかがわかります。git clean -dfバックアップがある場合にのみ元に戻すことができます
Ibrahim Lawal

1
@NickMiddleweek心配していたgit clean -dfgitignoredファイルも削除されますが、削除されないことがわかりました。git clean --help「通常、Gitで認識されないファイルのみが削除されますが、-xオプションが指定されている場合、無視されたファイルも削除されます。これは、たとえば、すべてのビルド製品を削除するのに役立ちます。」
Nickang 2017


6

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

git reset --hard
git pull

あるいは

git stash
git pull

1つのコマンドで実行するには:git reset --hard && git pull。代わりに、しかしより良くない、git reset --hard; git pull。を使用&&すると、最初のコマンドが成功した場合にのみ2番目のコマンドが実行されます。;最初のコマンドの終了コードに関係なくそれを実行します。
mazunki

5

ブランチのコピーをプルし、オリジンからローカルファイル強制的に上書きするには、次のコマンドを使用します。

git reset --hard origin/current_branch

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


5
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch

2

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

# 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
xは何をしますか?スイッチについて説明してください
Steve K

2
xはすべての追跡されていないファイルを削除することになっていると思います。マンページで言うのは難しいので、SOを使用しています。
JosephK

2
@JosephK:不正解です。の基本的な目的git cleanは、すでに「作業ツリーから追跡されていないファイルを削除する」(ページの上部)です。通常、これには無視されたファイルは含まれませんが、無視されたファイルも含める-xように指示git cleanされます(ただし、-eオプションで無視されたファイルには影響しません)。
ディートリッヒエップ

2

最後のプル/クローン以降にローカルの変更をまだコミットしていない場合は、以下を使用できます。

git checkout *
git pull

checkout最後のローカルコミットでローカルの変更をクリア pullし、リモートリポジトリに同期します

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