2017-05-05 10 views
0

Ich arbeitete auf Master-Zweig und wusste das nicht. Ich habe ein lokales Commit 'a' gemacht. Danach habe ich git pull, die commit 'b' gebracht. Danach machte ich ein weiteres lokales Commit 'c'. So, jetzt ist mein HEAD am Commit 'c'. Wie erstelle ich einen anderen Zweig mit den Commits 'a' und 'c'? Im Wesentlichen sollten diese Commits vom lokalen Master entfernt und in den neuen Zweig gestellt werden.git create branch mit bestimmten commits

Danach muss ich eine Pull-Anfrage erstellen, indem Sie diesen Zweig drücken.

+0

Mögliche Duplikat [git: wie ein Zweig der Wurzel zwei Commits zurück zu bewegen] (http://stackoverflow.com/questions/43531189/git-how-to-move-a-branchs-root-two -commits-back) –

+0

Ihre Situation ist ein wenig komplizierter als der obige Link. Hoffentlich gibt es Ihnen noch einen Ausgangspunkt. –

Antwort

1

Dafür gibt es viele Möglichkeiten in GIT. Hier ist noch einer. Nach Ihrem Beispiel und unter der Annahme, dass Sie sind momentan in Master-Zweig können Sie:

  1. einen Zweig erstellen Sie möchten aus dem letzten „angemessen“ arbeiten begehen (wahrscheinlich derjenige, bevor Sie erscheint tat Ihre begehen ‚a‘, lassen Sie es X nennen, es wird etwas SHA1 in der Realität):

    git checkout -b mygoodbranch X

  2. Jetzt schaltet automatisch auf diesen Zweig und sicher (nur um Verständnis machen), dass das letzte Commit ist in der Tat X. Um das letzte Commit zu sehen, geben Sie folgendes ein und überprüfen Sie:

    git log -1

  3. Seine Zeit nur Ihre Commits irgendwie zu bewegen, nicht wahr? In git ist der Zweig nur ein Zeiger auf das Diagramm der Commits. Deshalb ist die Filialerstellung billig und schnell, BTW. Erstellen Sie einfach einen weiteren Zeiger auf eines der Commits, wenn Sie eine Verzweigung erstellen. Wir werden hier mit Rosinenpickerei gehen. Dieser Begriff bedeutet im Grunde genommen, dass Sie einfach jedes beliebige Commit und "Cherry-Pick" zu Ihrem Zweig nehmen können. Das Commit hat die gleiche Nachricht, aber unterschiedliche SHA1. So werden wir SHA1-s nur Ihrer commits a und c hier identifizieren (Sie brauchen nicht wirklich commit b, weil Sie Ihre Niederlassung sauber von anderen Commits halten wollen, richtig)? Während auf Zweig mygoodbranch Typ ist:

    git cherry-pick <sha1 of a>

    git cherry-pick <sha1 of b>

    Überprüfen Sie das Ergebnis:

    git log -3

    Sie, dass in der Tat jetzt sehen werden, dass Ihr Zweig enthält eine verpflichtet und c, aber sie haben eine andere SHA1 als die ursprünglichen Commits. Es ist wichtig zu diesem Zeitpunkt zu verstehen, dass git denkt, dass ein Original und ein in Ihrem Zweig unterschiedliche Commits sind (weil die gleichen Commits dasselbe sha1 haben und dies offensichtlich nicht der Fall ist). Aber wen interessiert das, wir werden Master "zurücksetzen", um X zu committen, und es wird keine Original-Commits mehr enthalten.Was wir tun werden, ist der Zeiger des Meisters „HEAD“ (der aktuelle Master-Zweig-Zustand) zu bewegen, X zu begehen, das hat also werden wir:

  4. Schalter zurück

    git checkout master

  5. zu meistern
  6. Execute tatsächliche Reset:

    git reset --hard x_sha1

  7. überprüfen Sie die Ergebnisse (während auf Master natürlich zu sein):

    git log -1

    Fertig! Ich weiß, das war viel längere Erklärungen als meine Kollegen zur Verfügung gestellt. Ich wollte nur zeigen, dass Git viele verschiedene Optionen hat, um das zu erreichen, was Sie wollen, und Sie können immer das finden, das für Sie am besten funktioniert.

+0

Also wenn ich in Schritt 5 'Git reset --hard' mache, setzt es den Kopf mit dem Remote-Kopf zurück? und wenn ich 'git log -1' in Schritt 6 mache, sollte ich die SHA von commit b sehen? – nishant

+0

Sorry ist ein Formatierungsproblem in SO wahrscheinlich. Ich meinte, dass der letzte Parameter sha1 von commit x ist. Git Reset wird nur den Zeiger dorthin bewegen, wo du es sagst. Hoffe das hilft –

0

Für einige Tipps siehe git: how to move a branch's root two commits back. Im Grunde schlage ich vor, einen neuen Zweig beim aktuellen Master zu erstellen, den Master auf seinen ursprünglichen Commit zurückzusetzen, dann das Update zum Master zu ziehen und den neuen Zweig neu zu erstellen, um seinen Verlauf zu Ihrer Zufriedenheit zu bearbeiten.

Verwandte Themen