切り替えずに別のGitブランチを取得する


55

最近、SVNからGitに切り替え、同時に(ローカルチェックアウトとファイルコピーをライブにではなく)ライブシステムをバージョン管理に入れました。

私が割り当てられているプロジェクトでは、すべて同じリポジトリにアクセスし、変更をすぐgit pullに反映します。これは、WebデザイナーがVCSに変更をプッシュするために問題が発生します。変更はまだライブではないはずですが、Webテスト環境にある必要があります。

開発者の1人がライブに移行すると、すべての(おそらく未完成の)変更を取得します。

ライブを別のブランチに切り替えて、変更されたものをマージすることを考えましたが、git知識が不足しているため、どうすればよいかわかりません。

私のアイデアは:

  • ライブ(git branch live)で新しいブランチを作成します。
  • 何かがライブになる必要があるたびに
    • マスターでのプルの変更(のように:git checkout master; git pull; git checkout live
    • git merge master

問題は、マスターに切り替えるか、すべてをライブシステムに直接プルすると問題が発生するため、これを回避することです。

これを行う方法はありますか、Liveシステムを管理するより良い方法はありますか(未完成のものをプッシュしないようにwebbieをトレーニングする場合を除く)。


git pull --allデフォルトで、マスターをライブにプルするのではなく、マスターをプルしてマスターとマージし、(サーバー上に存在する場合)ライブにマージしてライブにマージします。やってみた?
トビアスキンツラー

あなたの問題は、ライブで分岐する前にバージョン管理下になく、後でマスターに変更した後にgit-addedされたファイルが原因ですか?それは私に以前に起こったことで、通常は一時的にそのファイルの名前を変更するか、ライブで必要ない場合git checkout -fは問題を無視するために使用します-しかし、バックアップを作成してください!
トビアスキンツラー

回答:


21

git stashマスターをチェックアウトしてプルする前に、またライブをチェックアウトした後に使用できますgit stash pop(またはgitが古く、他に何も隠していないgit stash applygit stash clear仮定した場合)


6
git pull --allすべてのリモートをフェッチしますが、ブランチ(またはデフォルトブランチ)を現在のブランチにもマージしようとします。
ミパディ

@mipadiはい、しかし、マスターをチェックアウトしようとして競合を引き起こすことなく、現在のブランチ自体のみです。
トビアスキンツラー

現在のブランチに自動的にマージされるように構成されているブランチはすべてマージされます(そのようなブランチが構成されている場合)。
ミパディ

1
@Superole「fetch all remotes」として文書化されており、複数のリポジトリだけでなくブランチも含まれています。後知恵でgit fetch --allはありますが、より良い答えだったかもしれません
トビアスキエンツラー

2
@TobiasKienzler設定されたすべてのリモートからフェッチするようにgitに指示するだけです。最も一般的なケースは、リモートの名前付きオリジンを1つだけ持つことです。現在のブランチと同じブランチに複数のリモートがあり、それらがお互いに早送りの関係にない場合、--allオプションを使用すると、ブランチのさまざまなバージョンのタコのマージが現在になります!したがって、私のアドバイスは、--allそれがあなたが望んでいるものでない限り、近づかないようにすることです。
Superole

74

私はから変更をプルすることができたorigin/mastermasterこのコマンドを使用して、別のブランチで作業中:

git fetch origin master:master

6
驚くばかり!まさに私が探していたこと-これは...はるかに目立つように文書化する必要があります
マルクスシェパード

2
これに関するドキュメントは、git-scm.com
docs

fetch!=pull
D.コバーチ

5

最初に問題を解決します。彼らは、ビジネスを推進していないブランチにプッシュすべきではありません。

あなたが尋ねているように見えるものは次のようなものでしょう

git checkout live
git pull origin master

これにより、リモートマスターとライブブランチのマージが試行されます。


問題は、現在ブランチが1つしかないことと、誰もがSVNに慣れすぎて、何か新しいことの利点を学ぼうとしないので、実際に変更できないことです。ライブディレクトリに新しいブランチを作成することのみが可能になります。リモートマスターをライブブランチにマージすることは、デバッグコード、不完全な関数、構文エラーなどをマスターにプッシュすることを誰も防ぐことができないため、回避したいものです(私はやっぱり後輩開発者です)。あなたの提案をありがとう。
モルフィルダー

2
@dbeme:tarballとパッチを使用できます。;)彼らがgitを学ぼうとしない限り(そして分岐してマージすることはまったく難しくありません)、あなたは問題を抱えているでしょう。
ジョシュK

0

全員がコミットできるようにテスト用のgitリポジトリを作成することをお勧めします。ライブWebサイトを含むすべてのリポジトリは、テストリポジトリのクローンになります。この方法で、誰でもライブWebサイトに触れることなくテストにプッシュできます。誰かがライブサイトを更新する必要がある場合は、gitテストリポジトリからライブサイトをプルできます。このワークフローはSVNにかなり似ています。柔軟性を高めるため、説明する「ライブ」ブランチを使用することをお勧めします。

要約すると、全員のgitリポジトリはテストリポジトリのクローンです。稼働中の本番サイトも、テストリポジトリのクローンにすぎません。または、テストはライブプロダクトのクローンであるため、「git push」は常に実稼働に向けて移動します。

この配置に「ライブ」ブランチを追加したり、テストと実稼働の間に「ステージング」リポジトリを含めたりすることを含む、その他のオプション。セキュリティを強化するために、ライブgitリポジトリへのアクセスを制限し、ライブプロダクションへのプルを行うセキュリティで保護されたスクリプトの使用を強制することをお勧めします。

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