Standardverhalten von "Git Push" ohne Angabe eines Zweigs

1366

Ich verwende den folgenden Befehl, um zu meinem Remote-Zweig zu pushen:

git push origin sandbox

Wenn ich sage

git push origin

Verschiebt dies auch Änderungen in meinen anderen Zweigen oder aktualisiert es nur meinen aktuellen Zweig? Ich habe drei Zweige: master, productionund sandbox.

Die git pushDokumentation ist darüber nicht sehr klar, daher möchte ich dies für immer klarstellen.

Welche Zweige und Fernbedienungen git pushaktualisieren die folgenden Befehle genau?

git push 
git push origin

origin oben ist eine Fernbedienung.

Ich verstehe, dass git push [remote] [branch]nur dieser Zweig auf die Fernbedienung übertragen wird.

PlagueHammer
quelle
In Bezug auf die Konfiguration von Diff-Tools im Allgemeinen und das neue Skript git difftool habe ich in dieser anderen SO-Frage eine neue Antwort hinzugefügt: stackoverflow.com/questions/255202/…
VonC
67
Ich habe einen Blog-Beitrag über das überraschende Verhalten von gemacht git push, das von Interesse sein könnte
Mark Longair
1
@Mark: In anderen Arbeiten wird nur der aktuelle Zweig in den nachverfolgten Zweig verschoben. Nett.
VonC
help.github.com/articles/pushing-to-a-remote Setzen Sie diesen Link hier, um Anfängern wie mir sofortige Hilfe
zukommen zu lassen

Antworten:

1591

Sie können das Standardverhalten steuern, indem Sie push.default in Ihrer Git-Konfiguration festlegen. Aus der Dokumentation zu git-config (1) :

push.default

Definiert die Aktion, die git push ausführen soll, wenn in der Befehlszeile keine Referenzspezifikation angegeben ist, in der Fernbedienung keine Referenzspezifikation konfiguriert ist und keine der in der Befehlszeile angegebenen Optionen eine Referenzspezifikation impliziert. Mögliche Werte sind:

  • nothing: nichts schieben

  • matching: Alle passenden Zweige schieben

    Alle Zweige, die an beiden Enden den gleichen Namen haben, gelten als übereinstimmend.

    Dies war früher die Standardeinstellung, aber nicht seit Git 2.0 ( simpleist die neue Standardeinstellung).

  • upstream: Schieben Sie den aktuellen Zweig in seinen Upstream-Zweig ( trackingist ein veraltetes Synonym für Upstream).

  • current: Schieben Sie den aktuellen Zweig in einen gleichnamigen Zweig

  • simple: (neu in Git 1.7.11) wie Upstream, weigert sich jedoch zu pushen, wenn sich der Name des Upstream-Zweigs vom lokalen unterscheidet

    Dies ist die sicherste Option und eignet sich gut für Anfänger.

    Dieser Modus ist in Git 2.0 zum Standard geworden.

Der einfache, aktuelle und vorgelagerte Modus ist für diejenigen gedacht, die nach Abschluss der Arbeiten einen einzelnen Zweig herausschieben möchten, auch wenn die anderen Zweige noch nicht zum Herausschieben bereit sind

Befehlszeilenbeispiele:

So zeigen Sie die aktuelle Konfiguration an:

git config --global push.default

So legen Sie eine neue Konfiguration fest:

git config --global push.default current
UncleZeiv
quelle
11
Es ist wahrscheinlich erwähnenswert, dass dies neu in v1.6.3 ist: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey
8
Diese "push.default" ist die beste Sache, die jemals für die Arbeit mit mehreren Repos gemacht wurde. Stellen Sie es auf "Tracking" und Sie sind alle gut. In Kombination mit dem Zweig - Set-Upstream - machen diese das Drücken und Ziehen bequemer.
jpswain
13
"Tracking" ist das veraltete Synonym für "Upstream": kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka
22
Es ist erwähnenswert, dass es ab Git 1.7.11 einen neuen simpleModus gibt. Dieser Modus soll in Zukunft zum Standard werden. simplefunktioniert wie upstream, aber wie currenterfordert, dass die Filialnamen an beiden Enden gleich sind.
Kai
9
Es ist erwähnenswert, dass ab Git 2.0 das simpleVerhalten jetzt die Standardeinstellung ist.
do0g
209

Sie können das Standardverhalten für Ihr Git mit push.default einrichten

git config push.default current

oder wenn Sie viele Repositorys haben und dann für alle dasselbe wollen

git config --global push.default current

Der Strom in diesem Setup bedeutet, dass Sie den aktuellen Zweig standardmäßig nur pushen, wenn Sie git push ausführen

Andere Optionen sind:

  • nichts: Schieben Sie nichts
  • Matching: Alle passenden Zweige verschieben (Standard)
  • Tracking: Schieben Sie den aktuellen Zweig auf das Tracking
  • current: Schieben Sie den aktuellen Zweig

UPDATE - NEUER WEG, DAS ZU TUN

Ab Git 1.7.11 gehen Sie wie folgt vor:

git config --global push.default simple

Dies ist eine neue Einstellung, die auf die gleiche Weise wie die aktuelle Einstellung funktioniert und laut Gerüchten standardmäßig aus Version 2.0 git wird

Christoffer
quelle
29
Ja, ich habe die Antwort gelesen, auf die Sie sich beziehen, aber diese Antwort sagt nur, was zu tun ist und nicht, wie es zu tun ist. Also habe ich meine Antwort hinzugefügt, damit sich alle zum Einrichten erforderlichen Informationen auf derselben Seite befinden.
Christoffer
3
OK; Es ist besser, eine Änderung des besagten Beitrags vorzuschlagen, da niemand Ihre Antwort sehen wird, da es wahrscheinlich nicht so viele Stimmen gibt
CharlesB
Wie würde man vorgehen, um zum aktuellen Zweig zu ziehen? Git Pull Ursprung?
Francois
200

git push originÜberträgt alle Änderungen in den lokalen Zweigen mit den entsprechenden Remote-Zweigen bei originAs forgit push

Funktioniert wie git push <remote>, wo <remote>sich die Fernbedienung des aktuellen Zweigs befindet (oder der Ursprung, wenn für den aktuellen Zweig keine Fernbedienung konfiguriert ist).

Aus dem Abschnitt Beispiele der git-pushManpage

Baudtack
quelle
2
Ja, das macht es klar. Ich verwende wahrscheinlich eine ältere Version von git (1.6.1.1 Mac OS X), die diese Beispiele nicht in der Manpage enthält.
PlagueHammer
Wahrscheinlich verwende ich 1.6.3.1. Ich habe es jedoch auf der Seite gefunden, die ich verlinkt habe.
Baudtack
2
In meinem Fall, in dem alle lokalen Zweige denselben entfernten "Ursprung" haben, wäre "git push" genau der gleiche wie "git push origin", der nur die lokalen Zweige pusht, die einen entsprechenden Zweig in der entfernten haben.
PlagueHammer
@ Debajit Genau richtig! Tolle Frage übrigens. Ich war immer davon ausgegangen, dass Git Push nur den aktuellen Zweig pushen würde. Scheinbar nicht! Sehr gut zu wissen.
Baudtack
5
Diese Frage ist alt, aber für jeden, der neu ist, ist @docgnome richtig. Wenn Sie nur 'git push origin' ausführen, werden alle Zweige anstelle nur des aktuellen Zweigs verschoben. Verwenden Sie 'git push -f -v -n origin development', um einen Push mit dem Namen development zu erzwingen. Verwenden Sie das Flag -n, um das Git-Push-Ergebnis zu simulieren, damit Sie im Voraus sehen können, welche Zweige betroffen sind. Wenn es gut aussieht, führen Sie 'git push -f -v origin development' aus. Dies könnte nützlich sein stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade
54

Ich habe meinen Code einfach einem Zweig übergeben und ihn wie folgt an github gesendet:

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments
neoneye
quelle
3
Sie können das Commit auf `git commit -am" ... "` verdichten
James Harrington
17
Hat diese Antwort etwas mit der Frage zu tun? :?
Asim KT
26

Hier ist eine sehr praktische und hilfreiche Information über Git Push : Git Push: Nur der Tipp

Die häufigste Verwendung von Git Push besteht darin, Ihre lokalen Änderungen in Ihr öffentliches Upstream-Repository zu übertragen. Angenommen, der Upstream ist eine Remote-Datei mit dem Namen "origin" (der Standard-Remote-Name, wenn Ihr Repository ein Klon ist) und der Zweig, auf den / von dem aktualisiert werden soll, heißt "master" (der Standard-Zweigstellenname).git push origin master

git push origin überträgt Änderungen von allen lokalen Zweigen auf übereinstimmende Zweige der Ursprungsfernbedienung.

git push origin master überträgt Änderungen vom lokalen Hauptzweig zum entfernten Hauptzweig.

git push origin master:staging Überträgt Änderungen vom lokalen Hauptzweig zum Remote-Staging-Zweig, falls vorhanden.

Mukesh Chapagain
quelle
git push origin branch_nameaus irgendeinem Grund schieben nicht nur branch_nameZweig, sondern auch andere meine lokalen Zweige (Git-Version 1.9.1).
Mrgloom
git push origin master:stagingist ein tolles verstecktes Juwel!
Shakeel
19

(März 2012)
Achtung: Diese Standardrichtlinie matchingkann sich bald ändern
(manchmal nach git1.7.10 +)
:

Siehe " Bitte besprechen Sie: Was sollte" Git Push "tun, wenn Sie nicht sagen, was Sie drücken sollen? "

In der aktuellen Einstellung (dh push.default=matching) werden git pushohne Argument alle lokal und remote vorhandenen Zweige mit demselben Namen verschoben .
Dies ist normalerweise angemessen, wenn ein Entwickler in sein eigenes öffentliches Repository wechselt, kann jedoch verwirrend, wenn nicht gefährlich sein, wenn ein freigegebenes Repository verwendet wird.

Der Vorschlag besteht darin , die Standardeinstellung in ' upstream' zu ändern , dh nur den aktuellen Zweig zu drücken und ihn in den Zweig zu verschieben, von dem git pull ziehen würde.
Ein anderer Kandidat ist ' current'; Dadurch wird nur der aktuelle Zweig an den gleichnamigen Remote-Zweig weitergeleitet.

Was bisher diskutiert wurde, ist in diesem Thread zu sehen:

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

Frühere relevante Diskussionen umfassen:

Um an der Diskussion teilzunehmen, senden Sie Ihre Nachrichten an: [email protected]

VonC
quelle
18

Ich habe dies einfach in meinen Abschnitt mit den .gitconfig-Aliasen eingefügt und finde es toll, wie es funktioniert:

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

Schiebt den aktuellen Zweig zum Ursprung mit git puboder einem anderen Repo mit git pub repo-name. Lecker.

Mat Schaffer
quelle
4
Das ist schön, aber es wird leider davon ausgegangen, dass der Zweig im anderen Repository denselben Namen hat. Versuchen Sie es git push -u --repo="origin" $1;stattdessen. Es funktioniert ganz gut, außer wenn Sie in ein anderes Repository pushen, wird der
Filialname
Hey danke! Ich möchte eine vollständigere Version erstellen, die den Tracking-Status vor dem Drücken überprüft. Aber ich bleibe vorerst bei meinen, da ich selten unterschiedliche Filialnamen zwischen Repos habe.
Mat Schaffer
10

Sie können den aktuellen Zweig mit dem Befehl verschieben

git push origin HEAD

(von hier genommen )

Andriy F.
quelle
8

Ein Git-Push versucht, alle lokalen Zweige auf den Remote-Server zu übertragen. Dies ist wahrscheinlich das, was Sie nicht möchten. Ich habe ein paar Annehmlichkeiten eingerichtet, um damit umzugehen:

Alias ​​"gpull" und "gpush" entsprechend:

In meinem ~ / .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`'

Wenn Sie also "gpush" oder "gpull" ausführen, wird nur mein "aktuell aktiv" -Zweig verschoben.

Cody Caughlan
quelle
3
Wenn Sie immer das Verhalten von gpush wünschen, können Sie auch remote.origin.push = HEAD (z. B. "git config remote.origin.push HEAD") festlegen, wie im Beispielabschnitt der git-push-Manpage erwähnt.
Trevor Robinson
5
Dies ist nicht erforderlich, wenn Sie sich den obigen Beitrag von "Brian L" ansehen.
jpswain
1
Es ist, da es kein Äquiv. für pull pull.default
SamGoody
8

Sie können dieses Standardverhalten in Ihrem .gitconfigBeispiel ändern :

[push]
  default = current

Führen Sie Folgendes aus, um die aktuellen Einstellungen zu überprüfen:

git config --global --get push.default
Kenorb
quelle
3

Anstatt Aliase zu verwenden, ziehe ich es vor, Git-XXX-Skripte zu erstellen, damit ich sie einfacher steuern kann (unsere Entwickler haben alle ein bestimmtes quellengesteuertes Verzeichnis auf ihrem Weg für diese Art von Dingen).

Dieses Skript (aufgerufen git-setpush) setzt den Konfigurationswert für den remote.origin.pushWert auf etwas, das nur den aktuellen Zweig pusht:

#!/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

Beachten Sie, dass bei der Verwendung Gerritdas Ziel auf festgelegt wirdrefs/for/XXX , in einen Überprüfungszweig zu pushen. Es wird auch davon ausgegangen, dass der Ursprung Ihr entfernter Name ist.

Rufen Sie es auf, nachdem Sie einen Zweig mit ausgecheckt haben

git checkout your-branch
git setpush

Es könnte natürlich angepasst werden, um auch das Auschecken durchzuführen, aber ich mag Skripte, um eine Sache zu tun und es gut zu machen

Mark Fisher
quelle
Tolle Idee, remote.origin.push für die Verwendung von Gerrit einzustellen. Meine lokalen Feature-Zweige verweisen feature/fix_fubaralle auf allgemeinere Upstream-Zweige wie masteroder develop, sodass dies auf den falschen Upstream- Zweig verweist. Wie sieht Ihr lokaler Fluss für gerritgesteuerte Repos aus?
Spazm
Wenn Sie nur einen "Ziel" -Zweig auf gerrit haben, versuchen Sie es einfach git config remote.origin.push HEAD:refs/for/master.
Fracz
2

Ich habe der .bashrc-Datei die folgenden Funktionen hinzugefügt, um diese Aufgaben zu automatisieren. Git Push / Git Pull + Name des aktuellen Zweigs.

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
}
MichaelMoser
quelle