Ein neuer Zweig von master
wird erstellt, wir nennen es test
.
Es gibt mehrere Entwickler, die sich entweder zu master
anderen Zweigen verpflichten oder diese erstellen und später zusammenführen master
.
Nehmen wir an, die Arbeit test
dauert mehrere Tage und Sie möchten ständig über die darin enthaltenen test
Commits informiert werden master
.
Ich tun würde , git pull origin master
aus test
.
Frage 1: Ist das der richtige Ansatz? Andere Entwickler hätten leicht an denselben Dateien arbeiten können wie ich übrigens.
Meine Arbeit test
ist erledigt und ich bin bereit, sie wieder zusammenzuführen master
. Hier sind die zwei Möglichkeiten, die ich mir vorstellen kann:
EIN:
git checkout test
git pull origin master
git push origin test
git checkout master
git pull origin test
B:
git checkout test
git pull origin master
git checkout master
git merge test
Ich verwende es nicht, --rebase
da Rebase nach meinem Verständnis die Änderungen abruft master
und meine darüber stapelt, sodass Änderungen, die von anderen Personen vorgenommen wurden, überschrieben werden können.
Frage 2: Welche dieser beiden Methoden ist richtig? Was ist der Unterschied dort?
Das Ziel bei all dem ist es, meinen test
Zweig über die Ereignisse master
auf dem master
Laufenden zu halten, und später könnte ich sie wieder zusammenführen , um die Zeitachse so linear wie möglich zu halten.
Antworten:
Wie würde ich das machen?
Wenn ich einen lokalen Zweig von einem entfernten Zweig habe, kann ich andere Zweige als diesen nicht mit dem entfernten zusammenführen. Außerdem würde ich meine Änderungen nicht pushen, bis ich mit dem, was ich pushen möchte, zufrieden bin und ich würde überhaupt keine Dinge pushen, die nur für mich und mein lokales Repository sind. In Ihrer Beschreibung scheint das
test
nur für Sie zu sein? Also kein Grund, es zu veröffentlichen.git versucht immer, deine und andere Veränderungen zu respektieren, und das wird auch so sein
--rebase
. Ich glaube nicht, dass ich es angemessen erklären kann, also schauen Sie sich das Git-Buch an - Rebasing oder git-ready: Einführung in die Neugründung für eine kleine Beschreibung. Es ist eine ziemlich coole Funktionquelle
git merge test
gibt mirfatal: 'test' does not point to a commit
. Ich muss nach dem Festschreibungspunkt imgit log
Testzweig suchen , zurück zum Hauptzweig wechseln und dann tungit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
muss der Zweig existieren. Natürlich können Sie stattdessen den Commit-Hash verwenden, aber normalerweise ist es einfacher, den Zweignamen zu verwenden. Intern wird nur der Hash desHEAD
Zweigs abgerufen .Dies ist eine sehr praktische Frage, aber alle obigen Antworten sind nicht praktisch.
Mögen
Dieser Ansatz hat zwei Probleme :
Es ist unsicher, da wir nicht wissen, ob es Konflikte zwischen Testzweig und Hauptzweig gibt.
Es würde alle Test-Commits zu einem Merge-Commit für den Master "zusammenpressen". Das heißt, auf dem Hauptzweig können nicht alle Änderungsprotokolle des Testzweigs angezeigt werden.
Wenn wir also vermuten, dass es zu Konflikten kommen könnte, können wir folgende Git-Operationen durchführen:
Testen Sie
merge
vorhercommit
, vermeiden Sie ein schnelles Festschreiben durch--no-ff
,Wenn ein Konflikt auftritt, können wir
git status
Details zu den Konflikten überprüfen und versuchen, sie zu lösenSobald wir die Konflikte gelöst haben oder wenn es keinen Konflikt gibt, sind wir
commit
undpush
sieAuf diese Weise geht jedoch der im Testzweig protokollierte Änderungsverlauf verloren, und es würde für andere Entwickler schwierig sein, den Verlauf des Projekts zu verstehen.
Die beste Methode ist also, dass wir
rebase
statt verwenden müssenmerge
(nehmen wir an, wenn wir in dieser Zeit die Verzweigungskonflikte gelöst haben).Im Folgenden finden Sie ein einfaches Beispiel für erweiterte Vorgänge unter http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Ja, wenn Sie das Obermaterial fertig haben, werden alle Commits des Testzweigs auf den Kopf des Hauptzweigs verschoben. Der Hauptvorteil der Neubasierung besteht darin, dass Sie eine lineare und viel sauberere Projekthistorie erhalten.
Das einzige, was Sie vermeiden müssen, ist: Verwenden Sie es niemals
rebase
in öffentlichen Zweigen wie dem Hauptzweig.Führen Sie niemals Operationen wie die folgenden aus:
Details zu https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
Blinddarm:
quelle
Weder eine Neueinstellung noch eine Zusammenführung sollten Änderungen überschreiben (es sei denn, Sie entscheiden sich bei der Lösung eines Konflikts dafür).
Der übliche Ansatz bei der Entwicklung ist
Wenn Sie bereit sind, wieder zum Master zu wechseln,
Wenn Sie sich Sorgen machen, etwas bei der Zusammenführung zu brechen,
git merge --abort
ist es für Sie da.Push und dann Pull als Mittel zum Zusammenführen zu verwenden, ist dumm. Ich bin mir auch nicht sicher, warum Sie den Test zum Ursprung bringen.
quelle
git stash
ist für.Ich würde zuerst den zu verschmelzenden Zweig so sauber wie möglich machen. Führen Sie Ihre Tests aus und stellen Sie sicher, dass der Status Ihren Wünschen entspricht. Bereinigen Sie die neuen Commits mit Git Squash .
Neben der Antwort von KingCrunches empfehle ich die Verwendung
Möglicherweise haben Sie in der anderen Verzweigung viele Festschreibungen vorgenommen. Dies sollte nur eine Festschreibung in der Hauptverzweigung sein. Um den Commit-Verlauf so sauber wie möglich zu halten, möchten Sie möglicherweise alle Ihre Commits aus dem Testzweig in einem Commit im Master-Zweig zusammenfassen (siehe auch: Git: Squash oder nicht Squash? ). Dann können Sie die Commit-Nachricht auch in etwas sehr Ausdrucksstarkes umschreiben. Etwas, das leicht zu lesen und zu verstehen ist, ohne sich in den Code zu vertiefen.
edit: Das könnte dich interessieren
Auf GitHub mache ich am Ende Folgendes für einen Feature-Zweig
mybranch
:Holen Sie sich das Neueste vom Ursprung
Suchen Sie den Merge-Basis-Hash:
Stellen Sie jetzt sicher, dass nur der erste ist
pick
, der Rest ists
:Als nächstes wählen Sie eine sehr gute Commit-Nachricht und drücken Sie auf GitHub. Stellen Sie dann die Pull-Anfrage.
Nach dem Zusammenführen der Pull-Anforderung können Sie sie lokal löschen:
und auf GitHub
quelle
Alter Thread, aber ich habe meinen Weg nicht gefunden . Dies kann für jemanden von Nutzen sein, der mit Rebase arbeitet und alle Commits aus einem (Feature-) Zweig über Master zusammenführen möchte. Wenn unterwegs ein Konflikt vorliegt, können Sie diesen für jedes Commit lösen. Sie behalten während des Vorgangs die volle Kontrolle und können jederzeit abbrechen.
Holen Sie sich Master und Branch auf den neuesten Stand:
Zweig über Master zusammenführen:
Optional: Wenn Sie während der Rebase auf Konflikte stoßen:
Lösen Sie zunächst den Konflikt in der Datei. Dann:
Schieben Sie Ihren neu basierten Zweig:
Jetzt haben Sie zwei Möglichkeiten:
Erledigt.
quelle
Dies ist der Workflow, den ich bei meiner Arbeit mit dem Team verwende. Das Szenario ist wie von Ihnen beschrieben. Erstens, wenn ich mit der Arbeit fertig
test
bin, stelle ich die Basis mit dem Master wieder her, um alles einzuziehen, was während der Zeit, in der ich an dertest
Verzweigung gearbeitet habe, dem Master hinzugefügt wurde .git pull -r upstream master
Dadurch werden die Änderungen an Master übertragen, seit Sie die gegabelt haben
test
Zweig und angewendet haben. Anschließend werden die Änderungen angewendet, die Sie vorgenommen haben, um "über" den aktuellen Status des Masters zu testen. Hier kann es zu Konflikten kommen, wenn die anderen Personen Änderungen an denselben Dateien vorgenommen haben, die Sie im Test bearbeitet haben. Wenn dies der Fall ist, müssen Sie diese manuell beheben und festschreiben. Sobald Sie dies getan haben, können Sie problemlos zum Hauptzweig wechseln undtest
problemlos zusammenführen.quelle
Wenn die Datei nach dem Zusammenführen geändert wird, wird beim Zusammenführen der Fehler "Konflikt lösen" angezeigt.
Dann müssen Sie zuerst alle Ihre Konflikte lösen, dann müssen Sie erneut alle Ihre Änderungen festschreiben und dann pushen
Dies ist besser, wenn Sie Änderungen im Testzweig vorgenommen haben, da er wusste, welche Änderungen er vorgenommen hat.
quelle
Ich würde die Rebase-Methode verwenden. Meistens, weil es Ihren Fall semantisch perfekt widerspiegelt, dh. Was Sie tun möchten, ist, den Status Ihres aktuellen Zweigs zu aktualisieren und so zu tun, als ob er auf dem neuesten basiert.
Also, ohne auch nur auszuchecken
master
, würde ich:Nur das Abrufen vom Ursprung aktualisiert natürlich nicht Ihren lokalen Status
master
(da keine Zusammenführung durchgeführt wird), aber es ist für unseren Zweck vollkommen in Ordnung - wir möchten das Umschalten vermeiden, um Zeit zu sparen.quelle
Die Antwort von @ KingCrunch sollte in vielen Fällen funktionieren. Ein Problem, das auftreten kann, ist, dass Sie sich möglicherweise auf einem anderen Computer befinden, der das Neueste aus dem Test ziehen muss. Daher empfehle ich, zuerst den Test zu ziehen. Die Revision sieht folgendermaßen aus:
quelle
Sie müssen den Zweig zum Ziehen auschecken lassen, da das Ziehen das Zusammenführen mit dem Master bedeutet und Sie einen Arbeitsbaum zum Zusammenführen benötigen.
Keine Notwendigkeit, zuerst auszuchecken; rebase macht mit zwei Argumenten das Richtige
git push schiebt standardmäßig alle Zweige, die hier und auf der Fernbedienung vorhanden sind
quelle
Da der Titel "Best way" lautet, halte ich es für eine gute Idee, die Strategie der Geduldzusammenführung in Betracht zu ziehen .
Von: https://git-scm.com/docs/merge-strategies
Verwendungszweck:
Git Alias
Ich benutze dafür immer einen Alias, zB einmal ausführen:
Jetzt könnten Sie tun:
quelle
Dies ist von GitLab: Folgen Sie einfach den Anweisungen:
quelle
Ich werde gemäß Entwicklungs- und Feature-Zweigen antworten.
Wenn Sie sich im Feature-Zweig befinden und ihn mit Develop aktualisieren müssen, verwenden Sie die folgenden Befehle: Git Checkout Develop Git Pull Git Checkout Feature / XYZ Git Merge Develop
Jetzt wird Ihre Funktion mit der Entwicklung aktualisiert. Sie können Ihre Änderungen übernehmen.
quelle