Was ist die beste (und sicherste) Weg, um ein merge Git branch in den master?
Einen neuen Zweig von master
erstellt wird, nennen wir es test
.
Es gibt mehrere Entwickler, die entweder verpflichten master
erstellen oder andere Zweige und später verschmelzen master
.
Sagen wir, die Arbeit an test
ist, mehrere Tage, und Sie wollen ständig test
aktualisiert begeht innen master
.
Ich tun würde git pull origin master
aus test
.
Frage 1: Ist das der richtige Ansatz? Andere Entwickler könnten leicht haben gearbeitet auf den gleichen Dateien wie ich gearbeitet habe, btw.
Meine Arbeit auf test
ist getan und ich bin bereit, es zu verschmelzen wieder zu master
. Hier sind die zwei Möglichkeiten, die ich denken kann:
A:
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 bin nicht mit --rebase
weil von meinem Verständnis, Stellungswechsel, erhalten die änderungen von master
- und stack-mine auf der Oberseite, die daher könnte es überschreiben änderungen, die andere Menschen gemacht.
Frage 2: Welche dieser beiden Methoden ist die richtige? Was ist der Unterschied da?
Das Ziel ist, um meine test
branch aktualisiert die Dinge im master
und später konnte ich Sie Zusammenführen wieder in master
in der Hoffnung zu halten, die timeline so linear wie möglich.
- Nein.. Stellungswechsel überschreiben Sie niemals, es ist nur versuchen, zu erreichen, ein sauberer Verlauf. durch anfügen(oder fake) die Geschichte der späten Punkt der master
- Stellungswechsel nicht überschrieben verpflichtet. Es macht Ihr begeht, gilt der commits in den master-Zweig in den test-Zweig, dann gilt deine commits zu testen.
- was wenn beim git pull origin master erhalten Sie "sich weigern zu verschmelzen, nicht verwandten Geschichten" ... aber Sie wirklich brauchen, um zusammenzuführen, was in master in Ihrem "test" - Zweig (ist das möglich/sinnvoll?)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie würde ich dies tun
Wenn ich einen lokalen branch aus einem entfernten, ich fühle mich nicht wohl mit der Zusammenführung der anderen Zweige als diese mit der Fernbedienung. Ich würde auch nicht drücken meine änderungen, bis ich glücklich bin mit dem, was ich möchte zu schieben und auch ich würde nicht schieben Dinge auf alle,, die sind nur für mich und meine lokalen repository. In Ihrer Beschreibung scheint es, dass
test
ist nur für Sie? Also kein Grund um es zu veröffentlichen.git immer bestrebt, Ihre und andere änderungen, und so wird
--rebase
. Ich glaube nicht, dass ich erklären kann, ist es angemessen, so haben Sie einen Blick auf das Git-Buch - Rebasierung oder git-ready: Intro in Rebase für eine kleine Beschreibung. Es ist ein ziemlich cooles featuregit merge test
gibt mirfatal: 'test' does not point to a commit
. Ich muss schauen ingit log
für die commit-Punkt auf dem test-Zweig, wechseln Sie zurück zum master-branch, dann tungit merge 0f37d3154abbf52a4cbbbb5109f08af6a7567234
.test
muss vorhanden sein. Sicher, man kann die commit-hash statt, aber es ist in der Regel einfacher, den Zweignamen. Intern ruft nur den hashHEAD
von der Branche.develop
und nur hotfixes (und vielleicht wichtige bugfixes) inmaster
. Dann werden Sie forward-port die hotfixes vondevelop
inmaster
(das ist technisch das, was Sie sagte). Allerdings, wenn es ist kein hotfix (das ist immer gut :)), danndevelop
ist immer vormaster
. Also ja, du hast Recht, aber je nach workflow ist es vielleicht einfach nicht nötig. (Ich habedevelop
hier, weil es mehr Gemeinsamkeiten alstest
).safest way
, so bin ich nicht sicher, wie sicher es ist, diese Befehle auszuführen, die in eine zufällige Verzweigung.git checkout master
. Vorausgesetzt, Sie Lesen gits Ausgabe sind Sie wahrscheinlich aufmaster
danach. Sie können auch sicher ausführengit checkout master
auf eine zufällige Verzweigung 🙂Dies ist eine sehr praktische Frage, aber alle Antworten sind nicht praktisch.
Wie
Dieser Ansatz hat zwei Fragen:
Es ist unsicher, weil wir nicht wissen, ob es irgendwelche Konflikte zwischen den test-branch und den master-Zweig.
Wäre es "squeeze" alle test verpflichtet sich, die in einer merge-commit auf master; das ist zu sagen auf dem master-branch, den wir nicht sehen können, die alle änderungsprotokolle zu den test-Zweig.
So, wenn wir vermuten, es würde einige Konflikte können wir mit folgenden git-Operationen:
Test
merge
vorcommit
zu vermeiden fast-forward commit von--no-ff
,Wenn der Konflikt aufgetreten ist, können wir
git status
zu überprüfen, die details über die Konflikte und versuchen Sie zu lösenEinmal lösen wir die Konflikte, oder wenn es keinen Konflikt gibt, wir
commit
undpush
SieAber auf diese Weise verlieren Sie den änderungsverlauf protokolliert im "test" - Zweig, und es würde die master-Zweig zu schwer für andere Entwickler zu verstehen, die Geschichte des Projekts.
Also die beste Methode ist, haben wir die Verwendung
rebase
stattmerge
(nehme an, wenn in dieser Zeit haben wir gelöst Zweig Konflikte).Folgenden ist ein einfaches Beispiel, für den erweiterten Operationen entnehmen Sie bitte http://git-scm.com/book/en/v2/Git-Branching-Rebasing
Yep, wenn du Oberteil gemacht, alle Test-branch-commits verschoben werden auf den Kopf des Master Zweiges. Der große Vorteil der rebasierung ist, dass Sie eine lineare und viel sauberer Projekt-Geschichte.
Die einzige Sache, die Sie vermeiden müssen, ist: verwenden Sie niemals
rebase
auf öffentlichen Zweig, wie der master-Zweig.Nie tun, operations wie folgt:
Details für https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing
Anhang:
git rebase --continue
. Ich schaffte es erfolgreich zusammenzuführen mein dev Zweig. Also ist Es jetzt sicher zu löschen, die dev-Zweig, wenn ich nicht mehr verwendet wird?Weder einen Stellungswechsel, noch einen merge überschreiben soll jemand die änderungen (es sei denn, Sie wählen, dies zu tun, wenn die Lösung eines Konflikts).
Ist die übliche Vorgehensweise bei der Entwicklung ist
Wenn Sie bereit sind, merge zurück in den master,
Wenn Sie besorgt über brechen etwas auf die merge
git merge --abort
ist für Sie da.Mit drücken und ziehen dann als Mittel der Zusammenführung ist albern. Ich bin mir auch nicht sicher, warum Sie schieben test zu origin.
git stash
ist für.git checkout test; git pull
stattgit merge origin/test
. Noch besser istgit pull --rebase
. Jedenfalls haben Sie vergessen, ziehen Sie den änderungen, so vorgit merge origin/test
sollten Siegit fetch origin test
(git fetch .. && git merge ..
ist genau das, wasgit pull ..
hat :))test
ist in eine andere Fernbedienung alsmaster
, ja. Aber da Sie in der Regel nur eine Fernbedienung, ziehen einmal aktualisiert werden und dann kann man nur Zusammenführen (oder rebase).Ich würde zuerst die zu-sein-verschmolzen Zweig so sauber wie möglich. Die tests auszuführen, stellen Sie sicher, dass der Staat wie Sie es wollen. Bereinigen Sie die neuen commits von git squash.
Neben KingCrunches Antwort, schlage ich
Die Sie gemacht haben könnte viele commits in den anderen Zweig, die nur einen commit in den master branch. Halten Sie die commit-Geschichte so sauber wie möglich, möchten Sie vielleicht zu zerquetschen alle Ihre übertragungen aus dem test-Zweig in einen commit in den master-Zweig (siehe auch: Git: squash ist oder nicht zum squash?). Dann können Sie auch schreiben der commit-Nachricht zu etwas sehr ausdrucksstark. Etwas, das einfach zu Lesen und zu verstehen, ohne zu Graben in den code ein.
edit: vielleicht interessiert
Damit auf GitHub, ich am Ende tut das folgende für einen feature-branch
mybranch
:Holen Sie sich die neuesten, von Herkunft
Finden Sie die merge-base-hash:
Stellen Sie sicher, dass nur die erste
pick
, der rest ists
:Wählen Sie als Nächstes eine sehr gute commit-Nachricht und drücken Sie auf GitHub. Stellen Sie die pull-Anforderung.
Nach dem Zusammenführen der pull-request, Sie können es löschen, lokal:
und auf GitHub
Dies ist der workflow, den ich bei meiner Arbeit mit dem team. Das Szenario ist wie du Sie beschrieben hast. Erste, wenn ich fertig bin arbeiten auf
test
ich Stellungswechsel mit master zu ziehen, was wurde Hinzugefügt, um master-während der Zeit habe ich gearbeitet, auf dertest
Zweig.git pull -r upstream master
Diese ziehen, die Veränderungen zu meistern, da Sie Gabel-die
test
Filiale und wenden Sie Sie, und wenden Sie dann die änderungen, die Sie vorgenommen haben, zu testen "über" den aktuellen Stand der Meister. Gibt es Konflikte hier, wenn die anderen Leute gemacht haben, änderungen an den gleichen Dateien, die du bearbeitet hast im test. Wenn ja, haben Sie, um Sie zu beheben, manuell, und Begehen. Sobald Sie das getan haben, werden Sie gut zu wechseln, um den master branch und mergetest
mit keine Probleme.Alten thread, aber ich habe noch nicht meinen Weg gefunden, es zu tun. Es könnte wertvoll sein für jemanden, der arbeitet mit Stellungswechsel und will alle Zusammenführen, die commits aus einem branch auf der Oberseite des master. Wenn es einen Konflikt gibt einem die Art und Weise, Sie können Sie zu lösen für jeden commit.
Bekommen Master und Branch up-to-date:
Merge Branch auf der Oberseite der Meister:
, Wenn Sie in Konflikte, die während des Rebase:
Erste, Konflikte lösen in der Datei. Dann:
Einmal Stellungswechsel fertig, Stellungswechsel Filiale auf der Oberseite des master:
Nach der Zusammenführung, wenn die Datei geändert wird, dann, wenn Sie Zusammenführen, es werden durch die Fehler von "Konflikte Lösen"
So, dann müssen Sie zuerst beheben Sie alle Konflikte, dann haben Sie wieder verpflichten, alle Ihre änderungen, und drücken Sie dann
Ist dies besser tun, die getan hat, änderungen in den test-Zweig, weil er wusste, welche änderungen er gemacht hat.
Ich würde das rebase-Methode. Vor allem, weil es spiegelt perfekt Ihren Fall semantisch, dh. was Sie tun möchten, ist zu aktualisieren, den Status Ihrer aktuellen Zweig und "so tun," als ob es auf der Grundlage der neuesten.
So, sogar ohne Check-out
master
würde ich:Natürlich, nur das abrufen von origin nicht aktualisieren den lokalen Zustand Ihrer
master
(da Sie nicht führen Sie eine merge), aber es ist vollkommen ok für unseren Zweck - wir wollen vermeiden, schalten um, für den Willen, Zeit zu sparen.