Git - Gleiche Datei mit verschiedenen Versionen für zwei Zweige, wenn die Zusammenführung nicht überschrieben werden soll

9

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.

    
LongYang0806 24.02.2015, 08:59
quelle

2 Antworten

2

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 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:

%Vor%      

Und dann definieren Sie eine Dummy ours Merge-Strategie mit:

%Vor%      

Wenn Sie in dem anderen Zweig zusammenführen, anstatt Zusammenführungskonflikte zu haben   Mit der Datei database.xml sehen Sie etwa Folgendes:

%Vor%      

In diesem Fall bleibt database.xml bei der ursprünglichen Version   hatte.

Wenn Sie es auf Ihre Situation anwenden, erstellen Sie zuerst fileA

%Vor%

und machen Sie es speziell.

%Vor%

Jetzt erstellen wir einen repräsentativen release Zweig.

%Vor%

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 .

%Vor%

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.

%Vor%

Überprüfen Sie, ob fileA enthält, was wir erwarten.

%Vor%

Zusammenführen Feature B von master .

%Vor%

Die Zeile Auto-merging fileA ist ein Hinweis darauf, dass etwas Besonderes passiert ist. Tatsächlich:

%Vor%

Wie es funktioniert

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.

    
Greg Bacon 22.12.2017 19:16
quelle
0

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%     
Woody 15.12.2017 19:04
quelle