Dlaczego muszę robić '-- set-upstream ' cały czas?

Tworzę nową gałąź w Git:

git branch my_branch

Push it:

git push origin my_branch

Teraz powiedzmy, że ktoś dokonał pewnych zmian na serwerze I chcę wyciągnąć z origin/my_branch. Ja:

git pull

Ale dostaję:

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.

Nauczyłem się, że mogę to zrobić z:

git branch --set-upstream my_branch origin/my_branch

Ale dlaczego muszę to robić dla każdej gałęzi, którą tworzę? Czy nie jest oczywiste, że jeśli wepchnę my_branch do origin/my_branch, wtedy chciałbym wciągnąć origin/my_branch do my_branch? Jak Mogę ustawić to jako domyślne zachowanie?

 1094
Author: Ram Rachum, 2011-05-22

18 answers

Skrót, który nie zależy od zapamiętywania składni dla git branch --set-upstream 1 jest do zrobienia:

git push -u origin my_branch

... pierwszy raz, kiedy wciskasz gałąź. Można też wcisnąć do bieżącej gałęzi do gałęzi o tej samej nazwie (przydatne dla aliasu):

git push -u origin HEAD

Musisz użyć -u tylko raz, a to ustawia skojarzenie pomiędzy twoją gałęzią a tą w origin w taki sam sposób, jak robi to git branch --set-upstream.

[16]} osobiście uważam, że dobrze jest założyć to stowarzyszenie pomiędzy twoją gałęzią a tą na pilocie. Szkoda tylko, że zasady są inne dla git push i git pull.

1 może to zabrzmieć głupio, ale bardzo często zapominam podać bieżącą gałąź, zakładając, że jest to domyślna-nie jest , a wyniki są najbardziej mylące:) {]}

Aktualizacja 2012-10-11 : widocznie nie jestem jedyną osobą, która uznała, że łatwo się pomylić! Podziękowania dla VonC za wskazanie, że git 1.8.0 wprowadza bardziej oczywisty git branch --set-upstream-to, który może być użyty w następujący sposób, jeśli jesteś na gałęzi my_branch:

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

... lub z krótką opcją:

git branch -u origin/my_branch

Ta zmiana i jej uzasadnienie opisane są w uwagach do wydania git 1.8.0, release candidate 1:

Kuszące było powiedzenie git branch --set-upstream origin/master, ale to mówi Gitowi, aby zorganizował lokalną gałąź origin/master, aby zintegrowała się z aktualnie sprawdzoną gałąź, co jest wysoce nieprawdopodobne, co użytkownik miał na myśli. Opcja jest przestarzały; zamiast tego użyj nowej opcji --set-upstream-to (z krótkim i słodkim -u).

 1234
Author: Mark Longair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-02 04:32:14

Możesz to zrobić z mniejszą ilością pisania. Po pierwsze, zmień sposób działania push:

git config --global push.default current

To wywnioskuje origin my_branch część, więc można zrobić:

git push -u

Który utworzy zdalną gałąź o tej samej nazwie i wyśledzi ją.

 996
Author: Zamith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-08 10:14:04

Możesz po prostu

git checkout -b my-branch origin/whatever

W pierwszej kolejności. Jeśli ustawisz branch.autosetupmerge lub branch.autosetuprebase (Moje Ulubione) na always (domyślnie jest true), my-branch automatycznie śledzi origin/whatever.

Zobacz git help config.

 72
Author: cdunn2001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 22:33:24

Można ustawić prostsze pod prąd na dwa sposoby. Najpierw podczas tworzenia gałęzi:

git branch -u origin/my-branch

Lub po utworzeniu gałęzi, możesz użyć tego polecenia.

git push -u origin/my-branch

Możesz również rozgałęziać, sprawdzać i ustawiać pod prąd jednym poleceniem:

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

Osobiście preferuję to zrobić w dwuetapowym poleceniu:

git checkout -b my-branch
git push -u origin/my-branch
 48
Author: Tzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 22:24:12

Możesz użyć:

Git config --global branch.autosetupmerge zawsze

Który połączy gałąź upstream za każdym razem, gdy utworzysz lub zrealizujesz nową gałąź.

Zobacz https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Działa to również z autosetuprebase, jeśli stosujesz bardziej skoncentrowany przepływ pracy rebase, ale nie używaj go, chyba że wiesz, co robisz, ponieważ domyślnie zachowanie pull będzie rebase, co może powodować dziwne rezultaty.

 36
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-28 20:05:12

To jest moje najczęstsze użycie dla 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.
...
Poza tym, fajnie jest wpisywać przekleństwa w terminalu.
 32
Author: Tamlyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-15 17:22:02

Przy okazji, skrót do przeniesienia bieżącej gałęzi do pilota o tej samej nazwie:

$ git push -u origin HEAD
 29
Author: djanowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 14:20:30
git branch --set-upstream-to=origin/master<branch_name>
 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 04:39:16

Możesz również jawnie powiedzieć git pull, która zdalna gałąź ma ściągnąć (Jak wspomina w komunikacie o błędzie):

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

uważaj jednak na to: jeśli jesteś na innej gałęzi i wykonasz wyraźne pociągnięcie, refspec, który pociągniesz, zostanie scalony z gałęzią, na której się znajdujesz!

 8
Author: mtbkrdave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-20 14:41:17

Jeśli chcesz śledzić gałąź, która już istnieje na pilocie (np. origin/some Branch) ale nie Sprawdzilem jeszcze tego lokalnie, mozna zrobic:

$ git checkout --track origin/somebranch

Uwaga: '- t 'jest skróconą wersją opcji '--track'.

To tworzy to samo skojarzenie od samego początku.

 8
Author: mattacular,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 16:11:01

Używam tego aliasu Git zamiast kopiować / wklejać sugestię z Git za każdym razem: https://gist.github.com/ekilah/88a880c84a50b73bd306

Źródło skopiowane Poniżej (dodaj to do pliku ~/.gitconfig):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"
 7
Author: manroe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-28 05:07:32

Możesz skonfigurować naprawdę dobry alias, który poradzi sobie z tym bez zbyt zwięzłej składni.

Mam następujący alias w ~/.gitconfig:

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

Po dokonaniu commitu na nowej gałęzi, możesz wypchnąć nową gałąź, wpisując komendę:

git po
 7
Author: 123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 18:41:52

Ja osobiście używam następujących aliasów w bash

W ~/.plik gitconfig

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

I w~/.basehrc lub ~/.plik zshrc

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
 4
Author: Amrit Shrestha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 05:09:22

Dla tych, którzy szukają aliasu, który działa z git pull, to jest to, czego używam:

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

Teraz Kiedy masz:

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

Just run:

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

And you ' re good to go

 3
Author: jchavannes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-01 21:52:34

Możesz również zrobić git push -u origin $(current_branch)

 2
Author: ourmaninamsterdam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 08:50:37

Ponieważ git ma fajną zdolność do wypychania / ściągania różnych gałęzi do różnych "upstream" repozytoriów. Można nawet użyć osobnych repozytoriów do pchania i ciągnięcia-na tej samej gałęzi. To może stworzyć rozproszony, wielopoziomowy przepływ, widzę, że jest to przydatne w projektach takich jak jądro Linuksa. Git został pierwotnie zbudowany do wykorzystania w tym projekcie.

W konsekwencji nie zakłada się, które repo twoja gałąź powinna śledzić.

On the other ręka, większość ludzi nie używa git w ten sposób, więc może to zrobić dobry przypadek dla opcji domyślnej.

Git jest ogólnie dość niski poziom i może być frustrujący. Jednak istnieją GUI i powinno być łatwo pisać skrypty pomocnicze, jeśli nadal chcesz używać go z powłoki.

 1
Author: Rolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 11:49:26

I tak jakby na nowo odkryłem legit z tego powodu (tylko OS X). Teraz jedyne czego używam przy rozgałęzianiu to te dwie komendy:

legit publish [<branch>] Publikuje podaną gałąź na zdalnym. (alias: pub)

legit unpublish <branch> Usuwa określoną gałąź z pilota. (alias: unp)

SublimeGit {[8] } jest domyślnie wyposażony w obsługę legit, co sprawia, że cała procedura rozgałęziania jest tak prosta, jak naciśnięcie Ctrl-b.

 0
Author: Benny K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 15:11:34

Używamy phabricatora i nie naciskamy używając Gita. Musiałem utworzyć alias bash, który działa na Linuksie / mac

vim ~/.bash_aliases

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

Zapisz

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
 0
Author: om471987,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 15:40:05