ローカルの Git ブランチを別の名前のリモートに簡単にプッシュするにはどうすればよいですか?
概要:
以下は、一般的に必要な主要なコマンドの簡単な要約です。
# push from your local `branch2` to a remote `branch1` (push to a branch with
# a different name) on the remote named `origin`
git push -u origin branch2:branch1
# pull from a remote branch `branch1` into your currently-checked-out branch
# (which could have a different name--ex: `branch2`)
git pull origin branch1
# Set your upstream to something new in case you want to change it; ex: set your
# currently-checked-out branch (perhaps `branch2`) to track `branch1` on the
# remote named `origin`
git branch -u origin/branch1
# Unset your upstream
git branch --unset-upstream
# See what your upstream is currently set to
git branch -vv
詳細:
- 別のブランチへのプッシュ
- 別のブランチからプルする
- 追跡する上流ブランチの設定と設定解除
ここには不完全で部分的な回答が多すぎるため、多くの質問と多くの要望が残されています. それで、たくさんの努力と研究と実験の後、ここに完全な解決策を提供する私の試みがあります.
1. ローカル ブランチから別の名前のリモート ブランチにプッシュする
FROM ローカルTO リモートをプッシュbranch2
branch1
するには、次のように両方のブランチを指定する必要があります。
# Push from local `branch2` to remote `branch1`
git push origin branch2:branch1
# General form: push from local `from_branch` to remote `to_branch`.
# - Watch out!: see also the additional explanations and NB note below!
git push <remote> <from_branch>[:to_branch]
ただし、上記の一般的な形式で記述した角括弧は、その:to_branch
部分がオプションであることを示していることに注意してください。つまり、ある名前のローカル ブランチから別の名前のリモート ブランチにプッシュする場合、その部分はオプションではありませんが、一般的な git コマンドとして、その:to_branch
部分を含めなくてもコマンドが実行されるということです。その意味ではオプションです。ただし、予期しない結果が生じる場合があります。たとえば、次のコマンドを見てください。
# (push to a remote branch with the **same name** as the local branch)
# Reduced **and confusing** form: this pushes from local `branch2` (even if you
# don't currently have it checked-out!) to remote `branch2`.
git checkout branch3
git push origin branch2 # Push from local branch2 to remote branch2
local が現在チェックアウトされていて、システムで現在チェックアウトされているため、 localが remoteにプッシュされるbranch3
と思うかもしれませんが、これは起こりません! むしろ、現在チェックアウトしていない場合でも、ローカルをリモートにプッシュします。したがって、これと同等の省略形です。git push origin branch2
branch3
branch2
branch3
git push origin branch2
branch2
branch2
branch2
git push origin branch2
# These 2 commands are **exactly identical**! The 1st cmd is the short form
# of the 2nd.
git push origin branch2 # Push from local branch2 to remote branch2
git push origin branch2:branch2 # Push from local branch2 to remote branch2
上記の cmd の短い形式は、現在チェックアウトされているブランチからプッシュされると思われる場合、非常に紛らわしい動作を引き起こします。上記の動作をまとめた Nota bene note を次に示します。
注: 一般的な形式git push <remote> <from_branch>[:to_branch]
では、リモートの TO ブランチを で指定しない場合、 !上の:to_branch
ローカルの FROM ブランチと同じ名前であると見なされます。これは、の代わりにのみを入力すると、コマンドの実行時にローカルでチェックアウトしていなくても、ローカルから のリモート コピーにプッシュされることを意味します。これは、現在チェックアウトされているブランチ に、リモートにプッシュするように入力しただけで、代わりにローカルがリモートにプッシュされたと思った場合、非常に混乱する可能性があります。from_branch
remote
git push origin branch2
git push origin some_other_branch:branch2
branch2
branch2
branch2
git push origin branch2
some_other_branch
branch2
branch2
branch2
一般的な形式 ( ) のドキュメントはgit push <remote> <from_branch>[:to_branch]
見つけにくいですが、実際には" セクションman git push
の下の上部近くのページにあります。"<refspec>...
パラメータの形式<refspec>
は、オプションのプラス+
、その後にソース オブジェクト<src>
、コロン:
、宛先参照が続きます<dst>
。
そして後で:
:<dst>
の部分は省略できます。このようなプッシュは、通常はコマンド ラインに<src>
何も入力せずに更新する ref を更新します。<refspec>
このドキュメントは直感的ではなく、理解するのが非常に難しいと思いますが、いくつかの例と上記の説明がありません。
[BETTER FORM OF git push
]を押すと同時に上流ブランチを設定することもできます:
# Push from local `branch2` to the remote `branch1`, while also at the same time
# setting `branch2` to track `origin/branch1` as the upstream
git push -u origin branch2:branch1
# OR (same thing)
git push --set-upstream origin branch2:branch1
# General form
git push -u <remote> <from_branch>[:to_branch]
上記のコマンドの出力の一部として、次のように表示されます。
Branch 'branch2' set up to track remote branch 'branch1' from 'origin'.
そこで何が起こっているかを明確にするために、上記の 2 つのコマンドのいずれかが、次の2 つの別個のコマンドと同等であることを知っておいてください。
git push origin branch2:branch1
git branch -u origin/branch1
ここで、ブランチのアップストリーム ブランチが現在何に設定されているかを確認するには、二重冗長( -vv
)git branch
コマンドを実行します。
git branch -vv
出力例:
ここでは、アップストリーム ブランチが であることがわかります。これは、という名前のリモート上origin/master
のブランチを意味します。master
origin
* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution
ノート:
-vv
上記は「二重冗長」を意味します。これは、単に詳細に出力するgit branch
だけでなく、二重に詳細に、または余分に詳細に出力することを意味します。現在印刷されている「余分な詳細」コンテンツには、上に示すように、角括弧で囲まれた上流のブランチが含まれています[origin/matser]
。
- ですべてのリモコンを表示できます
git remote -v
。origin
は、上記の例に示されているリモートです。
2. 別の名前のリモート ブランチからローカル ブランチにプルする
branch2
[すでにブランチをローカルにチェックアウトしている場合にお勧めします!] TOという名前のリモートでFROMbranch1
origin
branch2
をプルするには、プル元のリモート ブランチを次のように指定する必要があります。
# THIS ASSUMES YOU ARE ALREADY CHECKED-OUT ON BRANCH `branch2`!
git pull origin branch1
# General form
git pull <remote> [from_branch]
両方のブランチを指定することもできますが、この場合の違いは完全にはわかりません:
git pull origin branch1:branch2
# The general form seems to be:
git pull <remote> <from_branch>[:to_branch]
次のコマンドは、リモート ブランチとローカル ブランチの名前が同じ場合にのみ機能します。(したがって、このスタック オーバーフローの質問には答えません)。some_branch
ブランチをチェックアウトしていない場合は、このコマンドをお勧めします。
# Pull FROM a remote branch named `some_branch` TO a local branch named
# `some_branch`, while you do NOT have `some_branch` locally checked-out.
git fetch origin some_branch:some_branch
# General form
git fetch <remote> <from_branch>:<to_branch>
# The above is a special form of `git fetch`, and (I believe) requires that
# `from_branch` and `to_branch` are **the same branch name**. It is roughly
# equivalent to the following *several* commands:
git checkout any_other_branch
# this `git fetch` cmd updates the **locally-stored**, hidden, remote-tracking
# branch named `origin/some_branch` with the latest changes from the branch
# by this name stored on the remote server named `origin`
git fetch origin some_branch
git checkout some_branch
git merge origin/some_branch # merge `origin/some_branch` into `some_branch`
git checkout any_other_branch # go back to the branch we started on
ノート:
- とは異なり
git push
、 にはオプションgit pull
がありません。-u
- 別の私の回答も参照してください: GitHub で PR の所有者を変更する方法 / 開いている GitHub PR を徴用する方法
git fetch origin some_branch:some_branch
コマンドは、同じsome_branch
名前を 2 回 (コマンド内の両方の場所で) 使用して実行されます。違いは単純に、という名前のリモートサーバーに保存されているこの名前のブランチからの最新の変更で名前が付けられた、ローカルに保存された非表示のリモート追跡ブランチgit fetch origin some_branch
のみを更新することですが、 PLUSはローカルに保存された可視ブランチもそれらの変更で更新しますそれも。
origin/some_branch
origin
git fetch origin some_branch:some_branch
some_branch
- これについて混乱している場合は、1 つあると思うすべて
some_branch
のブランチに対して、実際には最大3 つのブランチがあることを学ぶ必要があります。1) ローカル ブランチ、2)という名前のリモート サーバー上のリモート ブランチ、および 3) およびローカル- という名前の、保存された非表示のリモート追跡ブランチ。詳細については、こちらをお読みください。そして、ブランチごとに3 つのブランチというこの概念を最初に学んだ場所について: Git ブランチをローカルおよびリモートで削除するにはどうすればよいですか? . その回答の下にある私のコメントも参照してください。some_branch
some_branch
origin
origin/some_branch
3. リモート ブランチを追跡または追跡解除するようにローカル ブランチを構成する
上記の cmd を使用して、プッシュと同時に指定されたアップストリーム ブランチを追跡するように指定されたローカル ブランチを設定できます。branch2
branch1
git push -u
次のような名前のアップストリーム ブランチを追跡するように、ローカル ブランチの名前を設定branch2
branch1
することもできます。
# Set branch2 to track origin/branch1 (`branch1` on remote `origin`)
git branch --set-upstream-to=origin/branch1 branch2
# OR (same thing as just above)
git branch -u origin/branch1 branch2
# General form
git branch -u <remote>/<to_branch> [from_branch]
# OR, same as above if the currently-checked-out branch is `branch2`
git branch --set-upstream-to=origin/branch1
# OR (same thing as just above)
git branch -u origin/branch1
# General form
git branch -u <remote>/<to_branch>
のアップストリーム ブランチの設定を解除してbranch2
origin/branch1
、以前に設定したアップストリーム ブランチ (上記の例にあった) を追跡しないようにするには、次のコマンドを実行します。
git branch --unset-upstream branch2
# OR, same as above if the currently-checked-out branch is `branch2`
git branch --unset-upstream
繰り返しますが、既に上で示したように、ブランチの上流のブランチが現在何に設定されているかを確認するには、二重冗長( -vv
)git branch
コマンドを実行します。
git branch -vv
参考文献:
- 私が最初に構文を学んだ場所
git push -u origin local_FROM_branch:remote_TO_branch
: @Adam Dymitruk's answer
- https://devconnected.com/how-to-set-upstream-branch-on-git/
- Git ブランチをローカルおよびリモートで削除するにはどうすればよいですか?
git
私が書いた関連トピック:
- 初心者:
- 別のブランチから Git にブランチを作成する
- 中級:
- 複数のコミットをチェリーピックする方法
- 高度:
- 別のブランチからファイルを 1 つだけ取得する方法は?
- Gitによると、「私たち」とは誰で、「彼ら」とは誰ですか?