チェックアウトなしのGitプル?


133

作業中のブランチ内からgit pullやその他のコマンドを実行することに慣れています。しかし、私は数人が作業する開発サーバーをセットアップしているので、ブランチを切り替える必要はありません。私たち全員が使用しているgithubリポジトリから開発サーバーの既存のブランチを更新したい場合、それを行う正しい方法は何でしょうか?コマンド「git pull github branchname」を実行すると、ブランチが現在のブランチにプルされますか?

私が見つけることができるすべてのgitの例は、最初に「checkout branchname」を実行してからプルを実行することを示しているようです。私はそれを避けようとしています。言ったように、これは既存のブランチであり、最新バージョンに更新したいだけです。


6
git fetchあなたがしたいことをする必要があります。
ブラッド

11
git fetch特定のリモートブランチを追跡するように設定されている場合でも、リモートブランチのローカルコピーは更新されますが、ローカルブランチは更新されません。それは望まれるものかもしれないし、そうでないかもしれません。(編集:とにかく、デフォルトで。引数を指定して呼び出すと、異なる動作をさせることができますが、その場合、引数を実際に指摘する必要があります。)

2
よくわかりません...開発サーバーで同じローカルリポジトリを使用していますか?ブランチを切り替えたくないのはそのためですか?誰もが自分で作業できる独自のプライベートクローンを作ってみませんか?「git:ローカルブランチをチェックアウトせずに更新する」も参照してください

回答:


221

私は同じことを探していて、最後に別のstackoverflowの投稿で私に役立つ答えを見つけました:チェックアウトを使用せずにGitブランチをマージ、更新、プルする

基本的に:

git fetch <remote> <srcBranch>:<destBranch>


ソースブランチを指定する代わりにアップストリームブランチを使用する方法はありますか?
派手な

悲しいことに、しかし、pullというパラメータがあるfetch:ない-s <strategy>-Xsubtree=...これは同等代わるものではありませんので、私にとっては不可欠でした。私はここで説明されている問題を抱えていました:congruityservice.com/blog/…しかし、私の場合、私はチェックアウトを全く望んでいませんでした。
Andry

2
質問はプルに関するものであることを考えると、答えはである必要がありますgit pull <remote> <srcBranch>:<destBranch>
Jウッドチャック

コミットがすでにローカルリポジトリにある場合:git fetch . origin/master:master
Evan

74

私はコミットするために必要と非常に同じ問題を持っていたか、隠し現在の機能変更、チェックアウトのマスターブランチ、行うpullリモートからローカルへのすべてのですかコマンドをmasterワークスペースには、その後、機能ブランチに再び切り替えて実行しrebase、それを最新にすると主人。

これをすべて完了するには、ワークスペースを機能ブランチに保持し、すべての切り替えを回避します。これを行います。

git fetch origin master:master

git rebase master

そして、それはうまくトリックを行います。


19
これは良いアドバイスですが、リードを埋めます:以下の答えに従って、あなたがオンでfeatureあり、あなたがしたいすべてのことはmaster、に触れることfeatureなく、ローカルに原点に沿ったものに更新することgit fetch origin master:masterです... stash-checkoutMaster-pull-checkoutFeature-stashPop!
btown

7
オリジンマスターをローカルブランチにマージするために、ローカルマスターをプルする必要はありません。使用できます git merge origin/master
Dan

-1

あなたがしたい場合は、ローカルブランチのヒントが再尖った後を取得するにgit fetchは、いくつかの追加の手順が必要です。

具体的には、githubのレポは、枝が持っているとしDBC、とmaster(この奇支店名・セットの理由は現時点では明らかであろう)。あなたは、ホスト上にあるdevhost、あなたはレポであるorigingithubのレポです。あなたは行うgit fetchすべてのオブジェクトとアップデートの上にもたらした、origin/Dorigin/Borigin/C、とorigin/master。ここまでは順調ですね。しかし、今、あなたは上で、起こるために何かしたいと言うdevhostには、地元の枝をDBC、および/またはmaster

私はこれらの明白な(とにかく私に)質問があります:

  1. なぜすべてのブランチのヒントを更新したいのですか?
  2. Bリモート(github)リポジトリにないコミットがブランチ(たとえば)にある場合はどうなりますか?それらをマージするか、リベースするか、それとも...?
  3. ブランチ(例:)を使用していてC、作業ディレクトリやインデックスが変更されているがコミットされていない場合はどうなりますか?
  4. リモートリポジトリに新しいブランチが追加された場合(A)やブランチが削除された場合(D)はどうなりますか?

(1)の答えが「devhost実際には開発用ではなく、ローカルミラーであり、githubリポジトリのローカルで利用可能なコピーを保持するため、実際のすべての開発者は、 github」の場合、「通常の」リポジトリではなく「ミラー」が必要です。それは作業ディレクトリを持っていてはならず、おそらくプッシュも受け入れるべきではありません。その場合、残りの質問はただ消えます。

他の答えがある場合、(2-4)が問題になります。

いずれにせよ、リモート参照に基づいてローカル参照の更新に取り組む方法はgit fetch -p次のとおりです(たとえば、実行後)。

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

何に行く... code here ...のセクションは、質問への回答(2-4)に依存します。


-5

使用する

git fetch

代わりに。リポジトリ内のリモート参照とオブジェクトを更新しますが、ローカルブランチ、HEAD、ワークツリーはそのままにしておきます。


17
しかし、それは彼の開発サーバーのローカルブランチを更新しません...それは、アスカーのgithubリポジトリに対応するgitフォルダーの "origin"ブランチのみを更新します。
ANeves、2017年

1
または、私のバージョンの問題が必要な場合:作業ブランチを「origin / master of ssh:// bla bla bla」ではなく「master」とマージしたい。フェッチを実行すると、オリジン/マスターは更新されますが、マスターは更新されません。
ANeves、2017年

-6

編集: 'git pull'を使用します。リポジトリからすべてのブランチをフェッチし、ブランチが現在のブランチのみのローカルシステムに存在する場合は最新に更新します。注:git pullはfetch + mergeと同等で、すべてのブランチをフェッチしますが、現在のブランチのみをマージします。


6
言い方を変えます:pullフェッチを実行します(はい、リモートからすべてをフェッチします)が、現在のブランチのみをマージします。
torek 2013

私の反対投票は意図された違反ではありません、あなたの言っていることが正しく、事実であることを私は知っています。彼の狙いの要点:まずブランチをチェックアウトせずに、ローカルブランチの1つを関連するリモートブランチの最新のコミットに更新する方法はありますか。
Gurce
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.