Ich bin der einzige in meiner Organisation, der sich mit der folgenden Nachricht verpflichtet:
Führen Sie den Remote-Tracking-Zweig "Ursprung / Entwicklung" zu "Entwickeln" zusammen
Ich bin mir nicht sicher, was ich tue, um sie zu verursachen, aber ich würde gerne aufhören.
Welchen Befehl gebe ich aus, um dieses Commit zu erstellen, und welchen Befehl sollte ich verwenden, um es nicht zu erzeugen?
git
branching-and-merging
git-merge
git-remote
Jordan Feldstein
quelle
quelle
git pull --autostash --rebase
für Sie @Johnjohn?Antworten:
git pull
erstellt wahrscheinlich das Commit. Wenn Sie ein lokales Commit durchführen und dann ausführen,git pull
nachdem jemand anderes ein Commit in das Repository verschoben hat, lädt Git das Commit des anderen Entwicklers herunter und führt es dann in Ihrem lokalen Zweig zusammen.So vermeiden Sie diese Zusammenführungsverpflichtungen in Zukunft
Sie könnten
git pull --rebase
dies verhindern, um dies in Zukunft zu verhindern, aber das erneute Basieren birgt seine Gefahren, und ich empfehle, espull
insgesamt zu vermeiden .Stattdessen ermutige ich Sie, diesem Verwendungsmuster zu folgen:
Erläuterung
git remote update -p
Lädt alle Commits in die Remote-Repositorys herunter und aktualisiert die Remote-Tracking-Zweige (zorigin/master
. B. ). Es berührt NICHT Ihr Arbeitsverzeichnis, Ihren Index oder Ihre lokalen Zweige.Das
-p
Argument Pflaumen löschte vorgelagerte Zweige. Wenn derfoo
Zweig imorigin
Repository gelöschtgit remote update -p
wird , wird Ihreorigin/foo
Referenz automatisch gelöscht .git merge --ff-only @{u}
weist Git an, den Upstream-Zweig (das@{u}
Argument) in Ihrem lokalen Zweig zusammenzuführen, jedoch nur, wenn Ihr lokaler Zweig schnell zum Upstream-Zweig weitergeleitet werden kann (mit anderen Worten, wenn er nicht auseinander gegangen ist).git rebase -p @{u}
Verschiebt effektiv die Commits, die Sie gemacht haben, aber noch nicht auf den Upstream-Zweig verschoben haben, wodurch die Notwendigkeit entfällt, die albernen Merge-Commits zu erstellen, die Sie vermeiden möchten. Dies verbessert die Linearität des Entwicklungsverlaufs und erleichtert die Überprüfung.Die
-p
Option weist Git an, Zusammenführungen beizubehalten. Dies verhindert, dass Git die neu basierten Commits linearisiert. Dies ist wichtig, wenn Sie beispielsweise einen Feature-Zweig in zusammengeführt habenmaster
. Ohne würde-p
jedes Commit für den Feature-Zweigmaster
im Rahmen der Linearisierung von dupliziertgit rebase
. Dies würde die Überprüfung der Entwicklungshistorie erschweren und nicht einfacher machen.Achtung :
git rebase
Möglicherweise tun Sie nicht das, was Sie erwarten. Überprüfen Sie daher die Ergebnisse, bevor Sie Druck ausüben. Beispielsweise:Ich bevorzuge diesen Ansatz
git pull --rebase
aus folgenden Gründen:-p
(--preserve-merges
) an übergeben,git rebase
falls Sie eine absichtliche Zusammenführung erneut durchführen müssen (z. B. die Zusammenführung eines bereits übertragenen Feature-Zweigs inmaster
).Kurzform:
git up
stattgit pull
Um dies zu vereinfachen, empfehle ich, einen Alias mit dem Namen
up
:Jetzt müssen Sie nur noch Folgendes ausführen, um Ihre Niederlassung auf den neuesten Stand zu bringen:
statt
git pull
. Wenn Sie eine Fehlermeldung erhalten, weil Ihr lokaler Zweig vom vorgelagerten Zweig abgewichen ist, ist dies Ihr Stichwort für eine Neubasis.Warum nicht
git pull --rebase
?Laufen
git pull --rebase
ist gleichbedeutend mit Laufengit fetch
gefolgt von Laufengit rebase
. Dadurch wird versucht, einen schnellen Vorlauf zu den neuen Upstream-Commits durchzuführen. Wenn dies jedoch nicht möglich ist, werden Ihre lokalen Commits auf die neuen Upstream-Commits zurückgesetzt. Dies ist normalerweise in Ordnung, aber seien Sie vorsichtig:git pull --rebase
gibt Ihnen keine Gelegenheit, die Commits zu prüfen, bevor Sie sie einbeziehen. Je nachdem , was geändert stromaufwärts, dann ist es durchaus möglich , dass Fütterungsmaterial ist die falsche Operation-arebase --onto
,merge
,reset
, oderpush -f
könnte als eine einfache besser geeignet seinrebase
.--preserve-merges
an die Rebase-Operation zu übergeben, daher wird jede absichtliche Zusammenführung eines Feature-Zweigs linearisiert, wodurch alle Commits des Feature-Zweigs wiedergegeben (und somit dupliziert) werden."Fixieren" eines vorhandenen Zusammenführungs-Commits, das von erstellt wurde
git pull
Wenn Sie ein von erstelltes Zusammenführungs-Commit noch nicht gepusht haben
git pull
, können Sie das Zusammenführungs-Commit neu festlegen. Angenommen, Sie haben keine absichtlichen Zusammenführungen vorgenommen (z. B. Zusammenführen eines bereits übertragenen Feature-Zweigs mit Ihrem aktuellen Zweig), sollte dies wie folgt geschehen:Die obige Befehl teilt Git alle Nicht-merge auszuwählen begeht erreichbar von
HEAD
(der aktuelle commit), minus alle die Festschreibungen erreichbar von@{u}
(was eine Abkürzung für „stromaufwärtigen Zweig“ ist, das heißt,origin/master
wennHEAD
istmaster
), Wiedergabe (Kirsche-pick ) sie über dem Upstream-Zweig und verschieben dann die aktuelle Zweigreferenz, um auf das Ergebnis der Wiedergabe der Commits zu verweisen. Dadurch werden die Nicht-Merge-Commits effektiv auf das letzte Upstream-Commit verschoben, wodurch die durch verursachte Zusammenführung entfälltgit pull
.Wenn Sie ein absichtliches Zusammenführungs-Commit haben, möchten Sie es nicht ausführen,
git rebase @{u}
da es alles aus dem anderen Zweig wiedergibt. Der Umgang mit diesem Fall ist wesentlich komplizierter, weshalb es gut ist, ihn zu verwendengit up
undgit pull
insgesamt zu vermeiden . Sie müssen wahrscheinlich verwendenreset
, um die vonpull
und erstellte Zusammenführung rückgängig zu machengit rebase -p @{u}
. Das-p
Argumentgit rebase
, dass es für mich nicht zuverlässig funktioniert hat, muss möglicherweise verwendet werdenreset
, um die absichtliche Zusammenführung rückgängig zu machen, Ihren lokalen Zweig auf zu aktualisieren@{u}
und dann die absichtliche Zusammenführung zu wiederholen (was bei vielen haarigen Zusammenführungen schmerzhaft ist Konflikte).quelle
-p
. Ich habe es vorher vermieden, es zu empfehlen, weil es nicht sehr oft benötigt wird und sein Verhalten nicht gut dokumentiert ist.git remote update -p
undgit fetch
?git remote update -p
ist das gleiche wiegit fetch --all -p
. Ich habe mir angewöhnt,git remote update -p
zurück zu verwenden, wennfetch
ich keine-p
Option hatte.Das sollte es tun. Oder wenn Sie weiterhin Pull verwenden möchten
Sie können diesen Zweig auch in Ihrer Konfiguration so einrichten, dass er automatisch neu basiert, oder für alle anderen zukünftigen Tracking-Zweige, die Sie erstellen, automatisch so eingerichtet werden. Dann können Sie wieder nur mit verwenden
Mehr dazu im Abschnitt "Mit Rebase ziehen statt zusammenführen" auf dieser Seite:
http://mislav.uniqpath.com/2010/07/git-tips/
quelle