Frage Bester (und sicherster) Weg, eine Git-Verzweigung in den Master zu integrieren


Eine neue Filiale von master ist geschaffen, wir nennen es test.

Es gibt mehrere Entwickler, die sich entweder verpflichten master oder andere Zweige erstellen und später zusammenführen master.

Sagen wir mal weiter test dauert mehrere Tage und du willst sie andauernd behalten test mit internen Commits aktualisiert master.

Ich würde es tun git pull origin master von test.

Frage 1: Ist das der richtige Ansatz? Andere Entwickler hätten problemlos an den gleichen Dateien arbeiten können, an denen ich auch gearbeitet habe.


Meine Arbeit an test ist fertig und ich bin bereit, es wieder zu verbinden 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 benutze nicht --rebase weil von meinem Verständnis, Rebase wird die Änderungen von bekommen master und stapelt meine darüber, so dass es Änderungen, die andere Leute gemacht haben, überschreiben könnte.

Frage 2: Welche dieser beiden Methoden ist richtig? Was ist der Unterschied dort?

Das Ziel in all dem ist es, meine test Zweig aktualisiert mit den Dingen, die passieren master und später könnte ich sie wieder zusammenführen master in der Hoffnung, die Zeitleiste so linear wie möglich zu halten.


1463
2018-04-09 00:01


Ursprung


Antworten:


Wie ich das machen würde

git checkout master
git pull origin master
git merge test
git push origin master

Wenn ich einen lokalen Zweig von einem entfernten Zweig habe, fühle ich mich nicht wohl damit, andere Zweige als diesen mit der Fernbedienung zu verbinden. Auch würde ich meine Änderungen nicht vorantreiben, bis ich mit dem, was ich pushen möchte, zufrieden bin und auch keine Dinge schieben würde, die nur für mich und mein lokales Repository sind. In Ihrer Beschreibung scheint es, dass test ist nur für dich? Also kein Grund, es zu veröffentlichen.

Git versucht immer, deine und andere zu respektieren, und das wird auch so sein --rebase. Ich denke nicht, dass ich es angemessen erklären kann, also schau es dir an das Git Buch - Rebasing oder git-ready: Einführung in die Umbasierung für eine kleine Beschreibung. Es ist eine ziemlich coole Funktion


2158
2018-04-09 00:45



Dies ist eine sehr praktische Frage, aber alle obigen Antworten sind nicht praktikabel.

Mögen

git checkout master
git pull origin master
git merge test
git push origin master

Dieser Ansatz hat zwei Probleme:

  1. Es ist unsicher, weil wir nicht wissen, ob es Konflikte zwischen Test-Zweig und Master-Zweig gibt.

  2. Es würde alle Test Commits in einen Merge Commit auf Master "quetschen"; das heißt, im Master-Zweig können wir die Protokolle für alle Änderungen des Testzweiges nicht sehen.

Also, wenn wir vermuten, dass es Konflikte geben könnte, können wir folgende Git Operationen haben:

git checkout test
git pull 
git checkout master
git pull
git merge --no-ff --no-commit test

Prüfung merge Vor commitVermeiden Sie einen Fast-Forward-Commit von --no-ff,

Wenn ein Konflikt auftritt, können wir laufen git status Details zu den Konflikten prüfen und versuchen zu lösen

git status

Sobald wir die Konflikte gelöst haben, oder wenn es keinen Konflikt gibt, werden wir commit und push Sie

git commit -m 'merge test branch'
git push

Auf diese Weise wird jedoch der Änderungsverlauf verloren, der im Testzweig protokolliert wurde, und der Master-Zweig würde für andere Entwickler schwierig werden, den Verlauf des Projekts zu verstehen.

Also die beste Methode, die wir verwenden müssen rebase Anstatt von merge (Angenommen, in dieser Zeit haben wir die Verzweigungskonflikte gelöst).

Im Folgenden finden Sie ein einfaches Beispiel für fortgeschrittene Operationen http://git-scm.com/book/en/v2/Git-Branching-Rebasing

git checkout master
git pull
git checkout test
git pull
git rebase -i master
git checkout master
git merge test

Ja, wenn Sie einen Uppers gemacht haben, werden alle Commits des Test-Zweiges auf den Kopf des Master-Zweigs verschoben. Der Hauptvorteil von Rebasing ist, dass Sie eine lineare und viel sauberere Projekthistorie erhalten.

Das einzige, was Sie vermeiden müssen, ist: niemals benutzen rebase in der öffentlichen Branche, wie Master-Zweig.

wie folgende Operation:

git checkout master
git rebase -i test

Mach niemals diese Operationen.

Details für https://www.atlassian.com/git/tutorials/merging-vs-rebasing/the-golden-rule-of-rebasing

Blinddarm:


260
2018-03-14 12:13



Weder eine Rebase noch eine Zusammenführung sollte die Änderungen von irgendjemand überschreiben (es sei denn, Sie wählen dies, wenn Sie einen Konflikt lösen).

Der übliche Ansatz während der Entwicklung ist

git checkout master
git pull
git checkout test
git log master.. # if you're curious
git merge origin/test # to update your local test from the fetch in the pull earlier

Wenn du bereit bist, wieder zum Master zu werden,

git checkout master
git log ..test # if you're curious
git merge test
git push

Wenn du dir Sorgen machst, dass bei der Zusammenführung etwas kaputt geht, git merge --abort ist für dich da.

Drücken und dann ziehen als ein Mittel zum Zusammenführen ist albern. Ich bin mir auch nicht sicher, warum Sie den Test auf den Ursprung drängen.


73
2018-04-10 00:17



Außerdem KingCrunches antwortet, Schlage ich vor zu verwenden

git checkout master
git pull origin master
git merge --squash test
git commit
git push origin master

Möglicherweise haben Sie im anderen Zweig viele Commits gemacht, was nur ein Commit im Master-Zweig sein sollte. Um den Commit-Verlauf so sauber wie möglich zu halten, sollten Sie alle Ihre Commits aus dem Test-Zweig in einen Commit im Master-Zweig zerlegen (siehe auch: Git: Squash oder nicht Squash?). Dann können Sie die Commit-Nachricht auch in etwas sehr Ausdrucksvolles umschreiben. Etwas, das leicht zu lesen und zu verstehen ist, ohne den Code zu untersuchen.

Bearbeiten: Das könnte Sie interessieren

Auf GitHub mache ich das folgende für einen Feature-Zweig mybranch:

Holen Sie sich das Neueste vom Ursprung

$ git checkout master
$ git pull origin master

Finde den Merge-Base-Hash:

$ git merge-base mybranch master
c193ea5e11f5699ae1f58b5b7029d1097395196f

$ git checkout mybranch
$ git rebase -i c193ea5e11f5699ae1f58b5b7029d1097395196f

Jetzt stelle sicher, dass nur der erste ist pick, Der Rest ist s:

pick 00f1e76 Add first draft of the Pflichtenheft
s d1c84b6 Update to two class problem
s 7486cd8 Explain steps better

Wählen Sie als Nächstes eine sehr gute Commit-Nachricht und drücken Sie auf GitHub. Mach die Pull-Anfrage dann.

Nach dem Zusammenführen der Pull-Anforderung können Sie sie lokal löschen:

$ git branch -d mybranch

und auf GitHub

$ git push origin :mybranch

20
2018-04-21 08:18



Dies ist der Workflow, den ich bei meiner Arbeit mit dem Team verwende. Das Szenario ist wie beschrieben. Erstens, wenn ich fertig bin test Ich habe mich mit dem Master neu angemeldet, um alles hinzuzuziehen, was während der Zeit, in der ich an der test Ast.

git pull -r upstream master

Dies wird die Änderungen an Master ziehen, da du die Gabeln gegabelt hast test Verzweigen Sie und wenden Sie sie an, und wenden Sie dann die Änderungen an, die Sie vorgenommen haben, um "über" dem aktuellen Status des Masters zu testen. Hier können Konflikte auftreten, wenn die anderen Personen Änderungen an denselben Dateien vorgenommen haben, die Sie im Test bearbeitet haben. Wenn dies der Fall ist, müssen Sie sie manuell beheben und festschreiben. Sobald Sie das getan haben, werden Sie gut in den Master-Zweig wechseln und zusammenführen testin ohne Probleme.


3
2018-03-16 22:27



git checkout master
git pull origin master
# Merge branch test into master
git merge test

Nach dem Zusammenführen, wenn die Datei 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 alle Ihre Änderungen erneut bestätigen und dann drücken

git push origin master

Das ist besser, wer Änderungen in der Testbranche vorgenommen hat, weil er wusste, welche Änderungen er vorgenommen hat.


1
2018-04-07 08:55