Domyślne zachowanie „git push” bez określonej gałęzi


1366

Używam następującego polecenia, aby przekazać do mojej zdalnej gałęzi:

git push origin sandbox

Jeśli powiem

git push origin

czy to powoduje zmiany w moich innych oddziałach, czy też tylko aktualizuje mój obecny oddział? Mam trzy oddziały: master, productioni sandbox.

git pushDokumentacja nie jest bardzo jasne, o tym, więc chciałbym wyjaśnić to na dobre.

Które gałęzie i piloty git pushdokładnie aktualizują poniższe polecenia?

git push 
git push origin

origin powyżej jest pilotem.

Rozumiem, że git push [remote] [branch]popchnie tylko tę gałąź do pilota.


Odnośnie konfiguracji narzędzi diff w ogóle i nowego skryptu git difftool, dodałem nową odpowiedź w innym pytaniu SO: stackoverflow.com/questions/255202/...
— VonC

67
Zrobiłem wpis na blogu o zaskakującym zachowaniu git push, które może być interesujące
— Mark Longair

1
@ Mark: w innej pracy, wypychając tylko bieżącą gałąź do jej śledzonego w górę. Miły.
— VCC,


help.github.com/articles/pushing-to-a-remote umieszczając ten link tutaj, aby uzyskać natychmiastową pomoc dla nowicjuszy takich jak ja
— MycrofD

Odpowiedzi:


1591

Możesz kontrolować domyślne zachowanie, ustawiając push.default w swojej konfiguracji git. Z dokumentacji git-config (1) :

push.default

Definiuje akcję, którą powinien wykonać git push, jeśli w wierszu komend nie podano polecenia refspec, nie skonfigurowano żadnego refspec w zdalnym urządzeniu, a żadna z opcji refspec nie jest sugerowana przez żadną z opcji podanych w wierszu polecenia. Możliwe wartości to:

  • nothing: niczego nie pchaj

  • matching: przesuń wszystkie pasujące gałęzie

    Wszystkie gałęzie o tej samej nazwie na obu końcach są uważane za pasujące.

    To był domyślny, ale nie od Git 2.0 ( simplejest nowym domyślnym).

  • upstream: wypchnij bieżącą gałąź do jej gałęzi upstream ( trackingjest przestarzałym synonimem upstream)

  • current: wypchnij bieżącą gałąź do gałęzi o tej samej nazwie

  • simple: (nowość w Git 1.7.11) jak upstream, ale odmawia pushowania, jeśli nazwa gałęzi upstream jest inna niż nazwa lokalna

    Jest to najbezpieczniejsza opcja i dobrze nadaje się dla początkujących.

    Ten tryb stał się domyślny w Git 2.0.

Tryby prosty, bieżący i początkowy są przeznaczone dla tych, którzy chcą wypchnąć jedną gałąź po zakończeniu pracy, nawet gdy inne gałęzie nie są jeszcze gotowe do wypchnięcia

Przykłady wiersza poleceń:

Aby wyświetlić bieżącą konfigurację:

git config --global push.default

Aby ustawić nową konfigurację:

git config --global push.default current

11
Prawdopodobnie warto zauważyć, że jest to nowość w wersji 1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
— CB Bailey

8
Ten „push.default” jest najlepszą rzeczą do pracy z wieloma repozytoriami. Ustaw na „śledzenie”, a wszystko będzie dobrze. W połączeniu z odgałęzieniem - ustawianie przed nimi sprawia, że ​​pchanie i ciągnięcie jest znacznie wygodniejsze.
— jpswain

13
„tracking” to przestarzały synonim „upstream”: kernel.org/pub/software/scm/git/docs/git-config.html
— LuckyMalaka

22
Warto zauważyć, że od wersji Git 1.7.11 dostępny jest nowy simpletryb. Ten tryb ma stać się domyślny w przyszłości. simpledziała jak upstream, ale jak currentwymaga, aby nazwy gałęzi były takie same na obu końcach.
— Kai

9
Warto zauważyć, że od Git 2.0 simplezachowanie jest teraz domyślne.
— do0g

209

Możesz skonfigurować domyślne zachowanie swojego gita za pomocą push.default

git config push.default current

lub jeśli masz wiele repozytoriów i chcesz mieć to samo dla wszystkich, wtedy

git config --global push.default current

Prąd w tej konfiguracji oznacza, że domyślnie będzie naciskać tylko bieżące oddział kiedy zrobić git pchania

Inne opcje to:

  • nic: niczego nie pchaj
  • pasujące: wypychaj wszystkie pasujące gałęzie (domyślnie)
  • śledzenie: popchnij bieżącą gałąź do tego, co śledzi
  • current: Naciśnij bieżącą gałąź

AKTUALIZACJA - NOWY SPOSÓB TO ROBIĆ

Od wersji Git 1.7.11 wykonaj następujące czynności:

git config --global push.default simple

Jest to nowe ustawienie wprowadzone, które działa w taki sam sposób, jak bieżący, i będzie domyślnie ustawione na git z wersji 2.0 zgodnie z plotkami


29
Tak, czytam odpowiedź, do której się odnosisz, ale ta odpowiedź mówi tylko, co robić, a nie jak to zrobić. Dodałem więc swoją odpowiedź, aby wszystkie informacje potrzebne do jej skonfigurowania znajdowały się na tej samej stronie.
— Christoffer,

3
OK; lepiej zasugerować edycję tego postu, ponieważ nikt nie zobaczy twojej odpowiedzi, ponieważ prawdopodobnie nie uzyska tylu głosów
— CharlesB

jak można przejść do obecnej gałęzi? Git Pull Origin?
— Francois,

200

git push originwypchnie wszystkie zmiany w lokalnych oddziałach, które mają pasujące oddziały zdalne w originJak dlagit push

Działa jak git push <remote>, gdzie <remote>jest zdalny bieżący oddział (lub jego źródło, jeśli nie skonfigurowano żadnego zdalnego dla aktualnego oddziału).

Z sekcji Przykłady na git-pushstronie man


2
Tak, to wyjaśnia. Prawdopodobnie korzystam ze starszej wersji git (1.6.1.1 Mac OS X), która nie zawiera tych przykładów na stronie man.
— PlagueHammer

Prawdopodobnie korzystam z wersji 1.6.3.1. Znalazłem go jednak na stronie, do której linkowałem.
— baudtack

2
Tak więc, w moim przypadku, gdy wszystkie lokalne gałęzie mają to samo zdalne „pochodzenie”, „git push” byłoby dokładnie takie samo jak „git push origin”, które wypchnęłoby tylko lokalne gałęzie, które mają odpowiednią gałąź w zdalnym.
— PlagueHammer

@Debajit Zaraz! Nawiasem mówiąc, świetne pytanie. Zawsze zakładałem, że git push popchnie tylko obecną gałąź. Najwyraźniej nie! Bardzo dobrze wiedzieć.
— baudtack

5
To pytanie jest stare, ale dla każdego nowego @docgnome ma rację. Samo uruchomienie „git push origin” spowoduje wypchnięcie wszystkich gałęzi zamiast tylko bieżącej gałęzi. Użyj polecenia „git push -f -v -n origin development”, aby wymusić wypchnięcie gałęzi o nazwie development. Użyj flagi -n, aby zasymulować wynik git push, aby z wyprzedzeniem zobaczyć, które gałęzie zostaną naruszone. Jeśli wygląda dobrze, uruchom „git push -f -v origin development”. Może to być przydatne stackoverflow.com/questions/3741136/git-push-f-vs
— Dylan Valade

54

Właśnie przekazałem swój kod do oddziału i przekazałem go do github, w następujący sposób:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

3
Możesz skondensować zatwierdzenie do polecenia `git commit -am" ... "
— James Harrington,

17
Czy ta odpowiedź ma coś wspólnego z pytaniem? :?
— Asim KT

26

Oto bardzo przydatna i pomocna informacja o Git Push : Git Push: Just the Tip

Najczęstszym zastosowaniem git push jest wypychanie lokalnych zmian do publicznego repozytorium. Zakładając, że serwer nadrzędny jest zdalnym o nazwie „origin” (domyślna nazwa zdalna, jeśli repozytorium jest klonem), a gałąź, która ma zostać zaktualizowana do / z, nosi nazwę „master” (domyślna nazwa gałęzi), odbywa się to za pomocą:git push origin master

git push origin przesunie zmiany ze wszystkich oddziałów lokalnych do pasujących oddziałów zdalnego źródła.

git push origin master przesunie zmiany z lokalnej gałęzi głównej do zdalnej gałęzi głównej.

git push origin master:staging przesyła zmiany z lokalnej gałęzi głównej do zdalnej gałęzi przemieszczania, jeśli taka istnieje.


git push origin branch_namez jakiegoś powodu wypychaj nie tylko branch_nameoddział, ale także inne moje lokalne oddziały (git w wersji 1.9.1).
— mrgloom

git push origin master:stagingto niesamowity ukryty klejnot!
— Shakeel

19

(Marzec 2012)
Uwaga: ta domyślna „ matching” zasada może się wkrótce zmienić
(czasem po git1.7.10 +)
:

Zobacz „ Omów: co powinien zrobić„ git push ”, jeśli nie mówisz, co naciskać? ”

W bieżącym ustawieniu (tj. push.default=matching) git pushBez argumentów wypchnie wszystkie gałęzie, które istnieją lokalnie i zdalnie o tej samej nazwie .
Jest to zwykle właściwe, gdy programista wypycha swoje własne repozytorium publiczne, ale może być mylące, jeśli nie niebezpieczne w przypadku korzystania z repozytorium udostępnionego.

Propozycja polega na zmianie wartości domyślnej na „ upstream” , tj. Wypychanie tylko bieżącej gałęzi i pchanie jej do gałęzi, z której ściągałby git pull.
Kolejnym kandydatem jest „ current”; to wypycha tylko bieżącą gałąź do zdalnej gałęzi o tej samej nazwie.

Co zostało omówione do tej pory można zobaczyć w tym wątku:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Poprzednie istotne dyskusje obejmują:

Aby dołączyć do dyskusji, wyślij swoje wiadomości na adres: git@vger.kernel.org


18

Po prostu umieszczam to w mojej sekcji aliasów .gitconfig i uwielbiam jak to działa:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Popchnie bieżącą gałąź do początku git publub do innego repozytorium z git pub repo-name. Pyszne.


4
To miłe, ale niestety zakłada, że ​​gałąź ma tę samą nazwę w drugim repozytorium. Spróbuj git push -u --repo="origin" $1;zamiast tego. Działa całkiem dobrze, z wyjątkiem sytuacji, gdy prześlesz do innego repozytorium, nazwa gałęzi będzie nazwą używaną przez inne repozytorium, a nie tą, z której
— wypychasz

Hej dzięki! Sprawia, że ​​chcę zrobić bardziej kompletną wersję, która sprawdza stan śledzenia przed pchaniem. Ale na razie pozostanę przy mojej, ponieważ rzadko mam różne nazwy oddziałów między transakcjami repo.
— Mat Schaffer,

10

Możesz wcisnąć bieżącą gałąź za pomocą polecenia

git push origin HEAD

(wziął stąd )


8

Git push spróbuje wypchnąć wszystkie lokalne gałęzie na zdalny serwer, prawdopodobnie tego nie chcesz. Mam kilka udogodnień, aby sobie z tym poradzić:

Alias ​​„gpull” i „gpush” odpowiednio:

W moim ~ / .bash_profile

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

W związku z tym wykonanie polecenia „gpush” lub „gpull” popchnie tylko moją gałąź „obecnie na”.


3
Jeśli zawsze chcesz mieć działanie gpush, możesz także ustawić remote.origin.push = HEAD (np. „Git config remote.origin.push HEAD”), jak wspomniano w sekcji przykładów na stronie man git-push.
— Trevor Robinson

5
Nie jest to konieczne, jeśli spojrzysz na powyższy post autorstwa „Brian L.”.
— jpswain

1
Jest tak, ponieważ nie ma ekw. dla pull pull.default
— SamGoody

8

Możesz zmienić to domyślne zachowanie w swoim .gitconfig, na przykład:

[push]
  default = current

Aby sprawdzić bieżące ustawienia, uruchom:

git config --global --get push.default

3

Zamiast używać aliasów, wolę tworzyć skrypty git-XXX, dzięki czemu mogę łatwiej kontrolować źródła (wszyscy nasi twórcy mają na swojej ścieżce katalog kontrolowany przez źródło dla tego typu rzeczy).

Ten skrypt (wywoływany git-setpush) ustawi wartość konfiguracji wartości na remote.origin.pushcoś, co spowoduje tylko przesunięcie bieżącej gałęzi:

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

Uwaga, ponieważ używamy Gerrit , ustawia cel narefs/for/XXX aby przeszedł do gałęzi recenzji. Zakłada również, że pochodzenie to twoje zdalne imię.

Wywołaj go po sprawdzeniu gałęzi za pomocą

git checkout your-branch
git setpush

Oczywiście można go również dostosować do robienia transakcji, ale lubię skrypty, które robią jedną rzecz i robią to dobrze


świetny pomysł ustawienie remote.origin.push dla użycia gerrit. Moje lokalne gałęzie funkcji feature/fix_fubarsą skierowane do bardziej ogólnych gałęzi upstream, takich jak masterlub develop, więc wskazywałoby to na niewłaściwy upstream. Jak wygląda Twój lokalny przepływ dla repozytoriów kontrolowanych przez Gerrit?
— spazm

Jeśli masz tylko jedną gałąź „docelową” na gerrit, spróbuj po prostu git config remote.origin.push HEAD:refs/for/master.
— fracz

2

Do mojego pliku .bashrc dodałem następujące funkcje, aby zautomatyzować te zadania. Robi git push / git pull + nazwa bieżącego oddziału.

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.