Ich verwende den folgenden Befehl, um zu meiner Remote-Niederlassung zu pushen:
git Push Origin sandbox
Wenn ich sage
git Push Origin
ändert sich das Push auch in meinen anderen Filialen oder aktualisiert es nur meine aktuelle Filiale? Ich habe drei Zweige: master
, production
und sandbox
.
Die git Push
-Dokumentation ist darüber nicht sehr klar, daher möchte ich dies für immer klarstellen.
Welche Zweige und Fernbedienungen werden mit den folgenden Befehlen git Push
genau aktualisiert?
git Push
git Push Origin
Origin
oben ist eine Fernbedienung.
Ich verstehe, dass git Push [remote] [branch]
nur diesen Zweig zur Fernbedienung pushen wird.
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 Referenzspezifikation durch eine der in der Befehlszeile angegebenen Optionen impliziert wird. Mögliche Werte sind:
nothing
: nichts drücken
matching
: Alle passenden Zweige verschieben
Alle Zweige mit demselben Namen an beiden Enden werden als übereinstimmend angesehen.
Dies war die Standardeinstellung, jedoch nicht seit Git 2.0 (simple
ist die neue Standardeinstellung).
upstream
: Verschieben Sie den aktuellen Zweig in den Upstream-Zweig (tracking
ist ein veraltetes Synonym für Upstream).
current
: Verschieben Sie den aktuellen Zweig zu einem Zweig mit demselben Namen
simple
: (neu in Git 1.7.11) wie Upstream, weigert sich jedoch, Push auszuführen, wenn der Name des Upstream-Zweigs nicht mit dem Namen des lokalen Zweigs übereinstimmt
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 Beendigung der Arbeit 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
Sie können das Standardverhalten für Ihr Git mit Push.default einstellen
git config Push.default current
oder wenn Sie viele Repositories haben und dasselbe für alle wollen
git config --global Push.default current
Das aktuell in diesem Setup bedeutet, dass Sie standardmäßig nur den aktuellen Zweig pushen, wenn Sie git Push tun
Andere Optionen sind:
PDATE - NEUE MÖGLICHKEITEN
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. Gerüchten zufolge wird ab Version 2.0 standardmäßig Git verwendet
_git Push Origin
_ überträgt alle Änderungen auf die lokalen Zweige, deren entfernte Zweige mit Origin
übereinstimmen. Wie für _git Push
_
Funktioniert wie _
git Push <remote>
_, wobei _<remote>
_ die Gegenstelle des aktuellen Zweigs ist (oder Origin, wenn für den aktuellen Zweig keine Gegenstelle konfiguriert ist).
Aus dem Abschnitt Beispiele der Manpage git-Push
Ich habe meinen Code einfach an einen Zweig übergeben und ihn in den Github verschoben:
git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git Push Origin SimonLowMemoryExperiments
Hier ist eine sehr praktische und hilfreiche Information über Git Push : Git Push: Nur der Tipp
Die häufigste Verwendung von git Push ist das Übertragen Ihrer lokalen Änderungen in Ihr öffentliches Upstream-Repository. Angenommen, der Upstream ist ein Remote mit dem Namen "Origin" (der Standard-Remote-Name, wenn Ihr Repository ein Klon ist) und der zu aktualisierende Zweig heißt "master" (der Standard-Zweigname). Dies geschieht mit: git Push Origin master
git Push Origin
überträgt Änderungen von allen lokalen Zweigen an die entsprechenden Zweige der Origin-Fernbedienung.
git Push Origin master
überträgt Änderungen von der lokalen Hauptverzweigung an die entfernte Hauptverzweigung.
git Push Origin master:staging
überträgt Änderungen vom lokalen Master-Zweig an den Remote-Staging-Zweig, falls vorhanden.
(März 2012)
Achtung: Die Standardrichtlinie "matching
" wird sich möglicherweise bald ändern
(manchmal nach git1.7.10 +) :
Siehe " Bitte besprechen Sie: Was soll" git Push "tun, wenn Sie nicht sagen, was zu drücken ist? "
In der aktuellen Einstellung (dh
Push.default=matching
) _git Push
_ ohne Argument pusht alle Zweige, die lokal und remote mit demselben Namen existieren .
Dies ist normalerweise angebracht, wenn ein Entwickler auf sein eigenes öffentliches Repository zugreift, es kann jedoch verwirrend sein, wenn es nicht gefährlich ist, wenn ein freigegebenes Repository verwendet wird.Der Vorschlag ist, die Voreinstellung auf '
upstream
' zu ändern , dh nur den aktuellen Zweig pushen und ihn an den Zweig pushen, den git ziehen würde ziehen aus.
Ein anderer Kandidat ist 'current
'; Dadurch wird nur die aktuelle Verzweigung in die gleichnamige entfernte Verzweigung verschoben.Was bisher diskutiert wurde, ist in diesem Thread zu sehen:
http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694
Bisherige relevante Diskussionen beinhalten:
Um an der Diskussion teilzunehmen, senden Sie Ihre Nachrichten an: [email protected]
Ich habe dies einfach in meinen Abschnitt .gitconfig-Aliase 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 mit git pub
oder einem anderen Repo mit git pub repo-name
nach Origin. Lecker.
Ein Git-Push versucht, alle lokalen Zweige auf den Remote-Server zu pushen. Dies ist wahrscheinlich das, was Sie nicht wollen. Ich habe ein paar Annehmlichkeiten eingerichtet, um damit umzugehen:
Alias "gpull" und "gpush" passend:
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 der Zweig "derzeit aktiv" übertragen.
Sie können dieses Standardverhalten in Ihrem .gitconfig
ändern, zum Beispiel:
_[Push]
default = current
_
Führen Sie Folgendes aus, um die aktuellen Einstellungen zu überprüfen:
_git config --global --get Push.default
_
Anstatt Aliase zu verwenden, ziehe ich es vor, git-XXX-Skripte zu erstellen, damit ich sie einfacher in der Quellcodeverwaltung verwenden kann (unsere Entwickler haben für diese Art von Dingen alle ein bestimmtes Quellcodeverwaltungsverzeichnis).
Dieses Skript (genannt git-setpush
) setzt den Konfigurationswert für remote.Origin.Push
auf einen Wert, der 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 wir Gerrit
verwenden, um das Ziel auf refs/for/XXX
zu setzen und es in einen Überprüfungszweig zu verschieben. Es wird auch davon ausgegangen, dass Origin 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 zu erledigen, aber ich mag Skripte für mach eine Sache und mach es gut
Ich habe meiner .bashrc-Datei die folgenden Funktionen hinzugefügt, um diese Aufgaben zu automatisieren. Es tut 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
}