Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 keine Änderungen
-
2.51.0
2025-08-18
- 2.50.1 keine Änderungen
-
2.50.0
2025-06-16
- 2.49.1 keine Änderungen
-
2.49.0
2025-03-14
- 2.47.1 → 2.48.2 keine Änderungen
-
2.47.0
2024-10-06
- 2.43.2 → 2.46.4 keine Änderungen
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 keine Änderungen
-
2.42.0
2023-08-21
- 2.39.4 → 2.41.3 keine Änderungen
-
2.39.3
2023-04-17
- 2.38.1 → 2.39.2 keine Änderungen
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 keine Änderungen
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 keine Änderungen
-
2.34.0
2021-11-15
- 2.33.2 → 2.33.8 keine Änderungen
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.30.1 → 2.32.7 keine Änderungen
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 keine Änderungen
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 keine Änderungen
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 keine Änderungen
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 keine Änderungen
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 keine Änderungen
-
2.23.0
2019-08-16
- 2.22.2 → 2.22.5 keine Änderungen
-
2.22.1
2019-08-11
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 keine Änderungen
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 keine Änderungen
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 keine Änderungen
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 keine Änderungen
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.10.5 → 2.11.4 keine Änderungen
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 keine Änderungen
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 keine Änderungen
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
SYNOPSIS
gitmerge[-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit] [--no-verify] [-s<strategy>] [-X<strategy-option>] [-S[<keyid>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m<msg>] [-F<file>] [--into-name<branch>] [<commit>…]gitmerge(--continue|--abort|--quit)
BESCHREIBUNG
Integiriert Änderungen von den benannten Commits (seit dem Zeitpunkt, an dem ihre Historien von dem aktuellen Branch abwichen) in den aktuellen Branch. Dieser Befehl wird von git pull verwendet, um Änderungen aus einem anderen Repository zu integrieren, und kann manuell verwendet werden, um Änderungen von einem Branch in einen anderen zu mergen.
Angenommen, die folgende Historie existiert und der aktuelle Branch ist master
A---B---C topic
/
D---E---F---G master
Dann wird git merge topic die Änderungen, die im topic Branch seit seiner Abweichung von master (d.h. E) bis zu seinem aktuellen Commit (C) gemacht wurden, auf master wiederholen und das Ergebnis in einem neuen Commit aufzeichnen, zusammen mit den Namen der beiden Eltern-Commits und einer Log-Nachricht des Benutzers, die die Änderungen beschreibt. Vor der Operation wird ORIG_HEAD auf die Spitze des aktuellen Branches (G) gesetzt.
A---B---C topic
/ \
D---E---F---G---H master
Ein Merge stoppt, wenn es einen Konflikt gibt, der nicht automatisch aufgelöst werden kann, oder wenn --no-commit beim Einleiten des Merges angegeben wurde. Zu diesem Zeitpunkt können Sie git merge --abort oder git merge --continue ausführen.
git merge --abort bricht den Merge-Prozess ab und versucht, den Zustand vor dem Merge wiederherzustellen. Wenn jedoch bei Beginn des Merges unbestätigte Änderungen vorhanden waren (und insbesondere, wenn diese Änderungen nach Beginn des Merges weiter modifiziert wurden), kann git merge --abort in einigen Fällen die ursprünglichen (Vor-Merge-)Änderungen nicht wiederherstellen. Daher
|
Warnung
|
Die Ausführung von git merge mit nicht-trivialen, unbestätigten Änderungen wird nicht empfohlen: Obwohl möglich, kann es Sie in einen Zustand versetzen, aus dem im Falle eines Konflikts schwer auszusteigen ist. |
OPTIONEN
--commit--no-commit-
Führt den Merge durch und committet das Ergebnis. Diese Option kann verwendet werden, um
--no-commitzu überschreiben.Mit
--no-commitwird der Merge durchgeführt und kurz vor dem Erstellen eines Merge-Commits gestoppt, um dem Benutzer die Möglichkeit zu geben, das Merge-Ergebnis zu inspizieren und weiter anzupassen, bevor er es committet.Beachten Sie, dass Fast-Forward-Updates keinen Merge-Commit erstellen und daher keine Möglichkeit besteht, diese Merges mit
--no-commitzu stoppen. Wenn Sie also sicherstellen möchten, dass Ihr Branch durch den Merge-Befehl nicht geändert oder aktualisiert wird, verwenden Sie--no-ffmit--no-commit. --edit-e--no-edit-
Ruft einen Editor auf, bevor ein erfolgreicher mechanischer Merge committet wird, um die automatisch generierte Merge-Nachricht weiter zu bearbeiten, damit der Benutzer den Merge erklären und begründen kann. Die Option
--no-editkann verwendet werden, um die automatisch generierte Nachricht zu akzeptieren (dies wird im Allgemeinen nicht empfohlen). Die Option--edit(oder-e) ist immer noch nützlich, wenn Sie mit der Option-mvon der Kommandozeile aus eine Entwurfsnachricht angeben und diese im Editor bearbeiten möchten.Ältere Skripte können vom historischen Verhalten abhängen, das dem Benutzer nicht erlaubt, die Merge-Log-Nachricht zu bearbeiten. Sie sehen einen Editor geöffnet, wenn sie
gitmergeausführen. Um die Anpassung solcher Skripte an das aktualisierte Verhalten zu erleichtern, kann die UmgebungsvariableGIT_MERGE_AUTOEDITam Anfang mitnogesetzt werden. --cleanup=<mode>-
Diese Option bestimmt, wie die Merge-Nachricht vor dem Commit bereinigt wird. Weitere Einzelheiten finden Sie in git-commit[1]. Wenn dem <mode> zusätzlich der Wert
scissorsgegeben wird, werden Scheren anMERGE_MSGangehängt, bevor sie an die Commit-Mechanik im Falle eines Merge-Konflikts weitergegeben werden. --ff--no-ff--ff-only-
Gibt an, wie ein Merge behandelt wird, wenn die gemergte Historie bereits ein Nachfahre der aktuellen Historie ist.
--ffist der Standard, es sei denn, ein annotierter (und möglicherweise signierter) Tag wird gemergt, der sich nicht an seinem natürlichen Platz in derrefs/tags/Hierarchie befindet, in diesem Fall wird--no-ffangenommen.Mit
--ffwird, wenn möglich, der Merge als Fast-Forward aufgelöst (nur der Branch-Zeiger wird aktualisiert, um dem gemergten Branch zu entsprechen; kein Merge-Commit wird erstellt). Wenn dies nicht möglich ist (wenn die gemergte Historie kein Nachfahre der aktuellen Historie ist), wird ein Merge-Commit erstellt.Mit
--no-ffwird in allen Fällen ein Merge-Commit erstellt, auch wenn der Merge stattdessen als Fast-Forward aufgelöst werden könnte.Mit
--ff-onlywird der Merge als Fast-Forward aufgelöst, wenn möglich. Wenn dies nicht möglich ist, wird der Merge verweigert und mit einem Rückgabewert ungleich Null beendet. -S[<key-id>]--gpg-sign[=<key-id>]--no-gpg-sign-
Signiert den resultierenden Merge-Commit mit GPG. Das Argument <key-id> ist optional und standardmäßig die Kommitteur-Identität; wenn es angegeben wird, muss es ohne Leerzeichen an die Option angehängt werden.
--no-gpg-signist nützlich, um sowohl die Konfigurationsvariablecommit.gpgSignals auch frühere--gpg-sign-Aufrufe zu überschreiben. --log[=<n>]--no-log-
Zusätzlich zu den Branch-Namen werden die Log-Nachricht mit einzeiligen Beschreibungen von höchstens <n> tatsächlich gemergten Commits gefüllt. Siehe auch git-fmt-merge-msg[1].
Mit
--no-logwerden keine einzeiligen Beschreibungen von den tatsächlich gemergten Commits aufgelistet. --signoff--no-signoff-
Fügt einen
Signed-off-by-Trailer vom Committer am Ende der Commit-Log-Nachricht hinzu. Die Bedeutung eines Sign-offs hängt vom Projekt ab, an das Sie committen. Es kann beispielsweise bestätigen, dass der Committer die Rechte hat, die Arbeit unter der Lizenz des Projekts einzureichen, oder einer bestimmten Beitragsstellervereinbarung zustimmt, wie z. B. einem Developer Certificate of Origin. (Siehe https://developercertificate.org für das von den Linux-Kernel- und Git-Projekten verwendete.) Konsultieren Sie die Dokumentation oder die Führung des Projekts, zu dem Sie beitragen, um zu verstehen, wie die Sign-offs in diesem Projekt verwendet werden.Die Option
--no-signoffkann verwendet werden, um eine frühere Option--signoffauf der Kommandozeile zu widerrufen. --stat-n--no-stat-
Zeigt am Ende des Merges einen Diffstat an. Der Diffstat wird auch durch die Konfigurationsoption merge.stat gesteuert.
Mit
-noder--no-statwird am Ende des Merges kein Diffstat angezeigt. --compact-summary-
Zeigt am Ende des Merges eine kompakte Zusammenfassung an.
--squash--no-squash-
Produziert den Arbeitsbaum und den Index so, als wäre ein echter Merge erfolgt (außer der Merge-Information), aber ohne tatsächlich einen Commit zu machen,
HEADzu bewegen oder$GIT_DIR/MERGE_HEADaufzuzeichnen (damit der nächstegitcommitBefehl einen Merge-Commit erstellt). Dies ermöglicht es Ihnen, einen einzigen Commit auf dem aktuellen Branch zu erstellen, dessen Effekt dem Mergen eines anderen Branches entspricht (oder mehr im Falle eines Oktopus).Mit
--no-squashwird der Merge durchgeführt und das Ergebnis committet. Diese Option kann verwendet werden, um--squashzu überschreiben.Mit
--squashist--commitnicht erlaubt und schlägt fehl. --verify--no-verify-
Standardmäßig werden die Hooks `pre-merge` und `commit-msg` ausgeführt. Wenn
--no-verifyangegeben wird, werden diese umgangen. Siehe auch githooks[5]. -s<strategy>--strategy=<strategy>-
Verwendet die angegebene Merge-Strategie; kann mehrfach angegeben werden, um sie in der Reihenfolge zu spezifizieren, in der sie versucht werden sollen. Wenn keine
-s-Option angegeben ist, wird stattdessen eine eingebaute Liste von Strategien verwendet (ortbeim Mergen eines einzelnen Heads,octopusandernfalls). -X<option>--strategy-option=<option>-
Übergibt strategie-spezifische Optionen an die Merge-Strategie.
--verify-signatures--no-verify-signatures-
Überprüft, ob der Spitzen-Commit des zu mergenden Seiten-Branches mit einem gültigen Schlüssel signiert ist, d.h. einem Schlüssel mit einer gültigen uid: im Standard-Vertrauensmodell wurde der Signierschlüssel von einem vertrauenswürdigen Schlüssel signiert. Wenn der Spitzen-Commit des Seiten-Branches nicht mit einem gültigen Schlüssel signiert ist, wird der Merge abgebrochen.
--summary--no-summary-
Synonyme für
--statund--no-stat; diese sind veraltet und werden in Zukunft entfernt. -q--quiet-
Arbeitet im Stillen. Impliziert
--no-progress. -v--verbose-
Ausführlich sein.
--progress--no-progress-
Schaltet die Fortschrittsanzeige explizit ein/aus. Wenn keine der beiden Optionen angegeben ist, wird der Fortschritt angezeigt, wenn Standardfehler mit einem Terminal verbunden ist. Beachten Sie, dass möglicherweise nicht alle Merge-Strategien Fortschrittsberichte unterstützen.
--autostash--no-autostash-
Erstellt automatisch einen temporären Stash-Eintrag, bevor die Operation beginnt, zeichnet ihn im Ref
MERGE_AUTOSTASHauf und wendet ihn nach Abschluss der Operation an. Das bedeutet, dass Sie die Operation auf einem schmutzigen Arbeitsbaum ausführen können. Vorsicht: Das abschließende Anwenden des Stashes nach einem erfolgreichen Merge kann zu nicht-trivialen Konflikten führen. -
Standardmäßig lehnt der Befehl
gitmergedas Mergen von Historien ab, die keinen gemeinsamen Vorfahren haben. Diese Option kann verwendet werden, um diese Sicherheit zu umgehen, wenn Historien von zwei Projekten gemergt werden, die ihr Leben unabhängig begonnen haben. Da dies ein sehr seltener Fall ist, gibt es keine Konfigurationsvariable, um dies standardmäßig zu aktivieren, und es wird auch keine hinzugefügt werden. -m<msg>-
Setzt die Commit-Nachricht, die für den Merge-Commit verwendet werden soll (falls einer erstellt wird).
Wenn
--logangegeben ist, wird eine Kurzfassung der gemergten Commits an die angegebene Nachricht angehängt.Der Befehl
gitfmt-merge-msgkann verwendet werden, um eine gute Standardeinstellung für automatisiertegitmergeAufrufe zu liefern. Die automatische Nachricht kann die Branch-Beschreibung enthalten. --into-name<branch>-
Bereitet die Standard-Merge-Nachricht so vor, als würde in den Branch <branch> gemergt, anstatt in den Namen des tatsächlichen Branches, in den gemergt wird.
-F<file>--file=<file>-
Liest die Commit-Nachricht, die für den Merge-Commit verwendet werden soll (falls einer erstellt wird).
Wenn
--logangegeben ist, wird eine Kurzfassung der gemergten Commits an die angegebene Nachricht angehängt. --rerere-autoupdate--no-rerere-autoupdate-
Nachdem der rerere-Mechanismus eine aufgezeichnete Auflösung für den aktuellen Konflikt wiederverwendet hat, um die Dateien im Arbeitsbaum zu aktualisieren, erlauben Sie ihm auch, den Index mit dem Ergebnis der Auflösung zu aktualisieren.
--no-rerere-autoupdateist eine gute Möglichkeit, zu überprüfen, wasrereregetan hat, und potenzielle Fehlmerges zu erkennen, bevor das Ergebnis mit einem separatengitaddin den Index übernommen wird. --overwrite-ignore--no-overwrite-ignore-
Überschreibt ignorierte Dateien aus dem Merge-Ergebnis stillschweigend. Dies ist das Standardverhalten. Verwenden Sie
--no-overwrite-ignorezum Abbrechen. --abort-
Bricht den aktuellen Konfliktlösungs-Prozess ab und versucht, den Zustand vor dem Merge wiederherzustellen. Wenn ein Autostash-Eintrag vorhanden ist, wird er auf den Arbeitsbaum angewendet.
Wenn bei Beginn des Merges unbestätigte Arbeitsbaum-Änderungen vorhanden waren, kann
gitmerge--abortdiese Änderungen in einigen Fällen nicht wiederherstellen. Es wird daher empfohlen, Ihre Änderungen immer zu committen oder zu stashen, bevor Siegitmergeausführen.gitmerge--abortist äquivalent zugitreset--merge, wennMERGE_HEADvorhanden ist, es sei denn,MERGE_AUTOSTASHist ebenfalls vorhanden, in diesem Fall wendetgitmerge--abortden Stash-Eintrag auf den Arbeitsbaum an, währendgitreset--mergedie gestashten Änderungen in der Stash-Liste speichert. --quit-
Vergessen Sie den aktuellen Merge-Vorgang. Lassen Sie den Index und den Arbeitsbaum unverändert. Wenn
MERGE_AUTOSTASHvorhanden ist, wird der Stash-Eintrag in der Stash-Liste gespeichert. --continue-
Nachdem
gitmergeaufgrund von Konflikten gestoppt wurde, können Sie den Merge abschließen, indem Siegitmerge--continueausführen (siehe unten den Abschnitt "WIE KONFLIKTE GELÖST WERDEN"). - <commit>...
-
Commits, normalerweise andere Branch-Heads, die in unseren Branch gemergt werden sollen. Die Angabe von mehr als einem Commit erstellt einen Merge mit mehr als zwei Eltern (liebevoll ein Oktopus-Merge genannt).
Wenn keine Commits von der Kommandozeile angegeben werden, werden die Remote-Tracking-Branches gemergt, die der aktuelle Branch als seinen Upstream konfiguriert hat. Siehe auch den Konfigurationsabschnitt dieser Manpage.
Wenn
FETCH_HEAD(und kein anderer Commit) angegeben ist, werden die Branches, die in der Datei.git/FETCH_HEADdurch den vorherigen Aufruf vongitfetchzum Mergen aufgezeichnet sind, in den aktuellen Branch gemergt.
VOR-MERGE-PRÜFUNGEN
Bevor Sie externe Änderungen anwenden, sollten Sie Ihre eigenen Arbeiten in einem guten Zustand und lokal committet haben, damit sie bei Konflikten nicht überschrieben werden. Siehe auch git-stash[1]. git pull und git merge stoppen ohne etwas zu tun, wenn lokale, unbestätigte Änderungen mit Dateien überlappen, die git pull/git merge möglicherweise aktualisieren muss.
Um zu vermeiden, dass nicht verwandte Änderungen in den Merge-Commit aufgenommen werden, stoppen git pull und git merge auch, wenn Änderungen im Index relativ zum HEAD-Commit registriert sind. (Spezielle, enge Ausnahmen von dieser Regel können je nach verwendeter Merge-Strategie bestehen, aber im Allgemeinen muss der Index mit HEAD übereinstimmen.)
Wenn alle benannten Commits bereits Vorfahren von HEAD sind, beendet sich git merge frühzeitig mit der Meldung "Already up to date.".
FAST-FORWARD-MERGE
Oft ist der aktuelle Branch-Head ein Vorfahre des benannten Commits. Dies ist der häufigste Fall, insbesondere wenn er von git pull aufgerufen wird: Sie verfolgen ein Upstream-Repository, haben keine lokalen Änderungen committet und möchten nun zu einer neueren Upstream-Revision aktualisieren. In diesem Fall ist kein neuer Commit erforderlich, um die kombinierte Historie zu speichern; stattdessen wird HEAD (zusammen mit dem Index) aktualisiert, um auf den benannten Commit zu zeigen, ohne einen zusätzlichen Merge-Commit zu erstellen.
Dieses Verhalten kann mit der Option --no-ff unterdrückt werden.
ECHTER MERGE
Außer bei einem Fast-Forward-Merge (siehe oben) müssen die zu mergenden Branches durch einen Merge-Commit zusammengebunden werden, der beide als Eltern hat.
Eine gemergte Version, die die Änderungen aller zu mergenden Branches zusammenführt, wird committet, und Ihr HEAD, Index und Arbeitsbaum werden darauf aktualisiert. Es ist möglich, Modifikationen im Arbeitsbaum zu haben, solange sie sich nicht überlappen; die Aktualisierung wird sie beibehalten.
Wenn nicht offensichtlich ist, wie die Änderungen zusammengeführt werden können, geschieht Folgendes:
-
Der
HEAD-Zeiger bleibt unverändert. -
Der Ref
MERGE_HEADwird so gesetzt, dass er auf den anderen Branch-Head zeigt. -
Pfade, die sauber gemergt wurden, werden sowohl in der Indexdatei als auch in Ihrem Arbeitsbaum aktualisiert.
-
Für widersprüchliche Pfade zeichnet die Indexdatei bis zu drei Versionen auf: Stufe 1 speichert die Version vom gemeinsamen Vorfahren, Stufe 2 von
HEADund Stufe 3 vonMERGE_HEAD(Sie können die Stufen mitgitls-files-ueinsehen). Die Arbeitsbaum-Dateien enthalten das Ergebnis der Merge-Operation; d.h. 3-Wege-Merge-Ergebnisse mit vertrauten Konfliktmarkern <<<===>>>. -
Ein Ref namens
AUTO_MERGEwird geschrieben und verweist auf einen Baum, der dem aktuellen Inhalt des Arbeitsbaums entspricht (einschließlich Konfliktmarkern für textuelle Konflikte). Beachten Sie, dass dieser Ref nur geschrieben wird, wenn dieort-Merge-Strategie verwendet wird (der Standard). -
Sonstige Änderungen werden nicht vorgenommen. Insbesondere bleiben die lokalen Änderungen, die Sie vor dem Start des Merges hatten, unverändert und die Indexeinträge dafür bleiben wie sie waren, d.h. passend zu
HEAD.
Wenn Sie einen Merge versucht haben, der zu komplexen Konflikten geführt hat und Sie neu beginnen möchten, können Sie mit git merge --abort wiederherstellen.
TAG MERGEN
Beim Mergen eines annotierten (und möglicherweise signierten) Tags erstellt Git immer einen Merge-Commit, auch wenn ein Fast-Forward-Merge möglich ist, und die Commit-Nachrichten-Vorlage wird mit der Tag-Nachricht vorbereitet. Zusätzlich wird, wenn der Tag signiert ist, die Signaturprüfung als Kommentar in der Nachrichten-Vorlage gemeldet. Siehe auch git-tag[1].
Wenn Sie nur die Arbeit integrieren möchten, die zu dem Commit geführt hat, der zufällig getaggt wurde, z.B. um mit einem Upstream-Release-Punkt zu synchronisieren, möchten Sie möglicherweise keinen unnötigen Merge-Commit erstellen.
In einem solchen Fall können Sie den Tag selbst "entpacken", bevor Sie ihn an git merge übergeben, oder --ff-only übergeben, wenn Sie keine eigene Arbeit haben. z.B.
git fetch origin git merge v1.2.3^0 git merge --ff-only v1.2.3
WIE KONFLIKTE DARGESTELLT WERDEN
Während eines Merges werden die Arbeitsbaum-Dateien aktualisiert, um das Ergebnis des Merges widerzuspiegeln. Unter den Änderungen, die an der Version des gemeinsamen Vorfahren vorgenommen wurden, werden nicht überlappende Änderungen (d.h. Sie haben einen Bereich der Datei geändert, während die andere Seite diesen Bereich unverändert gelassen hat, oder umgekehrt) unverändert in das Endergebnis übernommen. Wenn jedoch beide Seiten Änderungen am selben Bereich vorgenommen haben, kann Git nicht willkürlich eine Seite der anderen vorziehen und bittet Sie, dies zu lösen, indem es hinterlässt, was beide Seiten für diesen Bereich getan haben.
Standardmäßig verwendet Git den gleichen Stil wie das Programm "merge" aus der RCS-Suite, um einen solchen widersprüchlichen Hunk darzustellen, wie folgt:
Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed, or cleanly resolved because both sides changed the same way. <<<<<<< yours:sample.txt Conflict resolution is hard; let's go shopping. ======= Git makes conflict resolution easy. >>>>>>> theirs:sample.txt And here is another line that is cleanly resolved or unmodified.
Der Bereich, in dem ein Paar widersprüchlicher Änderungen aufgetreten ist, wird mit den Markierungen <<<<<<<, ======= und >>>>>>> markiert. Der Teil vor dem ======= ist typischerweise Ihre Seite, und der Teil danach ist typischerweise deren Seite.
Das Standardformat zeigt nicht, was das Original im widersprüchlichen Bereich gesagt hat. Sie können nicht erkennen, wie viele Zeilen gelöscht und durch Barbies Bemerkung auf Ihrer Seite ersetzt wurden. Das Einzige, was Sie erkennen können, ist, dass Ihre Seite sagen möchte, dass es schwierig ist und Sie lieber einkaufen gehen würden, während die andere Seite behaupten möchte, es sei einfach.
Ein alternativer Stil kann verwendet werden, indem die Konfigurationsvariable merge.conflictStyle entweder auf diff3 oder zdiff3 gesetzt wird. Im diff3-Stil könnte der obige Konflikt wie folgt aussehen:
Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed, <<<<<<< yours:sample.txt or cleanly resolved because both sides changed the same way. Conflict resolution is hard; let's go shopping. ||||||| base:sample.txt or cleanly resolved because both sides changed identically. Conflict resolution is hard. ======= or cleanly resolved because both sides changed the same way. Git makes conflict resolution easy. >>>>>>> theirs:sample.txt And here is another line that is cleanly resolved or unmodified.
während im zdiff3-Stil könnte er so aussehen:
Here are lines that are either unchanged from the common ancestor, or cleanly resolved because only one side changed, or cleanly resolved because both sides changed the same way. <<<<<<< yours:sample.txt Conflict resolution is hard; let's go shopping. ||||||| base:sample.txt or cleanly resolved because both sides changed identically. Conflict resolution is hard. ======= Git makes conflict resolution easy. >>>>>>> theirs:sample.txt And here is another line that is cleanly resolved or unmodified.
Zusätzlich zu den Markierungen <<<<<<<, ======= und >>>>>>> wird eine weitere Markierung ||||||| verwendet, der der ursprüngliche Text folgt. Sie können erkennen, dass das Original lediglich eine Tatsache aussagte und Ihre Seite sich dieser Aussage einfach ergab und aufgab, während die andere Seite versuchte, eine positivere Einstellung zu haben. Sie können manchmal eine bessere Lösung finden, indem Sie das Original betrachten.
WIE KONFLIKTE GELÖST WERDEN
Nachdem Sie einen Konflikt gesehen haben, können Sie zwei Dinge tun:
-
Beschließen, nicht zu mergen. Die einzigen Aufräumarbeiten, die Sie benötigen, sind das Zurücksetzen der Indexdatei auf den
HEAD-Commit, um 2. rückgängig zu machen, und das Aufräumen der Arbeitsbaum-Änderungen, die durch 2. und 3. gemacht wurden;gitmerge--abortkann dafür verwendet werden. -
Die Konflikte lösen. Git wird die Konflikte im Arbeitsbaum markieren. Bearbeiten Sie die Dateien in Form und fügen Sie sie mit
gitaddzum Index hinzu. Verwenden Siegitcommitodergitmerge--continue, um den Deal abzuschließen. Letzterer Befehl prüft, ob ein (unterbrochener) Merge im Gange ist, bevorgitcommitaufgerufen wird.
Sie können den Konflikt mit einer Reihe von Werkzeugen durcharbeiten:
-
Verwenden Sie ein Mergetool.
gitmergetoolstartet ein grafisches Mergetool, das mit Ihnen den Merge durcharbeitet. -
Schauen Sie sich die Diffs an.
gitdiffzeigt einen Drei-Wege-Diff an, der Änderungen sowohl von derHEAD- als auch von derMERGE_HEAD-Version hervorhebt.gitdiffAUTO_MERGEzeigt, welche Änderungen Sie bisher vorgenommen haben, um textuelle Konflikte zu lösen. -
Schauen Sie sich die Diffs von jedem Branch an.
gitlog--merge-p<path> zeigt zuerst Diffs für dieHEAD-Version und dann dieMERGE_HEAD-Version an. -
Sehen Sie sich die Originale an.
gitshow:1:filenamezeigt den gemeinsamen Vorfahren,gitshow:2:filenamezeigt dieHEAD-Version undgitshow:3:filenamezeigt dieMERGE_HEAD-Version.
BEISPIELE
-
Führt die Zweige
fixesundenhancementsauf dem aktuellen Zweig zusammen und erstellt einen Octopus-Merge.$ git merge fixes enhancements
-
Führt den Zweig
obsoletein den aktuellen Zweig ein und verwendet die Merge-Strategieours.$ git merge -s ours obsolete
-
Führt den Zweig
maintin den aktuellen Zweig ein, erstellt jedoch keinen neuen Commit automatisch.$ git merge --no-commit maint
Dies kann verwendet werden, wenn Sie weitere Änderungen in den Merge einbeziehen möchten oder Ihre eigene Merge-Commit-Nachricht verfassen möchten.
Sie sollten es vermeiden, diese Option zu missbrauchen, um wesentliche Änderungen in einen Merge-Commit zu schleichen. Kleine Korrekturen wie die Erhöhung des Release-/Versionsnamens wären akzeptabel.
MERGE-STRATEGIEN
Der Merge-Mechanismus (Befehle git merge und git pull) ermöglicht die Auswahl der Backend-Merge-Strategien mit der Option -s. Einige Strategien können auch ihre eigenen Optionen übernehmen, die durch Angabe von -X<option>-Argumenten an git merge und/oder git pull übergeben werden können.
ort-
Dies ist die Standard-Merge-Strategie beim Ziehen oder Zusammenführen eines Zweigs. Diese Strategie kann nur zwei Köpfe mithilfe eines 3-Wege-Merge-Algorithmus auflösen. Wenn es mehr als einen gemeinsamen Vorfahren gibt, der für einen 3-Wege-Merge verwendet werden kann, erstellt sie einen zusammengeführten Baum der gemeinsamen Vorfahren und verwendet diesen als Referenzbaum für den 3-Wege-Merge. Dies hat Berichten zufolge zu weniger Merge-Konflikten geführt, ohne Fehl-Merges zu verursachen, basierend auf Tests mit tatsächlichen Merge-Commits aus der Linux 2.6 Kernel-Entwicklungshistorie. Zusätzlich kann diese Strategie Renames erkennen und handhaben. Sie nutzt keine erkannten Kopien. Der Name für diesen Algorithmus ist ein Akronym ("Ostensibly Recursive’s Twin") und stammt daher, dass er als Ersatz für den bisherigen Standardalgorithmus
recursivegeschrieben wurde.Wenn der Pfad ein Submodul ist und der auf einer Seite des Merges verwendete Submodul-Commit ein Nachkomme des auf der anderen Seite verwendeten Submodul-Commits ist, versucht Git, zum Nachkommen weiterzuschalten (fast-forward). Andernfalls behandelt Git diesen Fall als Konflikt und schlägt als Auflösung einen Submodul-Commit vor, der ein Nachkomme der konfligierenden ist, falls ein solcher existiert.
Die
ort-Strategie kann die folgenden Optionen übernehmen.ours-
Diese Option erzwingt, dass widersprüchliche Hunks automatisch sauber aufgelöst werden, indem die Version von uns bevorzugt wird. Änderungen vom anderen Baum, die nicht mit unserer Seite kollidieren, spiegeln sich im Merge-Ergebnis wider. Bei einer Binärdatei wird der gesamte Inhalt von unserer Seite übernommen.
Dies darf nicht mit der Merge-Strategie
oursverwechselt werden, die überhaupt nicht prüft, was der andere Baum enthält. Sie verwirft alles, was der andere Baum getan hat, und erklärt, dass unsere Historie alles enthält, was darin geschehen ist. theirs-
Dies ist das Gegenteil von
ours; beachten Sie, dass es im Gegensatz zuourskeinetheirs-Merge-Strategie gibt, mit der diese Merge-Option verwechselt werden könnte. ignore-space-changeignore-all-spaceignore-space-at-eolignore-cr-at-eol-
Behandelt Zeilen mit der angegebenen Art von Leerzeichenänderung für den Zweck eines 3-Wege-Merges als unverändert. Leerzeichenänderungen, die mit anderen Änderungen an einer Zeile vermischt sind, werden nicht ignoriert. Siehe auch git-diff[1]
-b,-w,--ignore-space-at-eolund--ignore-cr-at-eol.-
Wenn die Version des Gegners nur Leerzeichenänderungen an einer Zeile vornimmt, wird die Version von uns verwendet;
-
Wenn die Version von uns Leerzeichenänderungen vornimmt, aber die Version des Gegners eine wesentliche Änderung enthält, wird die Version des Gegners verwendet;
-
Andernfalls wird der Merge wie üblich durchgeführt.
-
renormalize-
Dies führt einen virtuellen Check-out und Check-in aller drei Stufen jeder Datei durch, die einen 3-Wege-Merge benötigt. Diese Option ist für das Zusammenführen von Zweigen mit unterschiedlichen Clean-Filtern oder Normalisierungsregeln für Zeilenenden gedacht. Details finden Sie im Abschnitt "Merging branches with differing checkin/checkout attributes" in gitattributes[5].
no-renormalize-
Deaktiviert die Option
renormalize. Dies überschreibt die Konfigurationsvariablemerge.renormalize. find-renames[=<n>]-
Aktiviert die Erkennung von Renames, optional mit Angabe der Ähnlichkeitsschwelle. Dies ist die Standardeinstellung. Dies überschreibt die Konfigurationsvariable
merge.renames. Siehe auch git-diff[1]--find-renames. rename-threshold=<n>-
Veraltete Synonym für
find-renames=<n>. no-renames-
Deaktiviert die Erkennung von Renames. Dies überschreibt die Konfigurationsvariable
merge.renames. Siehe auch git-diff[1]--no-renames. histogram-
Veraltetes Synonym für
diff-algorithm=histogram. patience-
Veraltetes Synonym für
diff-algorithm=patience. diff-algorithm=(histogram|minimal|myers|patience)-
Verwendet einen anderen Diff-Algorithmus beim Zusammenführen, was helfen kann, Fehl-Merges zu vermeiden, die aufgrund von unwichtigen übereinstimmenden Zeilen (wie Klammern aus verschiedenen Funktionen) auftreten. Siehe auch git-diff[1]
--diff-algorithm. Beachten Sie, dassortstandardmäßigdiff-algorithm=histogramverwendet, während normale Diffs derzeit standardmäßig die Einstellungdiff.algorithmverwenden. subtree[=<path>]-
Diese Option ist eine weiterentwickelte Form der Subtree-Strategie, bei der die Strategie versucht, wie zwei Bäume aufeinander abgestimmt werden müssen, wenn sie zusammengeführt werden. Stattdessen wird der angegebene Pfad vorangestellt (oder vom Anfang gestrippt), um die Form zweier Bäume abzugleichen.
recursive-
Dies ist jetzt ein Synonym für
ort. Es war bis v2.49.0 eine alternative Implementierung, wurde aber ab v2.50.0 aufortumgeleitet. Die frühere rekursive Strategie war die Standardstrategie zur Auflösung von zwei Köpfen von Git v0.99.9k bis v2.33.0. resolve-
Dies kann nur zwei Köpfe (d. h. den aktuellen Zweig und einen anderen, von dem Sie gezogen haben) mithilfe eines 3-Wege-Merge-Algorithmus auflösen. Es versucht, Mehrdeutigkeiten bei Kreuz-Merges sorgfältig zu erkennen. Es verarbeitet keine Renames.
octopus-
Dies löst Fälle mit mehr als zwei Köpfen, lehnt jedoch komplexe Merges ab, die eine manuelle Auflösung erfordern. Er ist hauptsächlich dafür gedacht, Topic-Zweig-Köpfe zu bündeln. Dies ist die Standard-Merge-Strategie, wenn mehr als ein Zweig gezogen oder zusammengeführt wird.
ours-
Dies löst eine beliebige Anzahl von Köpfen auf, aber der resultierende Baum des Merges ist immer der des aktuellen Zweigkopfs, wodurch alle Änderungen von allen anderen Zweigen effektiv ignoriert werden. Er ist dafür gedacht, alte Entwicklungshistorien von Seitenästen zu ersetzen. Beachten Sie, dass dies sich von der Option
-Xoursfür dieort-Merge-Strategie unterscheidet. subtree-
Dies ist eine modifizierte
ort-Strategie. Beim Zusammenführen der Bäume A und B, wenn B einem Unterverzeichnis von A entspricht, wird B zuerst angepasst, um der Baumstruktur von A zu entsprechen, anstatt die Bäume auf derselben Ebene zu lesen. Diese Anpassung erfolgt auch für den gemeinsamen Vorfahrenbaum.
Bei den Strategien, die einen 3-Wege-Merge verwenden (einschließlich der Standardstrategie ort), wird eine Änderung, die auf beiden Zweigen vorgenommen wurde, aber später auf einem der Zweige rückgängig gemacht wurde, im zusammengeführten Ergebnis enthalten sein; einige Leute empfinden dieses Verhalten als verwirrend. Es tritt auf, weil nur die Köpfe und die Merge-Basis bei der Durchführung eines Merges berücksichtigt werden, nicht jedoch die einzelnen Commits. Der Merge-Algorithmus betrachtet daher die rückgängig gemachte Änderung als keine Änderung und ersetzt sie durch die geänderte Version.
KONFIGURATION
Alles oberhalb dieser Zeile in diesem Abschnitt ist nicht in der Dokumentation von git-config[1] enthalten. Der nachfolgende Inhalt ist derselbe wie dort zu finden.
merge.conflictStyle-
Gibt den Stil an, in dem widersprüchliche Hunks beim Zusammenführen in Arbeitsbaumdateien geschrieben werden. Der Standard ist "merge", der eine <<<<<<<-Konfliktmarkierung, Änderungen einer Seite, eine
=======-Markierung, Änderungen der anderen Seite und dann eine >>>>>>>-Markierung anzeigt. Ein alternativer Stil, "diff3", fügt eine |||||||-Markierung und den ursprünglichen Text vor der=======-Markierung hinzu. Der "merge"-Stil neigt dazu, kleinere Konfliktregionen als diff3 zu erzeugen, sowohl aufgrund des Ausschlusses des ursprünglichen Textes als auch weil, wenn ein Teil der Zeilen auf beiden Seiten übereinstimmt, sie einfach aus der Konfliktregion herausgezogen werden. Ein weiterer alternativer Stil, "zdiff3", ist ähnlich wie diff3, entfernt aber übereinstimmende Zeilen auf beiden Seiten aus der Konfliktregion, wenn diese übereinstimmenden Zeilen nahe dem Anfang oder Ende einer Konfliktregion erscheinen. merge.defaultToUpstream-
Wenn merge ohne Commit-Argument aufgerufen wird, werden die für den aktuellen Zweig konfigurierten Upstream-Zweige anhand ihrer zuletzt beobachteten Werte, die in ihren Remote-Tracking-Zweigen gespeichert sind, zusammengeführt. Die Werte von branch.<current branch>.merge, die die Zweige unter dem von
branch.<current-branch>.remotebenannten Namen angeben, werden konsultiert und dann überremote.<remote>.fetchihren entsprechenden Remote-Tracking-Zweigen zugeordnet, und die Spitzen dieser Tracking-Zweige werden zusammengeführt. Standardmäßig ist dies true. merge.ff-
Standardmäßig erstellt Git keinen zusätzlichen Merge-Commit, wenn ein Commit zusammengeführt wird, der ein Nachkomme des aktuellen Commits ist. Stattdessen wird die Spitze des aktuellen Zweigs durchgeschaltet (fast-forward). Wenn dieser Wert auf
falsegesetzt ist, weist diese Variable Git an, in einem solchen Fall einen zusätzlichen Merge-Commit zu erstellen (entspricht der Angabe der Option--no-ffauf der Befehlszeile). Wenn dieser Wert aufonlygesetzt ist, sind nur solche Fast-Forward-Merges zulässig (entspricht der Angabe der Option--ff-onlyauf der Befehlszeile). merge.verifySignatures-
Wenn true, ist dies äquivalent zur Befehlszeilenoption
--verify-signatures. Siehe git-merge[1] für Details. merge.branchdesc-
Befüllt zusätzlich zu den Zweignamen die Log-Nachricht mit dem zugehörigen Beschriftungstext des Zweigs. Standardmäßig false.
merge.log-
Befüllt zusätzlich zu den Zweignamen die Log-Nachricht mit höchstens der angegebenen Anzahl von Einzeilenbeschreibungen aus den tatsächlich zusammengeführten Commits. Standardmäßig false, und true ist ein Synonym für 20.
merge.suppressDest-
Durch Hinzufügen eines Glob-Musters, das die Namen von Integrationszweigen übereinstimmt, zu dieser mehrwertigen Konfigurationsvariablen wird die für Merges in diese Integrationszweige berechnete Standard-Merge-Nachricht "into <branch-name>" aus ihrem Titel weglassen.
Ein Element mit einem leeren Wert kann verwendet werden, um die Liste der Globs zu löschen, die aus früheren Konfigurationseinträgen angesammelt wurden. Wenn keine Variable
merge.suppressDestdefiniert ist, wird standardmäßigmasteraus Gründen der Abwärtskompatibilität verwendet. merge.renameLimit-
Die Anzahl der Dateien, die im erschöpfenden Teil der Rename-Erkennung während eines Merges berücksichtigt werden. Wenn nicht angegeben, wird der Wert von
diff.renameLimitverwendet. Wenn wedermerge.renameLimitnochdiff.renameLimitangegeben sind, beträgt der Standardwert derzeit 7000. Diese Einstellung hat keine Auswirkung, wenn die Rename-Erkennung deaktiviert ist. merge.renames-
Ob Git Renames erkennt. Wenn auf
falsegesetzt, ist die Rename-Erkennung deaktiviert. Wenn auftruegesetzt, ist die grundlegende Rename-Erkennung aktiviert. Standardmäßig wird der Wert von diff.renames verwendet. merge.directoryRenames-
Ob Git Verzeichnis-Renames erkennt, was sich darauf auswirkt, was zum Zeitpunkt des Merges mit neuen Dateien geschieht, die einem Verzeichnis auf einer Seite der Historie hinzugefügt wurden, während dieses Verzeichnis auf der anderen Seite der Historie umbenannt wurde. Mögliche Werte sind:
false-
Die Erkennung von Verzeichnis-Renames ist deaktiviert, was bedeutet, dass solche neuen Dateien im alten Verzeichnis verbleiben.
true-
Die Erkennung von Verzeichnis-Renames ist aktiviert, was bedeutet, dass solche neuen Dateien in das neue Verzeichnis verschoben werden.
conflict-
Ein Konflikt wird für solche Pfade gemeldet.
Wenn
merge.renamesfalseist, wirdmerge.directoryRenamesignoriert und alsfalsebehandelt. Standardmäßig ist esconflict. merge.renormalize-
Teilt Git mit, dass sich die kanonische Darstellung von Dateien im Repository im Laufe der Zeit geändert hat (z. B. frühere Commits speichern Textdateien mit CRLF-Zeilenenden, aber neuere verwenden LF-Zeilenenden). In einem solchen Repository kann Git für jede Datei, bei der ein 3-Wege-Inhalts-Merge erforderlich ist, die in Commits gespeicherten Daten vor dem Merge in eine kanonische Form konvertieren, um unnötige Konflikte zu reduzieren. Weitere Informationen finden Sie im Abschnitt "Merging branches with differing checkin/checkout attributes" in gitattributes[5].
merge.stat-
Was, wenn überhaupt, zwischen
ORIG_HEADund dem Merge-Ergebnis am Ende des Merges gedruckt werden soll. Mögliche Werte sind:aber jeder nicht erkannte Wert (z. B. ein Wert, der von einer zukünftigen Git-Version hinzugefügt wurde) wird als
trueinterpretiert, anstatt einen Fehler auszulösen. Standardmäßig ist estrue. merge.autoStash-
Wenn dies auf
truegesetzt ist, wird vor Beginn des Vorgangs automatisch ein temporärer Stash-Eintrag erstellt und nach Abschluss des Vorgangs angewendet. Das bedeutet, dass Sie einen Merge auf einem nicht bereinigten Arbeitsbaum ausführen können. Verwenden Sie dies jedoch mit Vorsicht: das abschließende Anwenden des Stashs nach einem erfolgreichen Merge kann zu nicht trivialen Konflikten führen. Diese Option kann durch die Optionen--no-autostashund--autostashvon git-merge[1] überschrieben werden. Standardmäßig ist siefalse. merge.tool-
Steuert, welcher Merge-Tool von git-mergetool[1] verwendet wird. Die folgende Liste zeigt die gültigen integrierten Werte. Jeder andere Wert wird als benutzerdefiniertes Merge-Tool behandelt und erfordert die Definition einer entsprechenden Variablen
mergetool.<tool>.cmd. merge.guitool-
Steuert, welcher Merge-Tool von git-mergetool[1] verwendet wird, wenn das Flag
-g/--guiangegeben ist. Die folgende Liste zeigt die gültigen integrierten Werte. Jeder andere Wert wird als benutzerdefiniertes Merge-Tool behandelt und erfordert die Definition einer entsprechenden Variablenmergetool.<guitool>.cmd.-
araxis
-
bc
-
codecompare
-
deltawalker
-
diffmerge
-
diffuse
-
ecmerge
-
emerge
-
examdiff
-
guiffy
-
gvimdiff
-
kdiff3
-
meld
-
nvimdiff
-
opendiff
-
p4merge
-
smerge
-
tkdiff
-
tortoisemerge
-
vimdiff
-
vscode
-
winmerge
-
xxdiff
-
merge.verbosity-
Steuert die Menge der vom rekursiven Merge-Algorithmus angezeigten Ausgaben. Stufe 0 gibt nichts aus, außer einer abschließenden Fehlermeldung, wenn Konflikte erkannt wurden. Stufe 1 gibt nur Konflikte aus, Stufe 2 gibt Konflikte und Dateiänderungen aus. Stufe 5 und höher gibt Debugging-Informationen aus. Der Standard ist Stufe 2. Kann durch die Umgebungsvariable
GIT_MERGE_VERBOSITYüberschrieben werden. merge.<driver>.name-
Definiert einen lesbaren Namen für einen benutzerdefinierten Low-Level-Merge-Treiber. Siehe gitattributes[5] für Details.
merge.<driver>.driver-
Definiert den Befehl, der einen benutzerdefinierten Low-Level-Merge-Treiber implementiert. Siehe gitattributes[5] für Details.
merge.<driver>.recursive-
Benennt einen Low-Level-Merge-Treiber, der bei der internen Zusammenführung zwischen gemeinsamen Vorfahren verwendet wird. Siehe gitattributes[5] für Details.
GIT
Teil der git[1] Suite