web-dev-qa-db-ja.com

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

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

背景を説明するために、リポジトリにはWebサイトが保存されます。 newbranchにいくつかの変更を加え、Webサイトをnewbranchに切り替えて展開しました。これらの変更はアップストリームでmasterブランチにマージされました。ウェブサイトをmasterブランチに切り替えようとしています。この時点で、newbranchOrigin/masterは同じですが、masterOrigin/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)を達成する必要がありますが、プロセス中に作業ディレクトリを以前のリビジョンに変更する必要はありません。

111
Malvineous

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

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だけで対応します。

5
jthill

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

git fetch Origin master:master

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

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

git pull Origin master:master
134
Martin Peter

これはここで答えられます: チェックアウトを使用せずに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
86
fane89

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

$ 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

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

20
Malvineous

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

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

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

11
meagar

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

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

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

3
Philip Beber

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オプションで実行します

ありがとう

git fetch Origin master:master

  • 「プル」(実際にフェッチ)master
  • masterにまだプッシュされていない変更がある場合、Origin/masterがマスターにマージされます。
  • マージの競合がある場合、まずそれらを解決する必要があります。
0
Luzian