Wir haben zwei Zweige - "Master" und "Release"
Und wir haben eine Datei, wie fileA
, wir wollen verschiedene Versionen für diese beiden Zweige behalten.
Aber jedes Mal müssen wir "release" in "master" zusammenführen. Wie können wir erreichen, dass fileA
in "master" nicht von fileA
im Zweig "release" überschrieben wird.
Pro Git beschreibt, wie Sie diesen Effekt im "Merge Strategies Abschnitt von 8.2 Git - Git-Attribute anpassen .
Zusammenführungsstrategien
Sie können auch Git-Attribute verwenden, um Git anzuweisen, sie zu verwenden verschiedene Zusammenführungsstrategien für bestimmte Dateien in Ihrem Projekt. Ein Eine sehr nützliche Option besteht darin, Git mitzuteilen, dass es nicht versucht, bestimmte Dateien zusammenzuführen wenn sie Konflikte haben, sondern eher Ihre Seite der Zusammenführung verwenden über jemand anderen.
Dies ist hilfreich, wenn eine Verzweigung in Ihrem Projekt auseinander gegangen ist oder ist spezialisiert, aber Sie möchten Änderungen wieder zusammenführen können, und Sie möchten bestimmte Dateien ignorieren. Angenommen, Sie haben eine Datenbankeinstellungen Datei namens
%Vor%database.xml
, die in zwei Zweigen und Sie unterschiedlich ist möchte in Ihrem anderen Zweig zusammenführen, ohne die Datenbank zu beschädigen Datei. Sie können ein Attribut wie folgt einrichten:Und dann definieren Sie eine Dummy
%Vor%ours
Merge-Strategie mit:Wenn Sie in dem anderen Zweig zusammenführen, anstatt Zusammenführungskonflikte zu haben Mit der Datei
%Vor%database.xml
sehen Sie etwa Folgendes:In diesem Fall bleibt
database.xml
bei der ursprünglichen Version hatte.
Wenn Sie es auf Ihre Situation anwenden, erstellen Sie zuerst fileA
und machen Sie es speziell.
%Vor% Jetzt erstellen wir einen repräsentativen release
Zweig.
Es ist noch nichts Besonderes passiert: Die Versionskontrolle funktioniert nur so, wie es an diesem Punkt sein soll.
Nun implementieren wir Feature B wieder auf master
.
Versuchen Sie, Ihre Aufregung zu halten.
Hier kommt unser spezieller Merge-Treiber ins Spiel. Unser Held möchte den neuen Code von master
in release
zusammenführen. Schalten Sie zuerst die Zweige um.
Überprüfen Sie, ob fileA
enthält, was wir erwarten.
Zusammenführen Feature B von master
.
Die Zeile Auto-merging fileA
ist ein Hinweis darauf, dass etwas Besonderes passiert ist. Tatsächlich:
Der Abschnitt "Definieren eines benutzerdefinierten Zusammenführungstreibers" im gitattributes Dokumentation erklärt.
Der Wert der Variablen
merge.*.driver
wird verwendet, um einen Befehl zu erstellen Ausführen, um die Vorgängerversion (%O
), die aktuelle Version (%A
) und die Version anderer Zweige (%B
). Diese drei Token werden durch die ersetzt Namen von temporären Dateien, die den Inhalt dieser Versionen enthalten Die Kommandozeile ist aufgebaut ...Es wird erwartet, dass der Zusammenführungstreiber das Ergebnis der Zusammenführung in der Datei, die mit
%A
benannt wird, indem sie überschrieben wird, und mit dem Status "0" beendet wird, wenn dies der Fall ist schaffte es, sie sauber zusammenzuführen, oder nicht Null, wenn es Konflikte gab.
Der benutzerdefinierte ours
-Treiber verwendet fast keine dieser Maschinen, sondern nur den Befehl true
Beenden mit Nullstatus. Dies erreicht den gewünschten Effekt, da es mit fileA
von dem Zweig beginnt, auf dem wir gerade sind - was das gewünschte Ergebnis ist - und dann nichts in der Phase merge-overwrite tut ( ie , ignoriert den anderen) Branch-Version mit dem Namen %B
), und sagt schließlich git alles ist gut mit einem erfolgreichen Exit-Status.
Wenn Sie den Release-Zweig in master zusammenführen möchten, müssen Sie zuerst den Zweig relase release über den Master setzen.
Auf diese Weise wird Ihre Geschichte eine "saubere" Geschichte haben. Du wirst Äste um den ganzen Ort in einem Baum vermeiden und eine klare Linie von Commits bekommen.
Rebase wird alle "neuen" Dinge in Ihren Master-Zweig bringen. Wenn die Änderungen widersprüchlich sind, können Sie einfach die "Release" -Version Ihrer Datei ignorieren (aber Vorsicht, wenn Sie andere Dateien haben, die diese Änderungen benötigen), dann wird die Zusammenführung ohne Konflikte sein.
%Vor%Tags und Links git multiple-versions branching-and-merging