Tworzę nowy oddział w Git:
git branch my_branch
Popchnij:
git push origin my_branch
Teraz powiedz, że ktoś dokonał pewnych zmian na serwerze, a ja chcę z niego skorzystać origin/my_branch
. Ja robię:
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ę sprawić, by działał z:
git branch --set-upstream my_branch origin/my_branch
Ale dlaczego muszę to robić dla każdej tworzonej gałęzi? Czy to nie jest oczywiste, że jeśli pcham my_branch
się origin/my_branch
, a potem chciałbym ciągnąć origin/my_branch
się my_branch
? Jak mogę ustawić to jako domyślne zachowanie?
git
git-branch
Ram Rachum
źródło
źródło
branch.autosetupmerge
oznacza, że konfiguracja początkowa dla nowej gałęzi jest ustawiana automatycznie tylko podczas tworzenia gałęzi ze zdalnej gałęzi śledzenia (np.<remote-name>/<branch-name>
) (Patrz git-config (1) ). Prawdopodobnie tworzysz swoje oddziały z istniejących oddziałów lokalnych. Jeśli skutecznie rozgałęziasz się bezpośrednio z wierzchołka gałęzi zdalnej (pomimo tego, że jesteś w gałęzi lokalnej), możesz użyćgit branch my_branch <remote-name>/<branch-name>
do automatycznego skonfigurowania konfiguracji nadrzędnej.--set-upstream
opcja jest przestarzała. Powinieneś użyć--track
lub--set-upstream-to
zamiast tego.--set-upstream
jest przestarzałe, to być może deweloperzy git powinni usunąć go z komunikatu pomocy, który wyświetla się, gdy uruchamiaszgit push
się bez opcji i nie jest ustawiony żaden upstream?git branch --set-upstream
jest przestarzały.git push --set-upstream
nie jest.Odpowiedzi:
Skrót, który nie zależy od zapamiętania składni dla
git branch --set-upstream
1, polega na:... za pierwszym razem, kiedy naciskasz tę gałąź. Lub, aby wypchnąć do bieżącej gałęzi do gałęzi o tej samej nazwie (przydatne dla aliasu):
Musisz użyć
-u
tylko raz, a to ustanawia powiązanie między twoim oddziałem a oddziałemorigin
w taki sam sposób, jakgit branch --set-upstream
robi.Osobiście uważam, że dobrze jest jawnie skonfigurować powiązanie między oddziałem a oddziałem na pilocie. Szkoda tylko, że zasady są różne dla
git push
igit 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 11.10.2012 : Najwyraźniej nie jestem jedyną osobą, która łatwo się pomyliła! Dzięki VonC za zwrócenie uwagi na to, że git 1.8.0 wprowadza bardziej oczywiste
git branch --set-upstream-to
, których można użyć w następujący sposób, jeśli jesteś na gałęzimy_branch
:... lub z krótką opcją:
Ta zmiana wraz z uzasadnieniem została opisana w uwagach do wydania dla git 1.8.0, kandydat do wydania 1 :
źródło
-u
pierwszego naciśnięcia, możesz ponownie uruchomić push z tą flagą i rozpocznie się śledzenie.alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
Możesz to zrobić przy mniejszym pisaniu. Najpierw zmień sposób działania push:
Spowoduje to wywnioskowanie
origin my_branch
części, dzięki czemu możesz:Które utworzą zdalną gałąź o tej samej nazwie i będą ją śledzić.
źródło
origin
kiedy działagit push -u
dla nowo utworzonego oddziału w nowo utworzonym repozytorium? Czy założenie, że repozytorium zostało sklonowane, tak że bieżąca gałąź ma swój zdalny zestaworigin
?pull
, musisz określić, skąd. W-u
konfiguruje śledzenie gałęzi między pochodzenia i lokalnego repo.push
- co pokonuje cały sens tego pytania. Krótko mówiąc, nie ma dobrej odpowiedzi. To, że programiści Git nalegają na zachowanie tego niezręcznego użytkownika eXperience (AUX) w obliczu powszechnego sprzeciwu społeczności, jest ... pouczające. I zniechęcające. (Przeważnie zniechęcające.)Możesz po prostu
na pierwszym miejscu. Jeśli ustawisz
branch.autosetupmerge
lubbranch.autosetuprebase
(moje ulubione) naalways
(domyślnie jesttrue
),my-branch
będzie automatycznie śledzićorigin/whatever
.Zobaczyć
git help config
.źródło
git checkout -t origin/whatever
, który wybiera równieżwhatever
jako nową nazwę oddziału. Bardzo wygodne!-u
/--set-upstream
.git checkout -t origin/whatever
nie działa dla mnie, gdy próbuję utworzyć nowy oddział:fatal: Cannot update paths and switch to branch 'whatever' at the same time.
git checkout -b my-branch origin/whatever
ma również ten sam błąd (próbuję utworzyć nowy oddział, który nie istnieje na lokalnym lub zdalnym):fatal: Cannot update paths and switch to branch 'whatever' at the same time.
Możesz ustawić upstream prościej na dwa sposoby. Najpierw podczas tworzenia oddziału:
lub po utworzeniu oddziału możesz użyć tego polecenia.
Możesz także rozgałęzić się, sprawdzić i skonfigurować w jednym poleceniu:
Osobiście wolę to zrobić w dwuetapowym poleceniu:
źródło
git branch -u origin/my-branch
mogę uruchomić,git pull
aby zapisać zmiany.git checkout -t origin/my-branch
zrezygnować z-b my-branch
, po prostu automatycznie wnioskujemy-branch
o nazwę lokalnego oddziału. Jednak, jak wspomniano @Spongman, to polecenie nie działa, jeśliorigin/my-branch
nie istnieje najpierw.git push -u origin/my-branch
zawodzi dla mnie zfatal: 'origin/my-branch' does not appear to be a git repository
. Działa to:git push -u origin my-branch
To moje najczęstsze zastosowanie w The Fuck .
Również fajnie jest pisać przekleństwa w swoim terminalu.
źródło
Możesz użyć:
który połączy gałąź nadrzędną za każdym razem, gdy tworzysz lub kasujesz nową gałąź.
Zobacz https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/
Działa to również w przypadku
branch.autosetuprebase
, gdy postępujesz zgodnie z procesem bardziej skoncentrowanym na bazowaniu, ale nie używaj tego, chyba że wiesz, co robisz, ponieważ spowoduje to zmianę domyślnego zachowania podczas ściągania, co może powodować dziwne wyniki.źródło
--set-upstream
wiadomośćmaster
. 2. Uruchomgit checkout -b new_branch
. 3. Dodaj zatwierdzenie do tej gałęzi. 4git push origin new_branch
. To wypycha, które zatwierdzają domaster
gałęzi na początku (zamiast do nowej gałęzi nazywa sięnew_branch
).Nawiasem mówiąc, skrót do wypychania bieżącej gałęzi do pilota o tej samej nazwie:
źródło
Osobiście używam tych następujących aliasów w bash
w pliku ~ / .gitconfig
oraz w pliku ~ / .bashrc lub ~ / .zshrc
źródło
git pushup
które zawsze wypycha bieżącą gałąź do źródła. Zawsze mogę po prostu użyćgit pushup
zamiastgit push
👍Jeśli poniższe nie działa:
Powinieneś także zaktualizować lokalną konfigurację swojego projektu, ponieważ jest to możliwe, że Twój projekt ma lokalne konfiguracje git:
źródło
Możesz także wyraźnie powiedzieć git pull, którą gałąź zdalną należy pobrać (jak wspomniano w komunikacie o błędzie):
git pull <remote-name> <remote-branch>
Bądź jednak ostrożny: jeśli jesteś w innej gałęzi i wykonujesz wyraźne ściąganie, ściągnięty refspec zostanie scalony w gałęzi, w której się znajdujesz!
źródło
Jeśli chodzi o to, co jest warte, jeśli próbujesz śledzić gałąź, która już istnieje na pilocie (np. Origin / somebranch), ale nie sprawdziłeś jej jeszcze lokalnie, możesz:
Uwaga: „-t” jest skróconą wersją opcji „--track”.
To ustanawia to samo skojarzenie od samego początku.
źródło
git checkout somebranch
jest równoważne.git fetch
?git fetch
lubgit pull
. Jednak nigdy nie uważałem tego za problem.źródło
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
~/.gitconfig
pliku):źródło
Możesz ustawić naprawdę dobry alias, który poradzi sobie z tym bez nadmiernie pełnej składni.
Mam następujący alias w
~/.gitconfig
:Po zatwierdzeniu nowego oddziału możesz wypchnąć nowy oddział, po prostu wpisując polecenie:
źródło
po
?push origin
? co się stanie, jeśli zostanie uruchomione wiele razy?git push -f
skonfigurowany aliasgit pf
, więc używam go, gdy źródło zostało już wypchnięte.HEAD
Dla tych, którzy szukają działającego aliasu,
git pull
używam tego:Teraz, gdy otrzymasz:
Po prostu biegnij:
I możesz już iść
źródło
Ponieważ git ma fajną zdolność do wypychania / ciągnięcia różnych gałęzi do różnych repozytoriów „upstream”. Możesz nawet użyć osobnych repozytoriów do pchania i ciągnięcia - na tej samej gałęzi. Może to stworzyć rozproszony, wielopoziomowy przepływ. Widzę, że jest to przydatne w projektach takich jak jądro Linuksa. Git został pierwotnie zbudowany do użytku w tym projekcie.
W rezultacie nie zakłada się, które repo powinno śledzić Twoja gałąź.
Z drugiej strony większość ludzi nie korzysta z git w ten sposób, więc może to stanowić uzasadnienie dla opcji domyślnej.
Git jest ogólnie dość niski i może być frustrujący. Istnieją jednak GUI i pisanie skryptów pomocniczych powinno być łatwe, jeśli nadal chcesz korzystać z powłoki.
źródło
Możesz też zrobić
git push -u origin $(current_branch)
źródło
Ponownie odkryłem
legit
powodu tego problemu (tylko OS X). Teraz podczas rozgałęziania używam tylko tych dwóch poleceń:legit publish [<branch>]
Publikuje określoną gałąź do zdalnego. (Alias:pub
)legit unpublish <branch>
Usuwa określoną gałąź ze zdalnego. (ps:unp
)SublimeGit jest domyślnie wyposażony w
legit
obsługę, która sprawia, że cała procedura rozgałęziania jest tak prosta, jak naciśnięcie Ctrl-b.źródło
Używamy fabrykatora i nie używamy git. Musiałem stworzyć alias bash, który działa na Linux / Mac
zapisać
źródło
Oto alias bash dla git push, który można bezpiecznie uruchamiać dla każdego pusha i automatycznie przełącza się między ustawieniem w górę dla pierwszego pusha, a następnie wykonywaniem normalnych pushów po tym.
Oryginalny post
źródło