GIT: so erzwingen Sie einen merge-commit zu einem übergeordneten
Im GIT, habe ich zwei Filialen und zwei commits:
A(master)---B(branch "topic")
- der LEITER der branch 'master' ist ein commit für Eine
- der LEITER der Niederlassung 'Thema' ist commit B
- Begehen, Ein Eltern-commit B
Ich würde gern ein merge-commit C, die in der "Thema" - Zweig (es hätte A und B als Eltern). (Ich weiß, dass das komisch wirkt und dass der merge-commit leer wäre.)
A(master)---B---C (branch "topic")
\-------------/
Habe ich es geschafft diese zu erstellen merge-commit in eine zu komplexe Art und Weise (siehe unten). Gibt es eine einfachere Möglichkeit, diese zu erstellen merge-commit?
Dank für Eure Antworten!
Ausgangszustand:
$ git init plop
Initialized empty Git repository in /tmp/plop/.git/
$ cd plop/
$ git commit -m "Initial commit (commit A)" --allow-empty
[master (root-commit) a687d4e] Initial commit (commit A)
$ git checkout -b topic
Switched to a new branch 'topic'
$ git commit -m "Some work on my topic branch (commit B)" --allow-empty
[topic d4d1c71] Some work on my topic branch (commit B)
$ #OK, we now reached the initial state
Einige versucht:
$ git merge master #Does not work
Already up-to-date.
$ git merge --no-ff -s ours master #Does not work
Already up-to-date.
Gibt es ein einfacher Weg, um Folgendes zu erreichen?
$ #Let's try another way (too complex!)
$ git checkout master
Switched to branch 'master'
$ git merge --no-ff topic
Already up-to-date!
Merge made by recursive.
$ git checkout topic
Switched to branch 'topic'
$ git merge master
Updating d4d1c71..641e7ae
Fast-forward
$ git checkout master
Switched to branch 'master'
$ git reset --hard HEAD^1
HEAD is now at a687d4e Initial commit
$ git checkout topic
Switched to branch 'topic'
$ git log #This is what I wanted to reach
commit 641e7aeb614d9b49796e8f11abd3a0290ac08b40
Merge: a687d4e d4d1c71
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:52:41 2011 +0200
Merge branch 'topic'
commit d4d1c71c87b94335c8852ab7675cbb663965ef7d
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:50:11 2011 +0200
Some work on my topic branch (commit B)
commit a687d4eb88b9f6d661122a5766dd632dd462fbaa
Author: xxx <yyy.zzz>
Date: Sat Jul 23 12:49:52 2011 +0200
Initial commit (commit A)
- Warum wollen Sie das tun? Es macht keinen Sinn. Erstellen Sie einen neuen commit auf
master
würde verschmelzen intopic
möglich wäre (und es auch macht Sinn). - Hier ist ein möglicher Anwendungsfall für die Zusammenführung und Vorfahren verpflichtet: Stell dir vor, der Zweig enthält einige änderungen an einer Datei (- e. g. es ist eine Art von downstream branch), in der wir jetzt zurückkehren möchten. Doing eine einfache
git revert
machtgit blame
nach diesem Attribut werden alle zurückgesetzt Linien, um die revert-commit, aber es wäre eher hilfreich, Sie zu haben, zurückzuführen auf den upstream. Macht einen revert commit " - und markieren es als ein verschmelzen mit dem upstream erreicht dies. - gute Frage. hier ist ein Beispiel, warum Sie wollen, zu tun, denn jeder Fragen "WARUM". Ich habe eine
gh-pages
Niederlassung, die über eine integrierte Google docs und dist/prod Dateien, die überprüft werden-in nur auf die Branche, bedeutete für die Bereitstellung. Meinedev
- Filiale wurde vormaster
, und ich verschmolzendev -> gh-pages
und wieder aufgebaut und dann eingesetzt. aber dann merkte ich, dass ich F würde, weil ich möchte, dass meine master-build bereitgestellt werden, nicht meine Entwicklung zu bauen. Also ichcheckout gh-pages
und versuchtmerge --no-commit master
aber es alerts "Bereits up-to-date." Zwingt einen downstream (leer) merge wäre hilfreich in dieser situation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPD: Saubere Art und Weise zu tun, die gleiche Sache, ohne messing mit sha1 direkt:
Oder auch one-line-Befehl:
Für details, was das ist tut - Lesen ganze Antwort 🙂
Ich bin vollkommen einverstanden mit anderen, dass es keinen Sinn für mich, aber wenn Sie es wirklich wollen - es ist möglich, mit low-level-Sanitär-Befehle, wie unten beschrieben.
Zuerst von all, sollten Sie wissen sha1 Ihrer Eltern verpflichtet. Ich nehme an, B hat comment 'ändern aus dem Thema', Ein Kommentar hat 'ändern von master -' und wir sind derzeit auf B (Thema-Zweig).
Dann sollten Sie wissen sha1-Beton Baum Objekt commit B:
So ist es
867f31c455a371756ec353b54d755f51d98d62c4
. Und schließlich sollten Siegit commit-tree
Befehl:Beachten Sie, dass ich verwendet, pipeline-Umleitung als
git-commit-tree
nimmt commit-Kommentar vonstdin
stream. Erste param ist Baum sha1-wir haben mitgit cat-file
und zwei andere sind verpflichtet' sha1-wir haben mitgit log
.Ausgabe von Befehl wird der sha1-Hash neu erstellt merge-commit. Nun möchten Sie schnell-vorwärts-topic-Zweig es:
Das ist alles. Sie haben, was Sie wollten.
git merge master --no-ff
- git Antworten 'Bereits up-to-date.'cur=$(git rev-parse HEAD); git reset master; git merge --no-ff $cur -m 'merge master into topic'
git merge
tun würde, wenn es sich nicht weigern zu laufen.Macht es nur Sinn, um ein merge-commit, wenn es gibt einen Unterschied zwischen
master
undtopic
- wenn Sie auseinander gehen. In Ihrem Fall, es gibt nichts zu merge -topic
verfügt bereits über allemaster
's begeht, so git nicht zulassen, dass Sie erstellen Sie einen Seriendruck, der tut nichts.Es funktioniert gut, wenn Sie einen commit in
master
das ist nicht intopic
:Was in...
Zusammenführen anders herum funktionieren sollte:
Rechts jetzt sind Sie auf das Thema Niederlassung, und da es ein direkter Nachkomme der Meister, die Fusion mit master macht keinen Sinn, weil Thema enthält alle änderungen der master hat. Allerdings hat der Meister keine der änderungen, die Thema hat.
Wenn Sie checkout master und dann merge Thema in master, master sollte schnell vorwärts und aktualisieren den KOPF zu stellen.
Gibt es keine offizielle Lösung zu diesem problem gibt es einen workaround. Überprüfen Sie heraus den commit, der
master
auf, so dass Sie in freistehende LEITER Zustand. Dann Begehen Sie eine leere Begehen. Dann überprüfen Sie Ihretopic
verzweigen und Zusammenführen in das leere Begehen.