Jak możesz wyciągnąć tylko bieżącą gałąź?

81

Czy istnieje sposób konfiguracji, aby to ustawić bez konieczności określania, która gałąź?

qodeninja
źródło

Odpowiedzi:

84

Git już pobiera tylko bieżącą gałąź. Jeśli masz oddział skonfigurowany jako gałąź śledząca, nie musisz określać gałęzi zdalnej. git branch --set-upstream localbranch reponame/remotebranchutworzy relację śledzenia. Następnie wystawiasz git pull [--rebase]i tylko ta gałąź zostanie zaktualizowana.

Oczywiście wszystkie zdalne gałęzie śledzenia i wszystkie referencje dla zdalnego zostaną zaktualizowane, ale tylko lokalna gałąź śledzenia zostanie zmodyfikowana.

Przydatny alias Bash, aby ograniczyć wpisywanie tej typowej operacji:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

Funkcja PowerShell, która robi to samo:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}
Seth Robertson
źródło
to prawda i może trochę dziwne, ponieważ "git push" (domyślnie) próbuje wypchnąć wszystkie gałęzie (o tej samej nazwie zdalnej).
Alessandro De Simone
2
@AlessandroDs Cóż, ustawiłem push.default na upstream właśnie z tego powodu. Nowa wartość domyślna dla push.default to „prosta”, która ponownie aktualizuje tylko bieżącą gałąź, więc jest znacznie bardziej równoległa do tego, co robi pull.
Seth Robertson
1
@Danjah: Wszystkie zmiany są pobierane ze zdalnego repozytorium (do zdalnych gałęzi śledzenia, np. Origin / master origin / foo, itp.). Jeśli jesteś wyewidencjonowany do lokalnego oddziału ze zdefiniowanym upstream, tylko ten lokalny oddział zostanie zaktualizowany. Jeśli jesteś wyewidencjonowany do lokalnego oddziału bez upstream, musisz podać więcej informacji lub ustawić upstream. Nie próbuj modyfikować nielokalnego kasy, utwórz lokalny oddział i kontynuuj. Jeśli chcesz zredukować to, co przesyłasz, możesz zaktualizować refspec pilota w lokalnej konfiguracji git.
Seth Robertson
1
Czy istnieje wbudowany sposób, aby nie aktualizować wszystkich referencji tylko pobierać bieżącą gałąź?
Aditya MP,
1
@aditya menon: Niełatwo. Będziesz musiał zaktualizować refspec (np. Git config remote.origin.fetch), aby pobierać tylko określone referencje (gałęzie, tagi itp.), Które chcesz. Więcej szczegółowych przykładów można znaleźć na stackoverflow.com/questions/15507264/… .
Seth Robertson,
61

Po prostu zrobiłem to w ten sposób:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

lub

git pull origin $(git rev-parse --abbrev-ref HEAD)

Spowoduje to wyodrębnienie bieżącej gałęzi z git branchi ściągnięcie tej gałęzi ze zdalnego źródła.

Zauważ, że jak powiedział Seth Robertson, gdy nie podano żadnych argumentów, modyfikowana jest tylko bieżąca gałąź, ale wszystkie zdalne gałęzie są pobierane. Nie chcę pobierać wszystkich zdalnych oddziałów, więc zrobiłem to w ten sposób.

ayke
źródło
3
git branchnie powinno być analizowane w poszukiwaniu informacji o gałęzi. Informacje te są dostępne git rev-parsepo git pull origin $(git rev-parse --abbrev-ref HEAD)
wydaniu
@ayke Dodałem odpowiedź Paula DelRe do twojej, ponieważ również zadziałała, mam nadzieję, że oboje nie macie nic przeciwko
Timo Huovinen
1
Po prostu ciekawy: Jaka jest różnica między prostym „git pull” (po sprawdzeniu gałęzi, którą chcę wyciągnąć) a twoją sugestią? Twoje podstawianie poleceń powoduje, git pull origin <current-branch>że i tak jest to ustawienie domyślne, prawda? Czy sugerujesz, że inne zdalne gałęzie (np. Pochodzenie / inna gałąź itp.) Nie są aktualizowane, więc ruch jest ograniczony?
Peter - Przywróć Monikę
Odpowiedziałem na to wieki temu, już naprawdę nie wiem. Prawdopodobnie powinieneś pójść z zaakceptowaną odpowiedzią ...
ayke
@ PeterA.Schneider Jeśli po prostu wpiszesz, git pullmożesz otrzymać wiadomość typu There is no tracking information for the current branch. Please specify which branch you want to merge with.. Wtedy zawsze kończysz pisać git pull origin my-feature-branch. Naprawdę chciałbym wiedzieć, jak dochodzi do tej sytuacji, że nie ma informacji o śledzeniu.
Alfe,
18

AKTUALIZACJA

Stara odpowiedź, którą dodałem, już nie działa: /. Ale po otrzymaniu kilku pozytywnych opinii na temat wersji PUSH, którą umieściłem, dla mnie oznacza, że ​​ta odpowiedź faktycznie pomaga komuś, kto kończy przychodzenie tutaj z wyszukiwarek, więc zatrzymam tę odpowiedź.

Wypróbuj to w nowej wersji git:

$ git config --global push.default current
Bruno Casali
źródło
9
Nie wierzę, że istnieje pull.default. Zobacz git-scm lub kernel.org .
Mort
2
Tak. git 2.3.4 w systemie Linux pobiera wszystkie gałęzie, nawet z powyższym pull.default=current. Widzę, że mój git clonedomyślnie również został dodany, remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*ale to dość standardowe.
Mort
6
Brak pull.defaultzmiennej konfiguracyjnej. Umieszczenie tego w konfiguracji git nic nie da.
David Sanders,
5
Pytanie dotyczy git pull, a odpowiedź zawiera git push z wieloma pozytywnymi opiniami. To jest mylące @BrunoCasali Dlaczego zmodyfikowałeś swoją odpowiedź i usunąłeś ją, jeśli zadziałała? Jeśli zdasz sobie sprawę, że odpowiedź jest nieprawidłowa, usuń ją, zamiast przechowywać ją z nieistotnymi informacjami, aby zachować głosy za.
TJ,
5

Tak, istnieje konfiguracja, którą można zmienić .gitconfig, na przykład:

[push]
  default = current

co spowodowałoby wypchnięcie bieżącej gałęzi do aktualizacji gałęzi o tej samej nazwie po stronie odbierającej.

Sprawdź przez:

git config --global --get push.default

Zobacz: git-config .

kenorb
źródło
3

--set-upstreamFlaga jest przestarzała i zostanie usunięta. Dlatego użyj --tracklub--set-upstream-to

Przykład: jeśli chcesz ustawić informacje o śledzeniu dla tego oddziału, możesz to zrobić za pomocą:

git branch --set-upstream-to=<remote>/<branch> develop
biniam
źródło
Może być przestarzały (źródło?), Ale --set-upstream-to=git wciąż o nim wspomina, gdy nie wie o twoich informacjach o śledzeniu. Bez wzmianki o wycofaniu.
Adrien
@AdrienGiboire Oto kilka informacji na temat wycofania: jira.atlassian.com/browse/SRCTREEWIN-588
biniam
0

Oto alias git, który nie zakłada, że ​​pilot jest origini obsługuje, jeśli gałąź nie śledzi pilota.

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(Zastrzeżenie: jestem bardzo nowicjuszem w bash i powyższe prawdopodobnie można by znacznie uprościć.)

scobi
źródło