2017-05-31 3 views
1

Ich versuche, Commits loswerden, aber nicht sicher, wie es geht. Ich lese viel über Git Reset und Git Rebase, aber immer noch nicht verstanden. Die meisten Leute mussten das letzte Commit löschen/rückgängig machen. Das versuche ich nicht.Git Reset oder Rebase - Entfernen von Commits aus der Vergangenheit

Um besser zu verstehen, was ich tun möchte: Ich arbeitete auf Zweig X und wollte es dann zum Master zusammenführen. Aber ich habe bemerkt, dass ich beim 5. Commit viel Code hinzugefügt habe, der nicht mein war (es war Framework). Es macht das Überprüfen von Änderungen zwischen X und Master sehr schwierig. Also überprüfe ich das 5. Commit als neuen Zweig Y und möchte 4 vorherige Commits loswerden und dann zum Master zusammenführen. Auf diese Art und Weise, wenn create pull request mit der Verzweigung X hoffentlich wird die 5. commit nicht als Änderungen gesehen, bin ich hier richtig? Wenn ja, muss ich noch diese 4 Commits entfernen, die keine Historie hinterlassen, um keine Merge-Konflikte zu bekommen.

Also, wenn Typ git log auf Zweig Y ich so etwas wie dieses:

git log 
commit: A1 
commit: A2 
commit: A3 
commit: A4 
commit: A5 

Wie entferne ich verpflichtet A2-A5 keine Spur von ihnen zu verlassen? Ist das, was ich versuche, sinnvoll?

+0

Sie können 'git Squash'. –

Antwort

1

Es scheint, dass Sie branchY nur mit commit A1 erstellen und dann in master zusammenführen möchten, bevor die Pull-Anforderung, die Zweig in Master zusammenführt, zusammengeführt wird. Sie unten Art und Weise verwenden können:

Angenommen, die ursprüngliche Zweigstruktur wie unter dem Diagramm sieht, und Sie Pull-Anforderung erstellt, wenn branchX Punkt A1 war, master Zweig war Punkt E.

A---B---C---D---E    master 
     \ 
      A5---A4---A3---A2---A1 branchX 

finden Sie dann die Eltern verpflichten, die branchX erstellt wurde (wie C im Diagramm zu begehen).So können Sie branchY erstellen aus C begehen und dann die 5.-Kirsche pflücken commit (A1) darauf:

git checkout -b branchY <commit id for C> 
git cherry-pick <commit id for A1> 

Dann Geschichte der begehen wird wie folgt aussehen:

  A1'     branchY 
     /
A---B---C---D---E     master 
      \ 
      A5---A4---A3---A2---A1 branchX 

Schließlich können Sie branchY verschmelzen master:

git checkout master 
git merge branchY 
git push origin master 

Die merge alsauf master Zweig commitin folgenden Diagramm:

  __ A1'___    branchY 
     /  \ 
A---B---C---D---E---F    master 
      \ 
      A5---A4---A3---A2---A1 branchX 

Jetzt Ihre Anfrage Pull branchX in master Zweig Verschmelzung wird F und A1 Änderungen zwischen Version vergleichen (die Rahmen Änderungen werden nicht verglichen werden).

0
git reset HEAD~N 

Dabei ist N die Anzahl der Commits, die Sie zurücksetzen möchten. Nach dieser Operation finden Sie in Ihrer Arbeitsverzeichnis-Datei, die Sie in Commit A1 haben, aber ohne Ihre Commits.

Wenn Sie add . und dann git commit haben Sie ein neues Commit und alte N Commit verloren gehen.

Ich bevorzuge die Verwendung von Rebase. Wenn ich an neuen Features arbeite, öffne ich immer neue Zweige. Ich begehe alle 5/6 Minuten. Als ich die Aufgabe abzuschließen, wenn meine Zweig master Zweig zusammengeführt werden müssen betreibe ich den Befehl

git rebase - i master 

Danach habe ich Squash alle begehen, aber die erste. Schließlich habe ich nur einen Commit. Ich hoffe das hilft dir.