web-dev-qa-db-ja.com

なぜ `--set-upstream`を常にやる必要があるのですか?

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にプルする必要があることは明らかではありませんか。どうすればこれをデフォルトの動作にすることができますか?

1252
Ram Rachum

ショートカット。これはgit branch --set-upstreamの構文を覚えていることには依存しません 1 することです:

git Push -u Origin my_branch

...あなたがそのブランチを初めてプッシュする時。または、現在のブランチを同じ名前のブランチにプッシュするには(別名に便利です):

git Push -u Origin HEAD

あなたは一度だけ-uを使う必要があり、それはあなたのブランチとOriginのブランチの間の関連付けをgit branch --set-upstreamと同じ方法で設定します。

個人的には、ブランチとリモートのブランチとの関連付けを明示的に設定する必要があるのは良いことだと思います。規則が git Pushgit pullで異なる であることはただ残念です。


1 それは愚かに聞こえるかもしれませんが、私は非常に頻繁に現在のブランチを指定することを忘れています。

更新2012-10-11 :どうやら私はそれが間違って取得するのが簡単だと思った唯一の人ではない! VonC に感謝します。git 1.8.0ではもっと明白なgit branch --set-upstream-toが導入されています。ブランチmy_branchにいる場合は、次のように使用できます。

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

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

git branch -u Origin/my_branch

この変更とその理由は、 git 1.8.0のリリースノート、リリース候補1 で説明されています。

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

1358
Mark Longair

これは、少ない入力で実現できます。まず、あなたのプッシュの動作方法を変更します。

git config --global Push.default current

これはOrigin my_branch部分を推論するでしょう、それであなたはすることができます:

git Push -u

どちらも同じ名前のリモートブランチを作成して追跡します。

1139
Zamith

簡単にできます

git checkout -b my-branch Origin/whatever

そもそも。 branch.autosetupmergeまたはbranch.autosetuprebase(私のお気に入り)をalways(デフォルトはtrue)に設定すると、my-branchは自動的にOrigin/whateverを追跡します。

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

80
cdunn2001

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
66
Tzen

これが The Fuck の私の最も一般的な使い方です。

$ 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.
...

また、あなたの端末に誓いの言葉をタイプするのも楽しいです。

50
Tamlyn

あなたが使用することができます:

git config --global branch.autosetupmerge always

新しいブランチを作成またはチェックアウトするたびに、アップストリームブランチにリンクします。

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

これはautosetuprebaseでも機能します。よりリベースを重視したワークフローに従う場合ですが、自分のしていることがわからない限りこれを使用しないでください。

41
Daniel

ちなみに、現在のブランチを同じ名前のリモートにプッシュするショートカットは次のとおりです。

$ git Push -u Origin HEAD
34
djanowski
git branch --set-upstream-to=Origin/master<branch_name>
12
user3693546

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

$ git checkout --track Origin/somebranch

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

これは、すぐに同じ関連付けを設定します。

9
mattacular

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

〜/ .gitconfigファイル内

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

および〜/ .basehrcまたは〜/ .zshrcファイル

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

Git pullにどのリモートブランチをプルするかを明示的に指示することもできます(エラーメッセージに記載されているとおり)。

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

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

9
mtbkrdave

毎回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"
8
manroe

過度に冗長な構文なしでこれを処理できる本当に良いエイリアスを設定することができます。

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

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

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

git po
7
123

以下が機能しない場合:

git config --global Push.default current

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

git config --local Push.default current
5
youngrrrr

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

そして行ってもいいです

3
jchavannes

git Push -u Origin $(current_branch)もできます

2

なぜならgitは異なるブランチを異なる「上流の」リポジトリにプッシュ/プルするクールな能力を持っているからです。同じブランチでプッシュとプルのために別々のリポジトリを使うことさえできます。これは分散したマルチレベルフローを作成することができます、私はこれがLinuxカーネルのようなプロジェクトに役立つのを見ることができます。 Gitはもともとそのプロジェクトで使用するために構築されました。

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

一方、ほとんどの人はこのようにgitを使っていないので、デフォルトのオプションでは良いケースかもしれません。

Gitは一般的にかなり低レベルであり、それはイライラすることがあります。それでもGUIがあり、あなたがまだシェルからそれを使いたいのであれば、ヘルパースクリプトを書くのは簡単なはずです。

1
Rolf

私達はphabricatorを使い、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
om471987

私はある種の再発見された legit この問題のために(OS Xのみ)。分岐するときに使用するのは、次の2つのコマンドだけです。

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

legit unpublish <branch>指定されたブランチをリモートから削除します。 (エイリアス:unp

SublimeGit はデフォルトでlegitをサポートしています。これにより、分岐ルーチン全体がCtrl-bを押すのと同じくらい簡単になります。

0
Benny K

これはgit Pushのbash別名です。これはすべてのPushに対して安全に実行でき、最初のPushのアップストリーム設定とその後の通常のプッシュの間で自動的に切り替わります。

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

オリジナル投稿

0
Loren