2016-09-26 2 views
1

Ich habe einen anderen Repo gegabelt, um Pull-Requests dafür zu erstellen. In dem hier beschriebenen Zeitraum trägt niemand anderes zu diesem Repo bei.Warum haben Rebase und Hard Reset unterschiedliche Ergebnisse gebracht?

Meine ersten Commits sende ich als eine Pull-Anfrage an den Remote-Repo. Dies wird akzeptiert. Meine zweite Pull-Anforderung weist Fehler auf, die behoben werden müssen, aber dies erfordert, dass die Dateien in einen vorherigen Zustand zurückversetzt werden, da ich die Formatierung abgebrochen habe, da mein Editor sie in ein anderes Format ändert.

Dies scheint etwas zu sein, für das ich rebase verwenden kann. Wenn ich jedoch "git rebase upstream/master" benutze, während mein Master-Zweig ausgecheckt ist, wird mir gesagt, dass der aktuelle Zweig-Master auf dem neuesten Stand ist. Mein Zweig ist derzeit ein Commit vor dem Upstream, und mein Verständnis von Rebase ist, dass es HEAD auf meinem Zweig zum letzten Commit in dem Zweig verschieben sollte, gegen den ich rebasiere.

Während reading the documentation zu sehen, was ich falsch gemacht hatte, bemerkte ich, dass "git reset --hard" das gleiche tun sollte. Also habe ich "git reset --hard upstream/master" gemacht und dies hat den gewünschten Effekt, HEAD auf die akzeptierte Pull-Anforderung von mir zu verschieben.

Meine Frage ist, dass beide dasselbe tun sollen, warum habe ich unterschiedliche Ergebnisse bekommen?

+0

Nein, das ist nicht was Rebase tut. Es dauert eine Commit, die Sie angeben (remote HEAD oder was auch immer) und _replays_ Ihre lokalen Commits darüber. –

+1

Lesen Sie den Abschnitt BESCHREIBUNG von 'git help rebase' sorgfältig durch. Da gibt es gute Beispiele. 'rebase' soll nicht dasselbe tun wie' reset --hard'. –

Antwort

0

Allerdings, wenn ich "Git Rebase Upstream/Master" verwenden, während meine Master-Zweig ausgecheckt ist, wird mir gesagt, "Aktuelle Zweig Meister ist auf dem neuesten Stand."

Die master oben auf upstream/master wiederholen würde, was bedeutet, dass es nichts zu tun, ist seit upstream/master Commits bereits Teil master ist.

Normalerweise, wenn Sie eine PR einreichen, möchten Sie diejenigen sind fertig auf dem die meisten up-to-date Upstream-Master-Zweig sicher sein, die aktualisierte Original Repo Bedeutung (die gegabelten wurde)

git checkout my_PR_branch 
git fetch upstream 
git rebase upstream/master 

Dies setzt voraus, dass Ihre PR in einem Zweig statt master erfolgt.
Wurde Ihre PR auf master getan, dann:

  • einen Zweig von Ihrem aktuellen master erstellen: git branch mypr; git push -u origin mypr; # Machen Sie eine neue PR aus dieser Branche.
  • Setzen Sie Ihren Master auf origin/master zurück: git fetch und git reset --hard origin/master.
+0

Aber in diesem Fall ist mein Master-Zweig ein Commit vor dem Upstream/Master. Dieses Commit wurde als PR eingereicht, aber nicht akzeptiert. Und wenn es nichts zu tun gibt, warum macht ein Hard-Reset etwas? – Quitch

+0

@Quitch Genau: Sie müssen Rebase, dann zwingen drücken Sie diesen Zweig zu Ihrer Gabelung: die PR wird aktualisiert. – VonC

+0

@Quitch wie für Master, Sie können es tatsächlich auf Upstream-Master zurücksetzen. Aber der Punkt ist: wir sprechen über zwei verschiedene Zweige: eine (für die PR), um Rebase, und eine (Master) zurückgesetzt werden. – VonC

Verwandte Themen