なぜ常に「--set-upstream」を実行する必要があるのですか?


1468

Gitで新しいブランチを作成します。

git branch my_branch

押して:

git push origin my_branch

ここで、誰かがサーバーでいくつかの変更を行ったとしましょうorigin/my_branch。私がやります:

git pull

しかし、私は得ます:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

私はそれを動作させることができることを学びました:

git branch --set-upstream my_branch origin/my_branch

しかし、なぜ私が作成するすべてのブランチに対してこれを行う必要があるのですか?それは私がプッシュする場合ていることは明らかではないmy_branchorigin/my_branchし、私は引くしたいと思うorigin/my_branchmy_branch?これをデフォルトの動作にするにはどうすればよいですか?


21
のデフォルトはbranch.autosetupmerge、リモートトラッキングブランチからブランチを作成するときにのみ、新しいブランチの上流設定が自動的に設定されることを意味します(例:<remote-name>/<branch-name>)(git-config(1)を参照)。おそらく、既存のローカルブランチからブランチを作成しています。リモートブランチの先端から直接ローカルにブランチしている場合(ローカルブランチ上にあるにもかかわらず)、を使用git branch my_branch <remote-name>/<branch-name>して、アップストリーム構成を自動的にセットアップできます。
Chris Johnsen、

20
参考までに、この--set-upstreamオプションは非推奨です。--trackまたは--set-upstream-to代わりに使用する必要があります。
Sean the Bean

139
場合は--set-upstream廃止されて、おそらくgitの開発者は、実行時に表示されますヘルプメッセージからそれを削除してくださいgit pushオプションなしのと何の上流が設定されていませんか?
クリストファーハンター

17
@ChristopherHunterあなたのコメントから1年以上が経過しましたが、今でもそうです。それはずさんなフィードバックなのか、それとも私たちが無知であるので、それを維持する技術的に賢明な理由があるのでしょうか?
Konrad Viltersten 2016年

15
@ChristopherHunter git branch --set-upstreamは非推奨です。git push --set-upstreamではありません。
ブライアンゴードン

回答:


1538

git branch --set-upstream 1の構文の記憶に依存しないショートカットは次のとおりです。

git push -u origin my_branch

...そのブランチを初めてプッシュしたとき。または、現在のブランチを同じ名前のブランチにプッシュするには(エイリアスに便利):

git push -u origin HEAD

使用する必要があるのは-u1回だけです。これにより、ブランチとの関連付けがorigin同じようにセットアップされますgit branch --set-upstream

個人的には、ブランチとリモート上のブランチとの関連付けを明示的に設定するのは良いことだと思います。それはルールがあることだけは残念だために異なるgit pushgit pull


1ばかげているように聞こえるかもしれませんが、デフォルトであると想定して、現在のブランチを指定するのを忘れることがよくあります。

アップデート2012-10-11:間違いを犯しやすいと思ったのは私だけではありません。git 1.8.0がより明白なを導入していることを指摘してくれたVonCに感謝しgit branch --set-upstream-toます。ブランチにいる場合は、次のように使用できますmy_branch

git branch --set-upstream-to origin/my_branch

...または短いオプションで:

git branch -u origin/my_branch

この変更とその理由は、リリース候補1であるgit 1.8.0のリリースノートに記載されています

言いたくはgit branch --set-upstream origin/masterありましたが、Gitはローカルブランチorigin/masterを、現在チェックアウトされているブランチと統合するように調整するように指示しています。このオプションは非推奨です。代わりに新しい--set-upstream-to(短くて甘い-u)オプションを使用してください。


95
また-u、初めてプッシュしたことを忘れた場合でも、そのフラグを使用して再度プッシュを実行すると、追跡が開始されます。
Henrik N

70
これらはいずれも、引数なしでgit pushを使用するユースケースを満たしていません。新しいブランチを初めてリモートに移動するときは、まだ「git push -u origin my-branch」を覚えておく必要があります。
Karn the Pagan

19
私は次の別名を作成したので、私は、同様にその構文を覚える嫌い:alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
lillialexis

99
これで問題ありませんが、OPの申し立ては有効だと思います。ローカルブランチを開始して作業し、それをoriginにプッシュして共有します(引数なし)。なぜそれがアップストリームを設定すべきではないのですか?新しいブランチをリモートにプッシュするときに何らかの理由でアップストリームを設定しないことが実際に望ましいですか?
GaryO 2013年

23
完全に開発時間の価値はありません。なぜ自動的に実行されないのですか?
sudo 2017

1346

入力を減らすことでこれを実現できます。まず、プッシュの動作を変更します。

git config --global push.default current

これはorigin my_branch部分を推測するので、次のことができます。

git push -u

これにより、同じ名前のリモートブランチが作成され、追跡されます。


4
新しく作成されたリポジトリで新しく作成されたブランチに対してorigin実行すると、どうしてgitは推測できるのgit push -uですか リポジトリが複製されたという仮定はありますoriginか?したがって、現在のブランチはリモートに設定されていますか?
Piotr Dobrogost 2015年

73
これがデフォルトです。より良いデフォルトで出荷された場合、gitの多くのものがよりユーザーフレンドリーになる可能性があります。
phreakhead 2016

13
同じことを行うには「シンプル」を使用するよりも、見unsafer「現在」はわずかであることに注意してくださいstackoverflow.com/questions/23918062/...
エア

30
それはしますが、それをしようとするpullときは、どこから指定する必要があります。は-u、オリジンとローカルリポジトリ間のブランチトラッキングを設定します。
ザミット

7
わずかに便利ですが、これでもまだ最初と唯一の別のコマンドを実行する必要がありpushます。これはこの質問の全体のポイントを無効にします。要するに、良い答えはありません。Git開発者がこの厄介なユーザー経験(AUX)を維持することを強く主張していることは、広範なコミュニティーの反対に直面して...啓蒙的です。そして落胆。(主に落胆。)
セシルカレー

87

あなたは簡単にできます

git checkout -b my-branch origin/whatever

そもそも。あなたが設定した場合branch.autosetupmergeまたはbranch.autosetuprebaseに(私のお気に入り)always(デフォルトはあるtrue)、my-branch自動的に追跡されますorigin/whatever

を参照してくださいgit help config


5
これは、「致命的:パスを更新できず、同時にブランチ 'my-branch'に切り替えることができない」を生成します。
異教のカール

12
ちなみに、私は通常、新しいブランチ名としてgit checkout -t origin/whateverも選択whateverします。とても便利!
cdunn2001

2
@cdunnこれは理想的ですが、一貫性がほとんどありません。フラグは-u/ と呼ばれるべき--set-upstreamです。
東武

1
git checkout -t origin/whatever新しいブランチを作成しようとしても機能しません:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

1
git checkout -b my-branch origin/whateverまた、同じエラーが(私はローカルまたはリモートに存在しない新しいブランチを作成しようとしています)があります: fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

81

これは私のファックの最も一般的な使用法です。

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

また、あなたの端末で罵り言葉をタイプするのは楽しいです。


これは、Windows(または少なくともgit-bash)に移植する必要があります。
BrianHVB

1
さて、この小さな発見は私の一日を作りました。ありがとう
Ivan Durst

素晴らしいツール、ありがとう!
由利

81

上流をより簡単に設定するには、2つの方法があります。最初にブランチを作成するとき:

git branch -u origin/my-branch

または、ブランチを作成した後、このコマンドを使用できます。

git push -u origin my-branch

単一のコマンドでブランチ、チェックアウト、アップストリームを設定することもできます:

git checkout -b my-branch -t origin/my-branch

私の個人的な好みは、2ステップのコマンドでこれを行うことです。

git checkout -b my-branch
git push -u origin my-branch

1
正解です。両方の一般的な使用例に対処します。実行した後、実行して変更をプルダウンgit branch -u origin/my-branchできgit pullます。
Benjamin Atkin

2
「git checkout -b my-branch -t origin / my-branch」これは、「origin / my-branch」がまだ存在しない場合は機能しません。
Spongman 2017年

1
実際にgit checkout -t origin/my-branch-b my-branch、なしで実行できmy-branchます。ローカルブランチ名が自動的に推測されます。ただし、@ Spongmanが述べたように、このコマンドorigin/my-branchが最初に存在しない場合は機能しません。
wisbucky

はい、@ wisbuckyで動作します。-tは問題なく動作します。でも個人的には、返信を書いてから2年経っても、checkout -bとpush -uを使用して2行に分割することを好みます。これはより明示的であり、チェックアウト-bにリモートがない場合のエラーはありません-これは実験時にかなり頻繁に発生します:)
Tzen

2
git push -u origin/my-branch私のために失敗しますfatal: 'origin/my-branch' does not appear to be a git repository。これは機能します:git push -u origin my-branch
stason 2018年

48

以下を使用できます。

git config --global branch.autosetupmerge常に

これは、新しいブランチを作成またはチェックアウトするたびに上流のブランチをリンクします。

https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/を参照してください

これbranch.autosetuprebaseは、リベースに重点を置いたワークフローに従っている場合にも機能しますが、何をしているのかわからない場合は使用しないでください。プル動作がデフォルトでリベースになり、奇妙な結果が生じる可能性があります。


8
動作しません。それでも--set-upstreamメッセージが表示されます
Dorian

2
@ドリアン、ブランチを作成する前にこれを設定する必要があります。stackoverflow.com/a/9753268/263998を
cdunn2001

8
しかし...これは、同じブランチとリモートとして追跡ブランチを設定しませんが、あなたがプッシュしないとき、現在のローカルブランチに...そう、それはあなたが新しいブランチを作成する前にされたローカルブランチにプッシュしようとします
アーノルド・ロア

1
これは、デフォルトよりも奇妙な動作をします。枝に基づいて作業を行うと、それは本当に奇妙な動作をします。
Beefster

1
この設定には注意してください。設定すると、この動作が得られます。1.に切り替えますmaster。2.を実行しますgit checkout -b new_branch。3.そのブランチにコミットを追加します。4 git push origin new_branchこれにより、そのコミットがmaster(と呼ばれるオリジンの新しいブランチではなく)オリジンブランチにプッシュされnew_branchます。
stwr667

38

ちなみに、現在のブランチを同じ名前のリモートにプッシュするショートカット:

$ git push -u origin HEAD

22

私はこれらの次のエイリアスをbashで個人的に使用しています

〜/ .gitconfigファイル内

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

〜/ .bashrcまたは〜/ .zshrcファイル

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

1
.gitconfigをhcangeする必要があるだけでgit pushup、現在のブランチを常にオリジンにプッシュするコマンドを使用できました。私はいつもちょうど使用することができるgit pushupのではなく、git push👍
thespacecamel

18

以下が機能しない場合:

git config --global push.default current

また、可能であればプロジェクトにローカルgit構成があるため、プロジェクトのローカル構成も更新する必要があります。

git config --local push.default current

2
より多くの説明が素晴らしいでしょう。最初の行は何をしますか?
パピヨン

3
この答えは正当だと感じるものです。エイリアスを提案するものはすべて、馬鹿げた回避策です。そして、長いコマンドシーケンスを記憶することを正当化する他のものは、教訓的です。
MarkHu

10

エラーメッセージで言及されているように、プルするリモートブランチをgit pullに明示的に指示することもできます。

git pull <remote-name> <remote-branch>

ただし、これには注意してください。別のブランチにいて明示的にプルすると、プルしたrefspecが現在のブランチにマージされます。


10

価値があることについては、リモート(たとえばorigin / somebranch)に既に存在するブランチを追跡しようとしているが、ローカルでまだチェックアウトしていない場合は、次のようにできます。

$ git checkout --track origin/somebranch

注:「-t」は「--track」オプションの短縮版です。

これにより、すぐに同じ関連付けが設定されます。


5
実際には、ブランチにチェックアウトできます。だから、git checkout somebranch同じです。
ザミット2014

2
@Zamithそれはgit fetch事前にすぐに電話をかけた後でのみ機能しませんか?
Walter Roman

1
すぐにではありませんが、そうです。ローカルリポジトリのそのブランチへの参照が必要です。これは、git fetchまたはを呼び出すたびに発生しますgit pull。でも、それが問題になることは一度もありません。
ザミス

10
git branch --set-upstream-to=origin/master<branch_name>

9

毎回Gitからの提案をコピー/貼り付ける代わりに、このGitエイリアスを使用します:https : //gist.github.com/ekilah/88a880c84a50b73bd306

以下にコピーされたソース(これを~/.gitconfigファイルに追加してください):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7

過度に冗長な構文を使わずにこれを処理できる非常に優れたエイリアスを設定できます。

に次のエイリアスがあります~/.gitconfig

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

新しいブランチでコミットした後、次のコマンドを入力するだけで新しいブランチをプッシュできます。

git po

なんでpopush origin?これを複数回実行するとどうなりますか?
Arnold Roa

はい、プッシュオリジンと同様です。複数回実行しても何も起こりません。また、git push -fエイリアスをに設定しているgit pfため、オリジンがすでにプッシュされている場合はそれを使用します。
123

djanowskiのコメントを参照してください。直接使用できますHEAD
arhak

3

で動作するエイリアスを探している人のためにgit pull、これは私が使用するものです:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

今あなたが得るときはいつでも:

$ git pull
There is no tracking information for the current branch.
...

ただ走れ:

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

そして、あなたは行ってもいいです


2

gitには、さまざまな「上流」リポジトリにさまざまなブランチをプッシュ/プルする優れた機能があるためです。同じブランチで、プッシュとプルに別々のリポジトリを使用することもできます。これにより、分散されたマルチレベルのフローが作成されます。これは、Linuxカーネルなどのプロジェクトで役立ちます。Gitは当初、そのプロジェクトで使用するために構築されました。

結果として、ブランチがどのレポを追跡すべきかについては想定していません。

一方、ほとんどの人はこの方法でgitを使用しないので、デフォルトオプションの良い例になるかもしれません。

Gitは一般にかなり低レベルであり、苛立たしい場合があります。それでもGUIはあり、シェルから引き続き使用する場合は、ヘルパースクリプトを簡単に作成できます。



0

legitこの問題が原因で、私は再発見しました(OS Xのみ)。分岐時に使用するのは次の2つのコマンドだけです。

legit publish [<branch>] 指定されたブランチをリモートに公開します。(別名:pub

legit unpublish <branch> 指定したブランチをリモートから削除します。(別名:unp

SublimeGitにlegitデフォルトでサポートが付属しており、Ctrl-bを押すのと同じくらい簡単に分岐ルーチン全体を作成できます。


0

ファブリケータを使用し、gitを使用してプッシュしません。Linux / Macで動作するbashエイリアスを作成する必要がありました

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=origin/master "$1"
}

セーブ

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull

0

git pushのbashエイリアスは次のとおりです。すべてのプッシュで安全に実行でき、最初のプッシュのアップストリーム設定とその後の通常のプッシュを自動的に切り替えます。

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

元の投稿

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.