Ich weiß, dass diese Frage schon fast 3 Jahre alt ist, aber ich habe mir genau die gleiche Frage gestellt und keine fertige Lösung gefunden. Also habe ich ein benutzerdefiniertes Git-Befehl-Shell-Skript selbst erstellt.
Jetzt geht es los, die git-ffwd-update
Skript macht folgendes...
- gibt sie eine
git remote update
zum Abrufen der aktuellen Drehzahlen
- verwendet dann
git remote show
um eine Liste der lokalen Zweige zu erhalten, die einen entfernten Zweig verfolgen (z. B. Zweige, die mit git pull
)
- dann prüft es mit
git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
wie viele Commits der lokale Zweig hinter dem entfernten liegt (und umgekehrt)
- wenn der lokale Zweig 1 oder mehr Commits voraus ist, kann er NICHT vorgespult werden und muss von Hand zusammengeführt oder neu gebased werden
- wenn der lokale Zweig 0 Commits voraus ist und 1 oder mehr Commits zurückliegt, kann er vorgespult werden durch
git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
kann das Skript wie folgt aufgerufen werden:
$ git ffwd-update
Fetching origin
branch bigcouch was 10 commit(s) behind of origin/bigcouch. resetting local branch to remote
branch develop was 3 commit(s) behind of origin/develop. resetting local branch to remote
branch master is 6 commit(s) behind and 1 commit(s) ahead of origin/master. could not be fast-forwarded
Das vollständige Skript sollte gespeichert werden als git-ffwd-update
und muss sich auf der PATH
.
#!/bin/bash
main() {
REMOTES="$@";
if [ -z "$REMOTES" ]; then
REMOTES=$(git remote);
fi
REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
CLB=$(git rev-parse --abbrev-ref HEAD);
echo "$REMOTES" | while read REMOTE; do
git remote update $REMOTE
git remote show $REMOTE -n \
| awk '/merges with remote/{print $5" "$1}' \
| while read RB LB; do
ARB="refs/remotes/$REMOTE/$RB";
ALB="refs/heads/$LB";
NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));
if [ "$NBEHIND" -gt 0 ]; then
if [ "$NAHEAD" -gt 0 ]; then
echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded";
elif [ "$LB" = "$CLB" ]; then
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge";
git merge -q $ARB;
else
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. resetting local branch to remote";
git branch -f $LB -t $ARB >/dev/null;
fi
fi
done
done
}
main $@
9 Stimmen
Möchten Sie die automatische Aktualisierung der lokalen Verfolgungszweige nur im Schnelldurchlauf? Das sollten Sie, denn bei der Zusammenführung können Konflikte auftreten, die Sie lösen müssen...
45 Stimmen
Geht man von einem konservativen Betrag von 300 Dollar für die Beratungszeit aus, um damit herumzuspielen, so hat diese eine Ausgabe die Unternehmen 23.242.800 Dollar gekostet, wenn man von 77.476 Besuchern ausgeht. Betrachten Sie nun diese Frage stackoverflow.com/questions/179123/ und all die anderen. Wow.
0 Stimmen
Auch hier gibt es eine gute Antwort stackoverflow.com/a/10312587/1254718
29 Stimmen
@Luke Sie sind die erste Person, die ich höre, die darauf hinweist, dass die Zeit, die wir aufwenden, damit Git das tut, was wir wollen, Unternehmen Geld kostet. Diese einfachen Dinge sollten automatisch erfolgen und so einfach sein, dass ich keinen Browser öffnen muss, um die Foren zu lesen, IMO.
20 Stimmen
@LukePuplett Es gibt fast ~9 Mal so viele Fragen zu Git auf SO im Vergleich zu Mercurial, und die meisten davon scheinen zu sein "Wie mache ich <einfache Operation> in Git?". Das deutet darauf hin, dass Git entweder schlecht konzipiert, schlecht dokumentiert oder unintuitiv ist, oder alles drei.
38 Stimmen
@IanKemp Ich bin mir nicht sicher, ob es sicher ist, diese Behauptung aufzustellen, ohne die demografischen Daten von SO zu kennen. Wenn Mercurial hier nicht so häufig benutzt wird, oder wenn die Benutzer andere Foren benutzen, um darüber zu fragen, würde ich das gleiche Ergebnis erwarten. :) Es gibt ~51 mal so viele Fragen zu Javascript im Vergleich zu Assembly - also ist es vielleicht nicht immer genau, Werkzeuge nur anhand dieser Art von Metriken zu beurteilen.
5 Stimmen
Lol... Wieder ein Beispiel dafür, dass Git eine einfache Aufgabe schwierig macht.
1 Stimmen
Ich weiß, dass dies eine alte Frage ist, OP, aber würden Sie in Erwägung ziehen, die Antwort von John nicht zu akzeptieren und eine andere zu akzeptieren? Die akzeptierte Antwort stellt rechthaberische (und gemäß den Kommentaren potenziell schädliche) Behauptungen über pull versus rebase auf, die nichts mit der Frage zu tun haben, und sie empfiehlt die Verwendung eines Softwarepakets, das nicht mehr gepflegt wird und offenbar nur unter Linux funktioniert.
0 Stimmen
@KyleStrand danke für den Hinweis
git-up
wird nicht mehr gepflegt. Ich habe ihn viele Jahre lang gerne benutzt, aber jetzt nicht mehr. Irgendwie bin ich nicht mehr auf dieses alte Problem gestoßen. Was die anderen Antworten betrifft, so scheint keine gut genug zu sein, um sie zu akzeptieren. Haben Sie einen Favoriten?1 Stimmen
Ich denke, die von Jefromi ist am nützlichsten. Der springende Punkt ist, dass das Verhalten, alle lokalen Zweige zusammenzuführen, eine individuelle Überprüfung erfordert; jeder, der dieses Verhalten wünscht, sollte sich der Risiken bewusst sein, die mit der Automatisierung einer so umfangreichen Menge von Zusammenführungen verbunden sind. Die Entscheidung, ob es sich lohnt, die Automatisierung durchzuführen und wie die Automatisierung erfolgen soll (z. B. soll die Zusammenführung nur im Schnelldurchlauf erfolgen? Wie sollen Konflikte gehandhabt werden?), wird wahrscheinlich spezifisch für den jeweiligen Anwendungsfall sein.
3 Stimmen
Die beste Antwort, wenn Sie viele Zweigstellen haben:
rm -rf repo
danngit clone
2 Stimmen
@IanKemp Nach meiner persönlichen Erfahrung besteht ein großes Problem darin, dass die Leute sich nicht die Mühe machen, die Dokumentation zu lesen, bevor sie in die erste brenzlige Situation geraten. Ich bin mir nicht sicher, ob die tapferen Bemühungen, "Git für Dummies"-Tutorials (mit schöneren Namen) zu erstellen, in dieser Hinsicht eine Hilfe sind. Git ist im Grunde recht einfach: eine DAG von Revisionen und drei Bäume in einem Checkout. Die richtige Kombination von Befehlen und Optionen zu finden, um diese einfachen Strukturen zu manipulieren, ist no so einfach, leider - das ist, wo die
git help
Die -->Google-->SO-Pipeline kommt ins Spiel.