master
ブランチでgit pull
を実行すると、通常はOrigin/master
からプルされます。私はnewbranch
という別のブランチにいますが、git pull
をOrigin/master
からmaster
に実行するコマンドを実行する必要がありますが、git checkout
を実行できませんプルが完了するまで、選択したブランチを変更します。これを行う方法はありますか?
背景を説明するために、リポジトリにはWebサイトが保存されます。 newbranch
にいくつかの変更を加え、Webサイトをnewbranch
に切り替えて展開しました。これらの変更はアップストリームでmaster
ブランチにマージされました。ウェブサイトをmaster
ブランチに切り替えようとしています。この時点で、newbranch
とOrigin/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
)を達成する必要がありますが、プロセス中に作業ディレクトリを以前のリビジョンに変更する必要はありません。
触れたくないワークツリーがあるので、別のワークツリーを使用します。クローンは安価で、このために構築されています。
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
だけで対応します。
簡単:リモートブランチから現在チェックアウトされていないブランチへの更新master:
git fetch Origin master:master
ここで、Originはリモートであり、現在いくつかのブランチでチェックアウトされています。 dev。
指定されたブランチに加えて現在のブランチを一度に更新したい場合:
git pull Origin master:master
これはここで答えられます: チェックアウトを使用せずに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
結局のところ、答えは一見シンプルです:
$ 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
ブランチに切り替えずに更新できます。
Git操作はアトミックではないため、修正できないものが心配です。最初に切り替えずにmasterを更新した場合でも、作業ディレクトリがhalf wayブランチ間にあるホールが常にあります。これがGitが展開ツールではない理由です。
実稼働環境で実際にコードをコミットしているわけではないので(希望)、ブランチをチェックアウトする必要はありませんneed単純にgit fetch
を実行してリモートrefを更新し、git checkout Origin/master
を実行して作業ディレクトリを直接コミットに移動します現在Origin/master
によって指されています。これにより、ヘッドが切り離された状態になりますが、コードをコミットしていないため、これは重要ではありません。
これはあなたが手に入れる最小の穴ですが、私が言ったように、穴はまだ存在しています。 checkout
はアトミックではありません。
これにはupdate-refを使用できます。
git fetch
git update-ref refs/heads/master Origin/master
git checkout master
これにより、masterブランチのローカルコミットが破棄されることに注意してください。あなたの場合には何もありませんので、これは大丈夫です。ローカルコミットがある場所でこれを行おうとする他の人々にとって、マージは現在のブランチでしか実行できないため、それは可能だとは思いません。
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
がマスターにマージされます。