git: switch branch bez odłączania głowy

102

Mam repozytorium na githubie z główną gałęzią (master) i gałęzią do pracy eksperymentalnej. Zrobiłem kilka zmian i przeszedłem do gałęzi eksperymentalnej i wszystko było w porządku.

Teraz, na innym komputerze, staram się klon mojego repozytorium (git clone repozytorium ), a następnie przejść do gałęzi eksperymentalnej (git checkout BRANCHNAME ), ale za każdym razem robię to moja głowa zostaje odłączony i nie mogę wcisnąć moje zmiany. Co ja robię źle? Mam wrażenie, że brakuje mi podstawowej koncepcji gita, ale czytanie przypadkowych stron podręcznika git nie daje mi żadnych wskazówek.

Jestem nowy, więc przepraszam, jeśli jestem idiotą, ale nie mogę znaleźć w dokumentach niczego, co pomoże mi ponownie przywiązać głowę.

EDYTOWAĆ

Brakowało mi koncepcji gałęzi śledzenia. Teraz, gdy rozumiem tę koncepcję, wszystko jest jasne. Osobiście uważam, że git branch --trackskładnia jest znacznie bardziej intuicyjna niż git checkout -b branch-name origin/branch-name.

Dzięki za pomoc!

Dana Robinson
źródło
Aby zmienić gałąź bez odłączania głowicy, z Git 2.23 (sierpień 2019), użyj git switch: zobacz moją odpowiedź poniżej .
VonC

Odpowiedzi:

115
# first time: make origin/branchname locally available as localname
git checkout -b localname origin/branchname 

# othertimes 
git checkout localname 

git push origin

Dla wygody możesz użyć tego samego ciągu dla nazwy lokalnej i nazwy gałęzi.
Kiedy wyewidencjonowałeś, origin/branchnametak naprawdę nie sprawdzałeś gałęzi. origin/branchnamejest nazwą "zdalną" i możesz uzyskać ich listę za pomocą

branch -a 

Jeśli masz włączone kolory, lokalne oddziały będą jednego koloru, a odległe innym.

Musisz najpierw zrobić zdalną gałąź śledzoną lokalnie, aby móc się przełączyć i pracować nad nią.

Kent Fredric
źródło
9
Człowieku, dlaczego „git checkout origin / branchname” nie zaczyna automatycznie śledzić gałęzi, jeśli nie jest jeszcze śledzona?
Martin Konicek
4
ponieważ nadal potrzebujesz lokalnej nazwy oddziału zagranicznego.
Kent Fredric
Oto co robię i komunikat o błędzie: $ git checkout -b topic / fetch upstream / topic / fetch fatal: git checkout: aktualizacja ścieżek jest niezgodna z przełączaniem gałęzi. Czy zamierzałeś sprawdzić „upstream / topic / fetch”, którego nie można rozwiązać jako zatwierdzenie?
ulu
2
Dzięki za wskazówkę dotyczącą kolorów. Aby włączyć kolory:git config --global --add color.ui true
PonyEars
1
Warto zauważyć, że „pochodzenie / nazwa gałęzi” może dosłownie oznaczać wszystko, co odpowiada SHA1 lub SHA1 w sobie =). Regularnie używam tego do tworzenia dowolnych gałęzi z dowolnymi korzeniami.
Kent Fredric
16
git clone [email protected]:abc/def.git
cd def

Teraz utwórz gałąź śledzenia:

git branch --track experimental origin/experimental
git checkout experimental

Następnie, po zakończeniu pracy, po prostu przejdź do github przez

git push
Christoph Rüegg
źródło
3
git branch -t origin / experimental # nie trzeba tak dużo wpisywać :)
Dustin
Gałąź, którą chcę śledzić, nazywa się tematem / pobieranie. Kiedy próbuję wykonać $ git branch --track topic / fetch upstream / topic / fetch mówi, fatal: Not a valid object name: 'upstream / topic / fetch'.
ulu
1
@Dustin, to polecenie tworzy lokalną gałąź „pochodzenie / eksperymentalne”, która śledzi lokalny wzorzec. Domyślam się, że to dość powszechny błąd.
PDug
1
@PDug% git checkout -t pochodzenie / eksperyment Oddział eksperymentalny skonfigurowany do śledzenia zdalnej gałęzi eksperymentalnej od początku przez zmianę bazy. Przełączono na nową gałąź „eksperymentalną”
Dustin
11

Aby rozwinąć odpowiedź Kenta, po wykonaniu sklonowania jedyną gałęzią, którą będziesz mieć (piloty się nie liczą), jest ta, która była aktywna w repozytorium, z którego sklonowałeś - w twoim przypadku master.

Więc najpierw będziesz chciał utworzyć nową gałąź, aby śledzić zdalną gałąź eksperymentalną:

$ git branch experimental origin/experimental

a potem sprawdź to:

$ git checkout experimental

Jednak Kent ma rację - te dwa polecenia można łączyć

$ git checkout -b experimental origin/experimental
Pat Notz
źródło
3

W przypadku Git 2.23 (sierpień 2019 r.) Użyłbyś git switchpolecenia

Jeśli masz zdalną gałąź o tej samej nazwie, będzie ona automatycznie śledzona:

$ git switch new-topic
Branch 'new-topic' set up to track remote branch 'new-topic' from 'origin'
Switched to a new branch 'new-topic'
VonC
źródło