web-dev-qa-db-ja.com

Git「本番ブランチ」を本番サーバーにプルする「適切な」方法

私はGitを初めて使用するので、@ http://git-scm.com/book/en/Git-Branching-Basic-Branching-and-Merging のPro Gitブックを読みました。私の質問は、私が今日やっていることが、運用サーバーとリモートGitリポジトリを操作するための好ましい方法かどうかです。

私のリポジトリはGitHubでホストされており、3つのリモートブランチ(開発->テスト->マスター)を使用しています。

「testing」ブランチが機能していることが確認されたときはいつでも、私はgit merge 'testing'付きの 'master'(早送り?)、およびgit Push GitHubの「マスター」。

本番サーバー(/opt/www/url.com/)で、次のことを行いました。

git init
git remote add Origin https://github.com/.....
git pull Origin master

今度は、マスターを更新するたびにgit pull

git pull Origin master

プロダクションがリモートに変更をプッシュすることはありません。そして、ローカルな変更は起こりません。私はそれを正しくやっていますか?そうでない場合、更新を本番環境にプルするために推奨される方法は何ですか?

編集#1:私が今直面している本番サーバーでの競合を管理したくない(どういうわけか私は何か間違ったことをした)。私は、最新のマスターブランチをプルダウンして、それに切り替えたいだけです。

21
dropson

これには「git pull」を行うのはごく普通のことですが、より防弾的な方法があります。

なんらかの方法でローカルの変更を行わなかった場合、競合は発生しません。しかし、最新のツリーを取得し、ローカルの変更をすべて破棄したい場合は、ローカルを無視するより良い方法があります。

まず、サーバーから最新のものを取得する必要があります。これには「git pull」ではなく、以下を使用します。

git fetch Origin master

これは「git pull」の前半を行います。 (2つ目は、ローカルマスターへのマージであり、問​​題が発生した場所です)。

Gitフェッチは:

  1. リモートでコミットマスターが指すものを見つける
  2. コミットするダウンロードとそれが参照するすべてのもので、ローカルにはありません。
  3. そのコミットを指すようにOrigin/master refを更新し、リモートがその「マスター」のバージョンのどこにあるかを記憶します。

次に、ローカルの「マスター」を更新して同じコミットを指すようにし、作業ツリーを更新します。

これには、以下を使用します。

git reset --hard Origin/master

(これは、デフォルトの「Origin」の代わりに、リモートリポジトリに別の名前を使用しなかったと想定しています-使用した場合は、それに応じて調整してください)。

これは実際には3つのことを行います。

  1. リモートからフェッチした同じコミットを指すようにローカルマスターブランチを更新します。
  2. そのツリーをインデックスにロードします
  3. インデックスに一致するように作業ツリーを更新します。

これで、リモートと一致するローカルマスターブランチとツリーができました。

しかし、残っているものをクリーンアップするためのもう1つのステップがあり、それはgitによって追跡されていません。

git clean -fdx

以前のビルドで作成されたファイルを削除し、クリーンな環境を提供します。保持したいビルドアーティファクトは、どのような場合でも他の場所にコピーする必要があります。

「git pull」は、開発者が作業を調整することを目的としているため、実際にはこのジョブに理想的なツールではありません。 「git fetch」と「git reset --hard」は、ローカル作業の偶発的な上書きに対する保護なしで、より具体的です。

しかし、それがまさにあなたがここに欲しいものです。

それでも、運用サーバーで問題を修正するために変更を加える場合は、引き続き「git pull」を使用することをお勧めします。マージや起こり得る競合は、害を及ぼすよりも役立つ場合があります。

ただし、自動化の一環として信頼性の高い更新が必要な場合もあり、ローカルでの変更は排除すべき問題です。

しかし、おそらく「git pull」を使用しても「git clean」が必要になるでしょう。残ったファイルは、不可解で識別しにくい方法でビルドとデプロイメントを台無しにする可能性があります。

11
Bob Kerns

あなたは使うべきです:

git init --bare

作業ツリーを持たないリポジトリを初期化するため、競合は発生しません。

10