Wie zu finden, wenn eine Verzweigung ein lokal verfolgte Zweig oder Benutzer lokale Niederlassung geschaffen?
-
04-10-2019 - |
Frage
Ich habe eine Fernortungs Niederlassung vor Ort in meinem lokalen Repository verfolgt mit 'git branch -b Zweig-Namen Herkunft / branch-namen'. Mein Fern Zweig ist test2 / test2 (Herkunft / branch-name), die lokal als test2 verfolgt wird.
Der Ursprung wird auch genannt test2. Ich habe nicht meinen lokalen Tracking-Zweig test2 abgemeldeten.
Als ich einen 'git pull Ursprung fern Zweig: local-nachverfolgt-Zweig' Bekomme ich diesen Fehler
[test2] $ git pull test2 test2: test2 Von / gitvobs / git_bare / test2 ! [Abgelehnt] test2 -> test2 (nicht schneller Vorlauf)
Während, wenn ich meine lokale Tracking-Zweig test2 Kasse und ziehen ‚git pull Ursprung local-nachverfolgt-Zweig‘ i erhalten den Fehler nicht und ich mache einen Zug mit 'git pull test2 test2'
Von / gitvobs / git_bare / test2 * Zweig test2 -> FETCH_HEAD Auto-Fusion a.txt Automatische merge fehlgeschlagen; Fix Konflikte und dann das Ergebnis begehen.
ich weiß, dass ein + Hinzufügen (Git-Pull-test2 + test2: test2) würde helfen, aber es überschreibt lokale Änderungen
.Wie kann ich wissen, welche meiner lokalen Niederlassungen von mir vor Ort erstellt werden, mit ‚git branch new-Zweig-name‘ oder verfolgt lokal von entfernten Filialen mit git Zweig -b Zweig-Name Herkunft / branch-name " / p>
Lösung
Unabhängig von der Liste der verzweigten Tracked (die Sie mit git config -l
sehen kann), ein „non-fast-forward
“ -Meldung Mittel, um den Remote-Zweig nicht verschmelzen können (dh die lokale Kopie der abgerufenen des entfernten Zweig Festschreibung) in Ihrer Branche, weil:
- Ihre Branche hat Commits eigen
- die Remote-Zweig hat neue Commits seit dem letzten Zug
so:
--last pull
|
v
x-x-x-x-x <--test2
\
-y-y-y <-- test2/test2
Während dies ein gewesen wäre vorspulen merge
--last pull
|
v
x-x <--test2
\
-y-y-y <-- test2/test2
So:
git checkout test2
git fetch test2 test2
git merge test2/test2
#fix conflicts
git commit
Und bitte, Remote-Repo als test2 einen anderen Namen nennen. Das ist viel zu viele test2 hier;)
Jetzt für die Liste der Remote-Niederlassungen in Ihrem lokalen Repo verfolgt:
git config --get-regexp branch..*
Andere Tipps
git pull Verwirrung
Over-Spezifität
Ihre git pull Befehl enthält zu viele Informationen.
[test2] $ git pull test2 test2: test2
Von / gitvobs / git_bare / test2
! [Abgelehnt] test2 -> test2 (nicht schneller Vorlauf)ich weiß, dass ein + Hinzufügen (Git-Pull-test2 + test2: test2) würde helfen, aber es überschreibt lokale Änderungen
.
Dies ist, was Ihr Befehl bedeutet:
# *------------ (1) remote repository name
# / *------- (2) ref in remote repository
# / / *-- (3) ref in local repository
# / / /
git pull test2 test2:test2
# Means this: From remote repository `test2` (1),
# fetch branch `test2` (2), store it in local branch `test2` (3), then
# merge the fetched history into HEAD.
Sie sagen git pull Ihr lokaler test2
Zweig der Fernbedienung mit dem, was zu überschreiben auf seinem test2
Zweig und dann verschmelzen, dass mit HEAD. Sie wollen wahrscheinlich nicht das Ziel Teil des Refspec aufzunehmen (die :test2
).
Wenn die lokale Niederlassung von Ihnen ausgecheckten konfiguriert ist, etwas zu verfolgen (siehe das „Branches: ...“ weiter unten), nur tun
git pull
Wenn Sie Versorgung benötigen (oder überschreiben) einem entfernten und Repository, liefern nur die Remote-Name / url und die lokale Niederlassung auf der Fernbedienung (leave aus dem letzten Teil des Refspec):
git pull test2 test2
Pull In einem Zweig, der nicht aktiviert ist Out
git pull ist (wie oben erwähnt) eine Kombination von git fetch und git merge (oder git rebase ).
Im Allgemeinen ist eine Zusammenführung könnte Konfliktlösung einzubeziehen. Konfliktlösung erfordert einen Arbeits Baum. Daher ist es nicht möglich, einen normalen Druckvorgang ohne Arbeits Baum auszuführen. Dies bedeutet, dass Ihre aktuelle HEAD hat eine von den Eltern der Zusammenführung sein (es wird der erste Elternteil). ein Fütterungsmaterial zu tun braucht auch einen Arbeits Baum für Konfliktlösung.
Da ein Zug eine Zusammenführung oder Unterfütterungsmaterial handelt, ist es nicht möglich, in eine lokale Niederlassung zu ziehen, die nicht ausgecheckt ist. Sie können nur in den aktuell ausgecheckt Zweig ziehen.
Branchen: Lokale, Spurenlesen, Fernverfolgung
Die verschiedenen Typen von Git Zweige sind alle gleich darunter liegende Objekt: Refs. Refs leben im refs/
Namespace in $GIT_DIR/refs/
und $GIT_DIR/packed-refs
.
- „Local“ Zweige leben im
refs/heads/
Namespace.- Um die
test2
lokale Niederlassung ref zu untersuchen:-
git show-ref refs/heads/test2
oder-
cat .git/refs/heads/test2
oder -
grep -F refs/heads/test2 .git/packed-refs
-
-
- Um die
- „Remote Tracking“ Zweige leben in den
refs/remotes/<remote-name>/
Namensräume.- Remote-Tracking-Zweige sind lokale Kopien des Zweiges von einer Remote-Repository.
- Der Name „remote Tracking“ macht Sinn, wenn man es so denken, aber es kann mit der leider namens
--track
Funktionalität von git branch und git checkout verwechselt wird (siehe die letzte Verzweigung).
- Der Name „remote Tracking“ macht Sinn, wenn man es so denken, aber es kann mit der leider namens
- Um die
test2
zu untersuchen entfernten Zweig ref Tracking:-
git show-ref refs/remotes/test2/test2
oder-
cat .git/refs/remotes/test2/test2
oder -
grep -F refs/remotes/test2/test2 .git/packed-refs
-
-
- Remote-Tracking-Zweige sind lokale Kopien des Zweiges von einer Remote-Repository.
-
Lokale Zweige, die einen anderen Zweig zu verfolgen sind normal lokalen Niederlassungen (in
refs/heads/
), die zusätzliche Konfiguration in$GIT_DIR/config
haben:[branch "test2"] remote = test2 merge = refs/heads/test2
Es ist wichtig zu beachten, dass der
merge
(oderrebase
) Konfigurationsoption Namen eines ref auf der Fernbedienung . Sorefs/heads/test2
bedeutet hier die lokale Niederlassungtest2
auf dem entferntentest2
gefunden. Der spezielle Remote-Name.
verwendet werden kann, um lokale Niederlassungen im lokalen Repository zu beziehen.- Der Zweck der lokalen Niederlassungen, dass „verfolgen“ einige andere Zweige ist es einfach zu machen, nur Typ
git pull
und hat es in (oder Fütterungsmaterial auf der Oberseite) die Geschichte in einem anderen Zweig zusammenführen.
- Der Zweck der lokalen Niederlassungen, dass „verfolgen“ einige andere Zweige ist es einfach zu machen, nur Typ
Sie haben gesagt, Sie ebene Ebene Ortsvereine von lokalen Niederlassungen unterscheiden wollen, dass einige anderen Zweige verfolgen. Sie können dies tun, indem sie für die Branche Konfigu suchenation in der $GIT_DIR/config
Datei.
Sie können mit git config-, dies zu tun:
branch_tracks_something() {
{
git config branch."$1".merge ||
git config branch."$1".rebase
} >/dev/null 2>&1
}
# test local branch
branch_tracks_something test2 && echo 'test2 tracks something' || echo 'test2 does not track anything'
Oder wenn Sie Git 1.6.3 oder höher, können Sie das %(upstream)
Format von verwenden git for-each-ref :
{ echo 'show_ref_desc() {
case "$1" in
refs/heads/*)
t=''
test -n "$2" && t=" (tracks $2)"
echo "local: $1$t"
;;
refs/remotes/*)
echo "remote tracking: $1"
;;
*)
echo "other: $1"
;;
esac
}'; git for-each-ref --shell --format='show_ref_desc %(refname) %(upstream)'; } |
sh
Die Ausgabe sieht wie folgt aus:
local: refs/heads/test2 (tracks refs/remotes/test2/test2)
remote tracking: refs/remotes/test2/HEAD
remote tracking: refs/remotes/test2/test2