220

常に両方の名前を指定せずに、別の名前のリモート ブランチでローカル ブランチをプッシュおよびプルする簡単な方法があるかどうか疑問に思っていました。

例えば:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

誰かが remote_branch_name を更新した場合、次のことができます。

$ git pull

そして、すべてがマージ/早送りされます。ただし、ローカルの「newb」に変更を加えると、次のことができなくなります。

$ git push

代わりに、次のことを行う必要があります。

% git push origin newb:remote_branch_name

少しばかげているようです。どこからプルするかを決定するためにgit-pull使用する場合、同様の構成オプションを使用できないのはなぜですか? これには良いショートカットがありますか、それとも長い道のりを続ける必要がありますか?git-config branch.newb.mergegit-push

4

8 に答える 8

211

最初のプッシュを行うときは、-u パラメータを追加します。

git push -u origin my_branch:remote_branch

後続のプッシュは、必要な場所に移動します。

編集:

コメントによると、それはプルを設定するだけです。

git branch --set-upstream

するべきです。

于 2011-04-21T05:44:25.903 に答える
106

もちろん。名前が一致するものにブランチをプッシュするのではなく (これは , のデフォルト設定です)、上流にブランチをプッシュするように設定するだけです (これは、プル元と同じでpush.default、によって定義されます)。upstreampullbranch.newb.mergepush.defaultmatching

git config push.default upstream

trackingこれは Git 1.7.4.2 より前では呼び出されていないことに注意してupstreamください。古いバージョンの Git を使用している場合は、tracking代わりに使用してください。このpush.defaultオプションは Git 1.6.4 で追加されたため、それよりも古いバージョンを使用している場合は、このオプションがまったくないため、プッシュ先のブランチを明示的に指定する必要があります。

于 2011-04-21T03:00:52.143 に答える
2

ローカルの 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. 別のブランチへのプッシュ
  2. 別のブランチからプルする
  3. 追跡する上流ブランチの設定と設定解除

ここには不完全で部分的な回答が多すぎるため、多くの質問と多くの要望が残されています. それで、たくさんの努力と研究と実験の後、ここに完全な解決策を提供する私の試みがあります.

1. ローカル ブランチから別の名前のリモート ブランチにプッシュする

FROM ローカルTO リモートプッシュbranch2branch1するには、次のように両方のブランチを指定する必要があります。

# 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 branch2branch3branch2branch3git push origin branch2branch2branch2branch2 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_branchremotegit push origin branch2git push origin some_other_branch:branch2branch2branch2branch2git push origin branch2some_other_branchbranch2branch2branch2

一般的な形式 ( ) のドキュメントは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のブランチを意味します。masterorigin

* master b2f0466 [origin/master] c/array_filter_and_remove_element.c: add O(n) in-place solution

ノート:

  1. -vv上記は「二重冗長」を意味します。これは、単に詳細に出力するgit branchだけでなく、二重に詳細に、または余分に詳細に出力することを意味します。現在印刷されている「余分な詳細」コンテンツには、上に示すように、角括弧で囲まれた上流のブランチが含まれています[origin/matser]
  2. ですべてのリモコンを表示できますgit remote -voriginは、上記の例に示されているリモートです。

2. 別の名前のリモート ブランチからローカル ブランチにプルする

branch2[すでにブランチをローカルにチェックアウトしている場合にお勧めします!] TOという名前のリモートでFROMbranch1originbranch2をプルするには、プル元のリモート ブランチを次のように指定する必要があります。

# 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

ノート:

  1. とは異なりgit push、 にはオプションgit pullがありません。-u
  2. 別の私の回答も参照してください: GitHub で PR の所有者を変更する方法 / 開いている GitHub PR を徴用する方法
  3. git fetch origin some_branch:some_branchコマンドは、同じsome_branch名前を 2 回 (コマンド内の両方の場所で) 使用して実行されます。違いは単純に、という名前のリモートサーバーに保存されているこの名前のブランチからの最新の変更で名前が付けられた、ローカルに保存された非表示のリモート追跡ブランチgit fetch origin some_branchのみを更新することですが、 PLUSはローカルに保存された可視ブランチもそれらの変更で更新しますそれも。 origin/some_branchorigingit fetch origin some_branch:some_branchsome_branch
    1. これについて混乱している場合は、1 つあると思うすべてsome_branchのブランチに対して、実際には最大3 つのブランチがあることを学ぶ必要があります。1) ローカル ブランチ、2)という名前のリモート サーバー上のリモート ブランチ、および 3) およびローカル- という名前の、保存された非表示のリモート追跡ブランチ。詳細については、こちらをお読みください。そして、ブランチごとに3 つのブランチというこの概念を最初に学んだ場所について: Git ブランチをローカルおよびリモートで削除するにはどうすればよいですか? . その回答の下にある私のコメントも参照してください。some_branchsome_branchoriginorigin/some_branch

3. リモート ブランチを追跡または追跡解除するようにローカル ブランチを構成する

上記の cmd を使用して、プッシュと同時に指定されたアップストリーム ブランチを追跡するように指定されたローカル ブランチを設定できます。branch2 branch1 git push -u

次のような名前のアップストリーム ブランチを追跡するように、ローカル ブランチの名前を設定branch2branch1することもできます。

# 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>

のアップストリーム ブランチの設定を解除してbranch2origin/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

参考文献:

  1. 私が最初に構文を学んだ場所git push -u origin local_FROM_branch:remote_TO_branch: @Adam Dymitruk's answer
  2. https://devconnected.com/how-to-set-upstream-branch-on-git/
  3. Git ブランチをローカルおよびリモートで削除するにはどうすればよいですか?

git私が書いた関連トピック:

  1. 初心者:
    1. 別のブランチから Git にブランチを作成する
  2. 中級:
    1. 複数のコミットをチェリーピックする方法
  3. 高度:
    1. 別のブランチからファイルを 1 つだけ取得する方法は?
    2. Gitによると、「私たち」とは誰で、「彼ら」とは誰ですか?
于 2021-12-10T09:06:09.480 に答える
0

これが私のために働いたプロセスです。

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

これで、新しいレポが「origin」になり、元のレポが「upstream」になります。git remote -v を実行して確認します。(補足: Upstream は元のリポジトリからフェッチするために使用されます - 貢献したいプロジェクトとローカル コピーを同期させるために - そして origin は自分のリポジトリに貢献できるのでプルとプッシュに使用されます)。

git push origin master

これで、新しいリモート リポジトリのマスター (Github 上) は元のマスターと同期しますが、機能ブランチはありません。

git rebase upstream/branch-name
git push origin master

リベースはスマートマージです。次に、再度マスターにプッシュすると、選択した機能ブランチが新しいリポジトリのマスターとして表示されます。

オプション:

git remote rm upstream
git remote add upstream new-repo-url
于 2015-08-14T18:11:53.777 に答える