現在のブランチではないブランチに「git pull」する方法は?


126

ブランチで実行するgit pullと、master通常はからプルされorigin/masterます。と呼ばれる別のブランチnewbranchにいますが、git pullfrom origin/masterinto を実行するコマンドを実行する必要masterがありますgit checkoutが、プルが完了するまで実行して、選択したブランチを変更できません。これを行う方法はありますか?

背景を説明するために、リポジトリにはWebサイトが格納されています。newbranchウェブサイトをに切り替えることで、にいくつかの変更を加えて展開しましたnewbranch。これらの変更は上流のmasterブランチにマージされたので、ウェブサイトをmasterブランチに切り替えようとしています。この時点では、newbranchorigin/master同じですが、master遅れてorigin/masterおり、更新する必要があります。問題は、私が伝統的な方法でやった場合です。

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

上記と同じ(git checkout master && git pull)を達成する必要がありますが、プロセス中に作業ディレクトリを以前のリビジョンに変更しません。


@phi:うまくいくとは思いません。なぜなら、私はnewbranchそこにいて、そこに隠しておくものは何もないからです!
Malvineous 2013

私は新しいディレクトリにクローンを作成し、newbranchをmasterにマージし、masterをnewbranchにマージしてから、git pullを実行します。マスターとニューブランチは同じになります。
2013

@aet彼は現在、自分の現在のディレクトリでgit fetch; git merge origin/master内から行うことでそれを行うことができますnewbranch。リポジトリの2番目のコピー全体を複製しても、メリットはありません。
貧弱


回答:


5

触りたくないワークツリーがあるので、別のものを使用してください。クローンは安価で、このために構築されています。

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

ここでの他のすべての回答の問題は、実際にはプルを行わないことです。プルを設定したマージまたはリベースが必要な場合は、別のワークツリーと上記の手順が必要です。それ以外の場合は単にgit fetch; git checkout -B master origin/master行います。


2
実行すると、フォルダーでorigin / masterと同期するためにを実行していないためgit checkout master、古いmasterブランチをチェックアウトgit pullmainます。これは私が避けようとしていることです。
Malvineous 2013

クローンによって行われたチェックアウトは古いマスターのものですが、そのチェックアウトはWebサーバーが参照していないディレクトリにあります。最後のマスターチェックアウトは、wipからプッシュバックされた完全にマージされたマスターのチェックアウトです。
jthill 2013

6行目で、マージされた(更新された)をにプッシュしmaster直しましたoriginが、最終的なチェックアウトがこの更新されたものであるとは思いませんmaster。ディレクトリ内git pullmasterブランチを更新する必要はありませんmain。そのため、何か不足している場合を除いて、コマンドはgit checkout master単独で実行して古いmasterツリーを取得することと何の違いもありません。よく見ると、あなたは、任意のコマンドを実行していないmain上流の通信ディレクトリ(離れてあなたが上流のレポへの変更を行わ前に実行されたライン1、から。)
Malvineous

まあ、あなたはテストリポジトリでそれを試すか、プッシュドキュメントをチェックすることができます。
jthill 2013

1
@jwg何と比較してください?OPが述べたすべてのニーズに必ず対処してください。
jthill

163

簡単:リモートブランチから現在チェックアウトされていないブランチマスターへの更新:

git fetch origin master:master

ここで、originはリモートであり、現在devなどのブランチでチェックアウトされています。

指定したブランチに加えて現在のブランチを一度に更新したい場合:

git pull origin master:master

4
ええと、それは常に機能するとは限りません。WIPブランチとマージするように求められました。
underscore_d 2017

@underscore_dは同じです。
Greg

1
私のために働いた...それがマージするように促した場合、私はあなたのブランチにあなたが更新している、オリジンにコミットされていない変更があると想像します
スキム

2
これはどのように機能するはずですか?それは私にとっては機能しません、ただ単にorigin / masterを私の現在チェックアウトされているブランチにマージしようとします。
mhogerheijde

3
これにより、マスターが現在のブランチに移動します。これは間違いなく求められていることではありません。プルをフェッチに変更すると、これがまさに求められていることになります。
Jeff Wolski、2018年

90

これはここで回答されています: チェックアウトを使用せずにGitブランチをマージ、更新、プルします

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
これは、コミットされていないローカル変更で機能するため、最適です。
Tomasz Gandor

2
あなただけのあなたがしたい最新の変更に追いつくためにしたい場合git fetch origin master:mastergit fetchそれ自体は、他のブランチではなく、現在のブランチを更新するつもりであると想定します。
John Leidegren 2017

2
これが最も簡単で直接的な答えです。これは、受け入れられた回答IMOである必要があります。
キーゴ2017

@JohnLeidegren-常に意図したとおりに機能するとは限りません。stackoverflow.com/a/42902058/274579の回答に対するコメントを参照してください。
ysap

22

結局のところ、答えは一見単純そうです。

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

これにより、更新が完了するmasterまでブランチに切り替えずにブランチを更新できます。


11
これはあなたがどうやってやるかと尋ねた事をしません。
jthill 2013

上記のコメントが言うように、あなたが求めてきた質問は、実際にあなたが巻き上げた質問が答えたものではありません。チェックアウトせずにブランチにマージすることではなく、古いバージョンを最初にチェックアウトせずにリモートで使用可能な最新バージョンのブランチに直接移動することの方が明確になるように、質問を更新する必要があります。
貧弱

1
それは私が探してここに来た答えです:)
Sophistifunk

1
OPが望んだものではありませんが、正直に言うと私を助けてくれました。
Marcel Bro

1
@ anoniim、OPが望んだものではありませんか?この質問に答えたOPを意味しますか?
smac89 2017

12

Git操作はアトミックではないため、修正できない問題が心配です。あなたは常にあなたの作業ディレクトリがある穴があります半分の方法あなたはそれへの第一の開閉せずにマスターを更新しても、枝の間を。これが、Gitがデプロイメントツールではない理由です

実際の運用環境でコードをコミットしているわけではないので(私はそう思います)、実際にブランチをチェックアウトする必要はありません。単純にa git fetchを実行してリモート参照を更新しgit checkout origin/master、作業ディレクトリを現在が指しているコミットに直接移動することができますorigin/master。これにより、ヘッドが切り離された状態になりますが、コードをコミットしていないので、これは問題ではありません。

これはあなたが手に入れる最小の穴ですが、先ほど言ったように、穴はまだ存在しています。checkoutアトミックではありません。


デプロイにgitを使用する場合の制限を理解しています。問題は、この場合の穴が1秒未満ではなく数分になることです。チェックアウトについての素晴らしいアイデアorigin/masterは、それでうまくいくかもしれません。
Malvineous 2013

穴が「分」長くなるのはなぜですか。ネットワークを介してデータを取得していますか?git fetch他のことをする前にa を実行し、データの転送を邪魔にならないようにします。
貧弱

(現在)追跡されていないファイルが以前のコミットによって上書きされるため、数分かかります。そのため、ファイルをコピーし、gitを実行してから、元に戻す必要があります。「数分」は私のタイピング速度から来ています。(はい、私はそれをスクリプト化できましたが、それは単にgitがすべてをそれ自体で行う方が速いことを指摘すること
でした

3

これにはupdate-refを使用できます。

git fetch
git update-ref refs/heads/master origin/master
git checkout master

これにより、masterブランチのローカルコミットが破棄されることに注意してください。あなたのケースでは何もないのでこれは大丈夫です。マージは現在のブランチでしか実行できないので、ローカルコミットがある場所でこれを実行しようとする他の人にとっては、可能ではないと思います。


これは同等git branch --force master origin/masterですか?これにより、地元masterの首がoriginsの首を指すように強制されますmaster
キーゴ2017

2

Malvineousのソリューションは私にとって有効です

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

ちょうどエラーを与える


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

だから私は-Dオプションで実行します

ありがとう


0

git fetch origin master:master

  • 「プル」(実際にはフェッチ)master
  • masterまだプッシュされていない変更がある場合origin/master、マスターにマージされます。
  • マージの競合がある場合は、最初に解決する必要があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.