Wie zu finden, wenn eine Verzweigung ein lokal verfolgte Zweig oder Benutzer lokale Niederlassung geschaffen?

StackOverflow https://stackoverflow.com/questions/2887242

  •  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 "

War es hilfreich?

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
  • „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).
    • 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
  • 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 (oder rebase) Konfigurationsoption Namen eines ref auf der Fernbedienung . So refs/heads/test2 bedeutet hier die lokale Niederlassung test2 auf dem entfernten test2 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.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top