146

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

背景を説明すると、リポジトリには Web サイトが格納されます。にいくつかの変更を加えnewbranch、Web サイトを に切り替えて展開しました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、プロセス中に作業ディレクトリを以前のリビジョンに変更する必要はありません。

4

8 に答える 8

184

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

git fetch origin master:master

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

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

git pull origin master:master
于 2017-03-20T11:09:01.353 に答える
24

結局のところ、答えは一見シンプルです。

$ 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ます。

于 2013-09-25T06:02:59.190 に答える
12

Git 操作はアトミックではないため、修正できないことが心配です。最初にマスターに切り替えずにマスターを更新した場合でも、作業ディレクトリがブランチの途中にある場合は常に穴があります。これが、 Git が展開ツールではない理由です。

実稼働環境で実際にコードをコミットしているのではないので (願わくば)、実際にブランチをチェックアウトする必要はありません。aを実行しgit fetchてリモート ref を更新git checkout origin/masterし、作業ディレクトリを現在 が指しているコミットに直接origin/master移動できます。これにより、頭が切り離された状態になりますが、コードをコミットしていないため、これは問題ではありません。

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

于 2013-09-25T01:24:09.940 に答える
3

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

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は、それで十分です。

于 2013-09-25T02:21:33.480 に答える
3

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

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

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

于 2016-04-14T23:07:21.703 に答える