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.