Frage

Ich machte dem Meister ein paar Commits und erkannte nach der Tatsache, dass sie in einem Zweig hätten sein sollen.

Ich habe mir verschiedene Dinge über das Wiederherstellen und Zusammenführen des Meisters angesehen. Aber keine Manipulationsversuche haben eine Geschichte erbracht, die aussieht, was ich versuche zu tun.

Meine Versuche führen mich zu der Überzeugung, dass es eine Kombination aus erfordert rebase --onto und reset --hard Um den Meister in die Zeit zurück zu bewegen. Aber mein Verständnis von Gits Verzweigung lässt etwas zu wünschen übrig. Ein Teil davon ist zu lernen, wie ich es benutzen kann.

Sollte beachtet werden, dass keine der Änderungen, die ich zu bewegen versuche, herausgedrängt wurde.

Aktuell

  * remote/trunk
--o--a--b--c--d--e--f     <- master
  |
  o                       <- remote branch foo

Gewünschtes Ergebnis

  * remote/trunk
--o                       <- master
  |
  o--a--b--c--d--e--f     <- remote branch foo
War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob das Umbenennen der Zweige die richtige Lösung ist, da Sie von:

  * remote/trunk
--M--a--b--c--d--e--f     <- master
  |
  F                       <- remote branch foo

zu:

--F                       <- master
  |
  M--a--b--c--d--e--f     <- remote branch foo
  * remote/trunk

(Vorausgesetzt, Sie umbenennen remote/foo, was nicht ratsam ist: Sie sollten es zuerst verfolgen und dann umbenennen, aber obwohl das Endergebnis von dem unterscheidet, was Sie benötigen.

Dies ist nicht das "gewünschte Ergebnis", das Sie wollen (Foo muss von F beginnen, nicht von m):

  * remote/trunk
--M                       <- master
  |
  F--a--b--c--d--e--f     <- remote branch foo

Sie können das nur durch a erreichen rebase --onto

git checkout --track -b origin/foo  # create a local branch named after the remote one
git branch tmp                      # mark current foo HEAD to 'F'
git branch -f foo master            # put foo where it should b: at 'f'
git branch -f master tmp^           # reset master to M, parent of tmp
git checkout tmp                    # go to where we must replay the commits
git rebase --onto tmp master foo    # replay a to f on top of tmp
git svn dcommit                     # push the local foo in order to update remote/foo

dir geben:

  * remote/trunk
--M                             <- master
  |
  F--a'--b'--c'--d'--e'--f'     <- local foo and remote branch foo

Andere Tipps

Eine Variation von Martins Antwort, die nicht unbedingt auf Ihre Situation anwendbar ist, aber ich möchte sie trotzdem posten :)

Angenommen, Sie haben vergessen, den Zweig bei Commit zu erstellen o, Also hast du:

x--y--z--o--a--b--c--d--e--f  master
         |
         +
   [forgot to make a branch here]

Und dann wurde Ihnen klar, dass das, was Sie wirklich wollten, war:

x--y--z--o   master
         |
         +--a--b--c--d--e--f  topic

Was Sie in diesem Fall tun können, ist, einen Zweig bei zu erstellen o mit seinem Hash: Hash:

git branch topic # creates new branch 'topic' - will be at commit `f`
git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash)
git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`)

Sie werden in der Master Branch sein (Commit o), also können Sie als letzter Schritt:

git checkout topic

Der Hash kann natürlich nur die ersten 5 Zeichen sein.

BEARBEITEN

Es sollte nicht viel wichtig sein, was Sie verwenden git-svn, was wirklich wichtig ist, ist, dass Sie Ihre Master -Filiale danach zu keinem Zeitpunkt veröffentlicht haben o

Ein Zweig in Git ist wirklich nichts anderes als ein Zeiger auf einen Commit. Deshalb ist die Verzweigung so billig: Sie erstellen nur einen Zeiger und haben einen Zweig.

Ich weiß jedoch nicht, dass Sie Remote -Zweige verfolgen. Möglicherweise müssen Sie dies nach dem Umbenennen/Bewegen Ihrer Zweige einrichten.

Fast korrekt, was Hase J vorschlägt, aber ich musste ein paar kleine Modifikationen vornehmen (und ich verwende Git-SVN):

# create the branch with your commits
git branch performance
# fork the master to a new branch at the commit before your local, non pushed commits
git branch newmaster 2d0516dfe8252de87
# checkout your branch 
git checkout performance
# rename the newmaster
git branch -M newmaster master
# now checkout the master
git checkout master

Sie können eine Filiale nicht umbenennen, in der Sie sich befinden, also habe ich die Performance -Filiale ausgecheckt, in der ich meine Commits bewegt habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top