Git: Wie lokale Niederlassung fusionieren mit Fernbedienung automatisch ohne Abruf Tracking

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

  •  27-09-2019
  •  | 
  •  

Frage

Stellen Sie sich vor, ich habe mehrere Zweige: Meister, a, b, c ...

Jetzt bin ich in Master-Zweig und "git pull". Dieser holt sich alle Änderungen von Remote-Server in den Ursprung / Master, Herkunft / a, Herkunft / b ... branches und verschmilzt Stromzweig (Master) mit Herkunft / Master. Aber dann mag ich einen Zweig wechseln und verschmelzen wieder diese Fern Änderungen von Fern verfolgt Zweig, ohne die Änderungen wieder holen (wie sie bereits in Herkunft / a Zweig).

Gibt es eine einfachere Art und Weise, dies zu tun nicht genau entfernten Zweig I Spur spezifizieren (das heißt automatisch)?

War es hilfreich?

Lösung

Ich glaube nicht, es gibt einen eingebauten Befehl dafür. Aber man könnte so etwas tun:

#!/bin/bash
head=$(git symbolic-ref HEAD) || exit
head=${head#refs/heads/}
merge=$(git config --get branch.$head.merge) || { echo "no tracking branch"; exit 1; }
remote=$(git config --get branch.$head.remote) || remote=origin
git merge $remote/${merge#refs/heads/}

# alternatively, as in Aristotle's answer:
# head=$(git symbolic-ref HEAD) || exit
# upstream=$(git for-each-ref --format='%(upstream:short)' "$head"
# [ -z "$upstream" ] && { echo "no tracking branch"; exit 1; }
# git merge $upstream

Ich glaube, ich meine Grundlagen abgedeckt habe ziemlich gut - es tritt mit dem Status Fehler, wenn in frei stehenden HEAD Zustand, oder wenn der aktuelle Zweig keinen Tracking-Zweig hat. Der Standardwert der zu Ursprung, tun, wie die normalen git Übertragungsbefehle. (Etwas seltsam passiert, wenn Sie versuchen, es auf einem Zweig zu verwenden, die auf der Fernbedienung etwas anderes als ein Zweig verfolgt, dh nicht von der Form refs / heads / *, aber das scheint ziemlich unwahrscheinlich.) Nicht, wie es scheint ‚d wirklich sparen Sie viel Zeit, aber da sind Sie!

Wenn Sie wollen, es zu benutzen, ist es einfach irgendwo zu speichern und Alias ??es, oder nennen Sie es git-etwas und steckte es in Ihrer PATH.

Andere Tipps

Ich glaube, Sie können einfach Ihre lokale Niederlassung und merge von Ihrer lokalen Kopie des Ursprungs Kasse / einem Zweig.

So etwas wie:

git checkout a
git merge origin/a

git pull ist nichts anderes als git fetch + git merge. Mit dem Parameter --rebase können Sie auch haben es rebase und nicht fusionieren, so dass Sie nur auf den anderen Zweig wechseln und merge / rebase:

git checkout a
git merge origin/a

oder:

git checkout a
git rebase a

Da es alles tun, nicht anders habe ich auch aufgehört überhaupt mit zu ziehen. Ich git fetch nur regelmäßig, so kann ich die Änderungen in anderen Repositories leicht verfolgen und dann git merge/rebase, wenn ich bereit bin.

Damit werden alle Tracking-Zweige wiederum Check-out und merge in ihren entsprechenden entfernten Niederlassungen:

git for-each-ref --format='%(refname:short) %(upstream:short)' \
| while read branch upstream ; do
    [ -z "$upstream" ] && continue
    git checkout "$branch"
    git merge "$upstream" || git reset --hard
done

Wenn ein Merge Konflikte hat, ist es zurückgespult mit git reset und Sie werden es müssen manuell tun.

Nicht getestet.

können Sie passieren auch ein oder mehr Muster zu git for-each-ref es zu einem bestimmten Zweig zu beschränken oder zu einem bestimmten Satz von ihnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top