2012-05-25 8 views
9

Ich habe mehrere Feature-Zweige und einen Master-Zweig. Feature2 ist fertig. Normalerweise würde ich umbauen (mit einem entfernten SVN Repo arbeiten und möchte die Historie behalten, also keine reguläre Zusammenführung) und ff-mergen. Aber da sich Master seit meiner Verzweigung nicht geändert hat, möchte ich den Masterkopf (unter E) zu G verschieben. Die Verwendung von git branch -f master G führt zu keinen sichtbaren Änderungen, ich nehme an, dies liegt daran, dass sich G in einem anderen Zweig befindet.Master-Kopf zu einem Zweig bewegen

Ist es sicher, stattdessen git update-ref -f master G hier zu verwenden? Sollte ich bei rebase/ff-merge bleiben? Etwas noch besser?

feature1  C-D 
      /
master A-B-E    
       \      
feature2  F-G 

Vielen Dank.

+1

Was mit einer regelmäßigen vorspulen merge von 'G' falsch in' master'? Keine Notwendigkeit, neu zu erstellen. Sie würden die Historie behalten, und Sie würden ein gerades Diagramm bekommen ('A-B-E-F-G'). – ellotheth

+0

aah, die offensichtlichkeit davon! Das Diagramm sieht genauso aus wie nach einer Rebase. Ich frage mich, warum ich jemals über etwas anderes nachgedacht habe. Möchten Sie sie als Antwort erneut eingeben? – kostja

+0

Die Verzweigung feature2 hat bereits eine "gerade Grafik" - benenne feature2 einfach in master (oder verschiebe master in feature2)! – GoZoner

Antwort

5

Eine regelmäßige Zusammenführung von G in Master wird es tun, rebase keine Notwendigkeit zu:

feature1  C-D 
       /
    master A-B-E    
        \      
    feature2  F-G 

git checkout master 
git merge feature2 

    feature1    C-D 
         /
    master, feature2 A-B-E-F-G 
0

Es kann am besten sein, eine nicht schnelle Vorwärtszusammenführung von Feature 2 in Master durchzuführen, indem Sie git merge --no-ff feature2 verwenden, wenn Sie den Masterzweig ausgecheckt haben. Sie sollten am Ende folgende

feature1  C-D 
      /
master A-B-E-----H   
       \ /     
feature2  F-G 
+0

Ich möchte regelmäßige Vermischung auf Master vermeiden, wo möglich, um die Geschichte zu halten, sagte ich so in der Frage. Und warum denken Sie, dass ein No-ff-Merge besser geeignet ist als ref move? – kostja

11

Sie müssen die Zweige nicht zusammenführen, ein Reset ist genug. Unter der Annahme, Master ausgecheckt ist:

git reset --hard feature2 
+2

Ein Reset entspricht in diesem Fall funktional einem Fast-Forward-Merge. – ellotheth

+1

Funktioniert wie beworben, danke Magnus. – kostja

+0

nach fünf Minuten Suche nach der Antwort, versuche ich dies und es funktioniert. einfach und in der Reflexion erwartet. Vielen Dank! –

1

Der Update-ref ist sicher. Ein Filialkopf ist nichts weiter als ein kleines "Lese mich!" Tag hing an einem Commit. Es ist rein konventionell, dass git es aufhebt und es manchmal auf ein anderes Commit hinlegt.

git Zweig -f Master G nicht in irgendwelchen sichtbaren Veränderungen führt

Was sagt git log --decorate --oneline --all? git show master?

+0

Mein Fehler, ich habe die falsche SHA für 'git Branch Master SHA' eingegeben. Es hat funktioniert. – kostja

6

Keine Zusammenführung erforderlich - Benennen Sie die Zweige einfach um. Da Sie sich weder für feature2 ('is done') noch für den existierenden Master ('E') interessieren, brauchen Sie nur folgendes.

git branch -d master 
git branch -m feature2 master 

Einfach ist besser?

Denken Sie daran, es gibt zwei wichtige Konzepte beteiligt: ​​

  1. Die Git Graph begehen, und
  2. Das Git verweist

Wenn Sie eine Zusammenführung zu tun (in verschiedenen Geschmacksrichtungen und einschließlich Fütterungsmaterial) Sie ändern das Commit-Diagramm. Die Änderungen beinhalten das Hinzufügen von Knoten, das Hinzufügen von Links oder das Verschieben von Links. Verweise (einschließlich Verzweigungen und Tags) zeigen nur auf Commits, und das Ändern eines Verweises ändert nur das angegebene Commit - nicht die Struktur des Graphen.

Also, in Ihrem Fall ist keine Änderung an der Struktur erforderlich, nur eine Änderung der Referenzen.

eine einzeilige Version ist:

git branch -f master feature2 

, die um den Zweig feature2 hält (im Gegensatz zu dem Stand der zwei-liner, die feature2-Achsen).

+1

Danke, GoZoner. Nette Alternative, an die ich nicht gedacht habe. Aber ich glaube, ich bleibe in meinem Fall bei ff-merge. – kostja

+0

Siehe hinzugefügtes Detail in Bearbeitung. – GoZoner

+0

scheint lokal zu arbeiten. Aber wie schiebe ich die Änderungen auf den Remote-Server? Es klagt über eine Nicht-Fast-Forward-Merge – josinalvo