Jestem nowy git
i ćwiczę. Utworzyłem oddział lokalny, ale zobaczyłem, że kiedy to zrobiłem, git push
mój oddział nie został przesłany do repozytorium. Musiałem faktycznie: git push -u origin --all
.
Dlaczego to? Czy gałąź nie jest nową zmianą, która ma być wprowadzana domyślnie? Dlaczego muszę uruchomić drugie polecenie?
git
version-control
Cratylus
źródło
źródło
push.default
, patrzman git-config
). Jeśli to zrobiszgit config --add push.default current
,git push
w razie potrzeby automatycznie utworzy gałąź w zdalnym repozytorium. Dlaczego nie jest to domyślne, wyjaśniono w odpowiedziach.current
iupstream
” można znaleźć w mojej starszej odpowiedzi stackoverflow.com/a/13751847/6309 .Odpowiedzi:
Rzeczywistym powodem jest to, że w nowym repozytorium (git init) nie ma żadnej gałęzi (nie
master
, żadnej gałęzi, zero gałęzi)Więc kiedy naciskasz po raz pierwszy do pustego repozytorium upstream (zwykle nagiego ), to repozytorium upstream nie ma gałęzi o tej samej nazwie.
I:
matching
” (wcisnąć wszystkie gałęzie tej samej nazwie, tworząc je, jeśli ich nie ma),simple
' (wypychaj tylko bieżącą gałąź i tylko wtedy, gdy ma ona podobnie nazwaną gałąź zdalnego śledzenia w górę, od git 1.7.11 )W obu przypadkach, ponieważ upstream puste repozytorium nie ma gałęzi:
Oznacza to, że twój pierwszy lokalny push nie ma pojęcia:
Musisz przynajmniej wykonać:
Ale jeśli tylko to zrobisz, będziesz:
master
gałąź upstream na upstream (teraz niepuste repo): good.master
” musi zostać wypchnięty do upstream (origin
) ”master
„ (upstream branch): zły.Dlatego zaleca się, aby za pierwszym razem wykonać:
Będzie to rejestrowane
origin/master
jako gałąź zdalnego śledzenia i umożliwi automatyczne pushmaster
do następnego pushorigin/master
.I to będzie działać również w przypadku zasad wypychania
current
”lub„upstream
”.W każdym przypadku po
git push -u origin master
inicjalizacji wystarczy zwykłe wypychanie git, aby kontynuować przepychanie mastera do prawej gałęzi.źródło
git push
oczekuje również, że gałąź już istnieje?simple
': push do dowolnego zarejestrowanego odgałęzienia, jeśli ten odgałęzienie ma taką samą nazwę jak lokalny. Wystarczy prostegit push
.git push --set-upstream origin new_branch
lubgit push -u origin new_branch
w skrócie. To,-all
że pytający użył ominęło nazwanie nowego nowego oddziału, włączając wszystkie gałęzie. W odpowiedzi ujął to + Klas Mellbourn.Nie widzisz poniżej
Uważam tę „cechę” za dość irytującą, ponieważ nie próbuję wystrzelić rakiet na Księżyc, tylko pchnąć moją cholerną gałąź. Prawdopodobnie też to robisz, inaczej by cię tu nie było!
Oto poprawka: jeśli chcesz, aby niejawnie naciskała na bieżącą gałąź niezależnie od tego, czy gałąź ta istnieje na początku, po prostu wydaj tę komendę raz i nigdy więcej nie będziesz musiał nigdzie:
Więc jeśli tworzysz takie gałęzie:
a następnie dokonaj kilku zatwierdzeń, a następnie wykonaj
aby wydobyć je z pochodzenia (będąc w tej gałęzi) i utworzy dla ciebie wspomnianą gałąź, jeśli nie istnieje.
Zauważ, że bit -u upewnia się, że są one połączone, jeśli chcesz pobrać później z tej gałęzi. Jeśli nie planujesz później wyciągnąć gałęzi (lub jeśli nie masz nic przeciwko kolejnej wkładce) -u nie jest konieczne.
źródło
git push -u
Dane wyjściowe
git push
podczas wypychania nowej gałęziProsty
git push
zakłada, że istnieje już gałąź zdalna, którą śledzi bieżąca gałąź lokalna. Jeśli nie ma takiej zdalnej gałęzi i chcesz ją utworzyć, musisz to określić za pomocą flagi-u
(krótkiej formy--set-upstream
).Dlaczego tak jest Wydaje mi się, że realizatorzy uważali, że utworzenie gałęzi na pilocie jest tak ważną czynnością, że ciężko byłoby to zrobić przez pomyłkę.
git push
to coś, co robisz cały czas.„Czy gałąź nie jest domyślnie nową zmianą, którą należy wprowadzić?” Powiedziałbym, że „zmiana” w Git jest zatwierdzeniem. Gałąź jest wskaźnikiem zatwierdzenia. Dla mnie bardziej sensowne jest myślenie o pchnięciu jako o czymś, co popycha zobowiązania do innych repozytoriów. To, które zatwierdzenia są wypychane, zależy od tego, w której gałęzi jesteś, i relacji śledzenia tej gałęzi do gałęzi na pilocie.
Możesz przeczytać więcej o śledzeniu gałęzi w rozdziale Zdalne gałęzie książki Pro Git .
źródło
fatal
ale już zrobiłem zatwierdzenie w oddziale. Czy to sprawa?git push -u origin
skopiowane do zdalnego repozytorium.fatal
podobnej do tej, o której wspomniałeś w odpowiedzi. Czy ta różnica zależy od tego, czy coś powierzyłem oddziałowi?fatal
wiadomości. Domyślam się, że różnica zależy dokładnie od tego, jakiej implementacji git używasz. Moje dane wyjściowe pochodzą z wersji 1.8.1.msysgit.1 działającej w systemie Windows 8.Tak szybko nie mogłem znaleźć uzasadnienia dla oryginalnych programistów, ale mogę dać ci wykształcone domysły na podstawie kilku lat doświadczenia w Git.
Nie, nie każda gałąź jest czymś, co chcesz wypchnąć do świata zewnętrznego. Może reprezentować prywatny eksperyment.
Co więcej, gdzie należy
git push
wysłać wszystkie oddziały? Git może współpracować z wieloma pilotami i możesz mieć różne zestawy gałęzi na każdym. Np. Centralny projekt repozytorium GitHub może mieć gałęzie wydania; widelec GitHub może mieć gałęzie tematów do przeglądu; a lokalny serwer Git może mieć oddziały zawierające lokalną konfigurację. Gdybygit push
popchnąć wszystkie gałęzie do pilota, który śledzi bieżąca gałąź, tego rodzaju schemat byłby łatwy do zepsucia.źródło
It might represent a private experiment
.Ok, ale o co chodzi? „Główna” gałąź, na której wszyscy pracują, tzn.master
Nie ma na nią wpływu. Chyba że chcesz ukryć kod źródłowy 2)git push, without a remote, pushes to the current branch's remote
Zgubiłem cię tutaj :(git fetch
każdym razem nie chciałbym setek pół-pracujących gałęzi. 2) Mam na myśligit push
domyślne zachowanie. Przesyła do pilota, że bieżąca gałąź śledzi, jeśli istnieje.HEAD jest skrótem od aktualnej gałęzi, więc HEAD git push -u działa. Teraz, aby uniknąć tego wpisywania za każdym razem, gdy używam aliasu:
git config --global alias.pp 'push -u origin HEAD'
Następnie za każdym razem, gdy chcę przesłać gałąź utworzoną za pomocą gałęzi git -b, mogę przesłać ją za pomocą:
git pp
Mam nadzieję, że to komuś oszczędza czas!
źródło
Przy pierwszej kontroli
Krok 1:
git remote -v
// jeśli znaleziono, zainicjuj git, a następnie usuń lub pomiń krok 2
Krok 2:
git remote rm origin
// Następnie skonfiguruj swój adres e-mail globalnie git
Krok 3:
git config --global user.email "[email protected]"
Krok 4:
git initial
Krok 5:
git commit -m "Initial Project"
// Jeśli już dodajesz repozytorium projektu, pomiń krok 6
Krok 6:
git remote add origin %repo link from bitbucket.org%
Krok 7:
git push -u origin master
źródło
Właśnie doświadczyłem dalszej permutacji tego problemu.
Miałem nazwę oddziału,
feat/XYZ-1234-some-description
ponieważ pracowałem nad wydaniem Jira 1234. W trakcie pracy stworzyłem nowy numer Jira, aby śledzić mniejszy fragment pracy, a kiedy przyszedłem do wypychania, postanowiłem przesłać do nazwy oddziału z tym nowym numerem wydania w:To dało mi błąd omawiany w tym wątku SO. Ale ponieważ próbowałem przekazać nazwę inną niż moja obecna, mój problem był inny niż tutaj opisany. Ostatecznie zmieniłem nazwę mojego lokalnego oddziału, zanim mogłem go przekazać:
Po nieco więcej lekturach zdałem sobie sprawę, że mogłem ustawić opcję
src
nagit push
albo do bieżącej nazwy oddziału, albo po prostu wHEAD
razie potrzeby:źródło
Jeśli włączysz po raz pierwszy wprowadzanie nowych zmian z nowego oddziału. I poniżej błędu:
Aby przesunąć bieżącą gałąź i ustawić pilota jako wysyłającego, użyj
źródło