Ich habe zwei Zweige, nämlich master
und development
in einem GitHub-Repository. Ich mache meine ganze Entwicklung in der Entwicklungsbranche wie gezeigt.
git branch development
git add *
git commit -m "My initial commit message"
git Push -u Origin development
Jetzt möchte ich alle Änderungen am Zweig development
in den master
einbinden. Mein aktueller Ansatz ist:
git checkout master
git merge development
git Push -u Origin master
Bitte lassen Sie mich wissen, ob das von mir verfolgte Verfahren korrekt ist.
Generell möchte ich master
zuerst mit der development
zusammenführen, damit ich im Konfliktfall den development
-Zweig selbst auflösen kann und meine master
sauber bleibt.
(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)
Es gibt keinen großen Unterschied zwischen den beiden Ansätzen, aber ich habe manchmal bemerkt, dass ich den Zweig nach dem Zusammenführen noch nicht in master
zusammenführen möchte, oder dass noch mehr Arbeit zu erledigen ist, bevor diese möglich sind zusammengeführt, so neige ich dazu, master
bis zum endgültigen Zeug unberührt zu lassen.
BEARBEITEN: Aus Kommentaren
Wenn Sie nachverfolgen möchten, wer wann die Zusammenführung durchgeführt hat, können Sie beim Zusammenführen das Flag --no-ff
verwenden. Dies ist im Allgemeinen nur beim Zusammenführen von development
in master
(letzter Schritt) hilfreich, da Sie master
möglicherweise mehrfach in development
(erster Schritt) in Ihrem Workflow zusammenführen müssen, und das Erstellen eines Commit-Knotens dafür möglicherweise nicht sehr nützlich ist.
git merge --no-ff development
Persönlich ist meine Herangehensweise Ihrer, mit ein paar mehr Ästen und einigen Kompromissen beim Commit, wenn sie zurück zum Master gehen.
Einer meiner Kollegen mag es nicht, die Filiale so sehr zu wechseln, und bleibt in der Entwicklungsbranche, ähnlich wie die folgenden, die alle aus der Entwicklungsbranche ausgeführt werden.
git fetch Origin master
git merge master
git Push Origin development:master
Die erste Zeile stellt sicher, dass er Upstream-Commits hat, die seit der letzten Aktualisierung seines lokalen Repositorys zu meistern sind.
Der zweite zieht diese Änderungen (falls vorhanden) vom Master in die Entwicklung
Der dritte drückt den Entwicklungszweig (jetzt vollständig mit Master verschmolzen) auf Origin/Master.
Ich habe vielleicht etwas falsch an seinem grundlegenden Workflow, aber das ist der Hauptaspekt.
Es wäre großartig, wenn Sie den Git Flow-Workflow verwenden können. Es kann leicht Entwicklungszweig in Master zusammenführen.
Sie möchten einfach die hier erwähnte Git Flow-Anweisung befolgen:
http://danielkummer.github.io/git-flow-cheatsheet/
schritte:
Überprüfen Sie den obigen Link für weitere Informationen.
Erklärung von unten für diejenigen, die ohne Kenntnis von Zweigen hierher gekommen sind.
Grundlegende Logik für die Entwicklung von Hauptzweigen ist: Sie arbeiten nur an anderen Zweigen und verwenden Master nur, um andere Zweige zusammenzuführen.
Sie beginnen auf diese Weise einen neuen Zweig zu erstellen:
1) Klonen Sie das benötigte Repository in Ihrem Webstamm:
$ cd /var/www
$ git clone [email protected]:user_name/repository_name.git
2) Erstellen Sie einen neuen Zweig. Es enthält die neuesten Dateien Ihres Master-Zweig-Repositorys
$ git branch new_branch
3) Ändern Sie den Git-Zweig in die neue_Branche
$ git checkout new_branch
4) Kodieren, wie üblich ...
$ git add .
$ git commit -m “Initial commit”
$ git Push (pushes commits only to “new_branch”)
5) Wenn der Job in diesem Zweig abgeschlossen ist, fügen Sie ihn mit dem Zweig "Master" zusammen:
$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git Push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)
Ja, das ist richtig, aber es sieht aus wie ein sehr einfacher Workflow, in dem Sie Änderungen nur zwischenspeichern, bevor sie für die Integration bereit sind. Sie sollten in fortgeschrittenere Workflows die git unterstützt. Der Zweigzweig -Ansatz, mit dem Sie parallel an mehreren Features arbeiten können, oder der Graduierungsansatz , der Ihren aktuellen Workflow etwas erweitert.
git Pull (aktueller Entwicklungszweig)
git Checkout-Master
git ziehen
git Merge Entwicklung
git Drücken Sie den Origin-Master
Wenn Sie mit Mac oder Ubuntu arbeiten, wechseln Sie in den Arbeitsordner der Zweigstelle. Im Terminal
nehmen wir an, harisdev ist der Filialname.
git checkout master
wenn nicht oder nicht festgeschriebene Dateien vorhanden sind, wird ein Fehler angezeigt, und Sie müssen alle nicht erfassten oder nicht festgeschriebenen Dateien festschreiben oder löschen.
git merge harisdev
git Push Origin master
Ein letzter Befehl, um den Zweig zu löschen.
$ git branch -d harisdev
So mache ich es normalerweise. Stellen Sie zunächst sicher, dass Sie bereit sind, Ihre Änderungen in master einzufügen.
git fetch
, ob die Entwicklung mit den neuesten Änderungen von Ihrem Remote-Server auf dem neuesten Stand ist.git checkout master
.git pull
ausführen.git merge development
beginnen.git Push -u Origin master
und Sie sind fertig.Mehr zum Thema git - Zusammenführen finden Sie im Artikel.
Schritt 1
Erstellen Sie einen neuen "dev" -Zweig, in dem Ihre lokalen Git-Dateien mit dem Remote-Server synchronisiert sind, der "dev" -Zweig jedoch noch nicht vorhanden ist.
git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git Push --set-upstream Origin dev # Push the "dev" branch to the remote.
Schritt 2
Nehmen Sie Ihre Änderungen am Zweig "dev" vor (Ihren aktuellen Status, wenn Sie Schritt 1 befolgen), bestätigen Sie und legen Sie sie dem entfernten Zweig "dev" vor.
git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git Push -u Origin dev # Push the changes to the remote, -u Origin dev is optional but good to use.
Schritt 3
Fügen Sie Ihren "dev" -Zweig in den "Master" ein.
git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.
1) Prüfen Sie den git-Status in der Zweigentwicklung mit folgendem Befehl:
git status
Es sollte keinen nicht festgeschriebenen Code geben. Wenn ja, geben Sie Ihren Code in den Zweig "Entwicklung" ein:
git add *
git commit -m "My initial commit message"
git Push Origin Development
2) Führen Sie im Entwicklungszweig die folgenden zwei Befehle aus:
git branch -f master HEAD
git Push -f Origin master
Es wird Ihren Entwicklungszweigcode an den Hauptzweig übertragen.
Basierend auf @Sailesh und @DavidCulp:
(on branch development)
$ git fetch Origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)
Mit dem ersten Befehl stellen Sie sicher, dass Sie alle Upstream-Commits für den Remote-Master festgelegt haben. Die Antwort von Sailesh würde nicht auftreten.
Die zweite führt eine Zusammenführung durch und erzeugt Konflikte, die Sie dann lösen können.
Danach können Sie den Master abschließen, um zum Master zu wechseln.
Dann mischen Sie den Entwicklungszweig auf den lokalen Master. Das no-ff-Flag erstellt einen Commit-Knoten im Master, damit die gesamte Zusammenführung verfolgt werden kann.
Danach können Sie Ihre Zusammenführung festlegen und verschieben.
Durch dieses Verfahren wird sichergestellt, dass es ein Zusammenführungsengagement von der Entwicklung zum Master gibt, das die Benutzer sehen können. Wenn sie sich also den Entwicklungszweig ansehen, können sie die einzelnen Verpflichtungen sehen, die Sie während der Entwicklung für diesen Zweig gemacht haben.
Optional können Sie das Zusammenführungs-Commit vor dem Push-Befehl ändern, wenn Sie eine Zusammenfassung der Aktivitäten im Entwicklungszweig hinzufügen möchten.
BEARBEITEN: meine ursprüngliche Antwort schlug einen git merge master
vor, der nichts getan hat. Es ist besser, git merge FETCH_HEAD
nach dem Abrufen des Origin/Masters auszuführen
Sobald Sie den Entwicklungszweig ausgecheckt haben, ...
git add .
git commit -m "first commit"
git Push Origin dev
git merge master
git checkout master
git merge dev
git Push Origin master
Wenn Sie Gerrit verwenden, funktionieren die folgenden Befehle einwandfrei.
git checkout master
git merge --no-ff development
Sie können mit der Standard-Festschreibungsmeldung speichern. Stellen Sie sicher, dass die Änderungs-ID generiert wurde. Sie können den folgenden Befehl verwenden, um dies sicherzustellen.
git commit --amend
Dann drücken Sie mit dem folgenden Befehl.
git Push Origin HEAD:refs/for/refs/heads/master
Möglicherweise wird eine Fehlermeldung wie die folgende angezeigt.
! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)
Um dies zu beheben, muss der Gerrit-Projektadministrator in Gerrit einen weiteren Verweis mit dem Namen "refs/for/refs/heads/master" oder "refs/for/refs/heads/*" erstellen (der in Zukunft alle Zweige abdecken wird). Erteilen Sie dann dieser Referenz die Berechtigung "Push Merge Commit" und bei Bedarf die Berechtigung "Submit", um die GCR einzureichen.
Versuchen Sie nun den obigen Push-Befehl erneut und er sollte funktionieren.
Credits:
https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit
Ich denke die einfachste Lösung wäre
git checkout master
git remote update
git merge Origin/Develop -X theirs
git commit -m commit -m "New release"
git Push --recurse-submodules=check --progress "Origin" refs/heads/Master
Dies bewahrt auch die Geschichte aller in Gebrauch befindlichen Zweige