Wie säubere ich meine Github-Gabel, damit ich saubere Pull-Anfragen stellen kann?

82

Ich habe ein Repository auf Github gespalten. Ich habe einige kleinere Änderungen vorgenommen und Pull-Anfragen an den Upstream gesendet, aber auf dem Weg ist meine Gabelung so verstümmelt, dass ich keine sauberen Pull-Anfragen generieren kann. Wenn ich eine Pull-Anfrage von einem Zweig mit sechs Änderungen starte, möchte Github dreizehn einreichen, von denen sieben bereits vorgelagert sind (Natch).

Mein Problem scheint darin zu liegen, nur die neuesten Commits abzurufen , aber wenn ich einen neuen Zweig erstelle und Commits auswähle, habe ich immer noch Extras. Ich habe mich auch mit Rebasing beschäftigt , aber jetzt sieht es so aus, als wäre sogar mein Master so durcheinander, dass ich keine saubere Kopie von Upstream generieren kann . Dies liegt anscheinend daran, dass ich nicht verstanden habe, dass ich neu aufbauen musste, anstatt zu verschmelzen . Ich habe also eindeutig Fehler gemacht. Ich versuche herauszufinden, wie ich diesen Knoten lösen und in einen sauberen Zustand zurückkehren kann, in dem ich mich nützlich vorwärts bewegen kann.

Ich möchte meine Gabel wegblasen und eine neue Gabel aus dem Upstream machen, aber ich denke, das ist auch schwierig.

Wie erhalte ich eine Github-Absolution, nachdem ich meine Git-Sünden gestanden habe?

pjmorse
quelle
1
Liebe dein Geständnis und deine Bitte um Freigabe :-)
Jon Kern
Was, es gibt Leute, für die Git keine Religion ist? ;-)
pjmorse

Antworten:

101

Schritt 1: Upstream-Änderungen vornehmen
Es wird empfohlen, das Upstream-Repo als "Upstream" hinzuzufügen, wie auf der Seite " Fork a Repo " erläutert :

git pull --rebase upstream master

Mit dieser --rebaseOption werden Ihre Änderungen ohne Zusammenführung auf das letzte Commit gesetzt.

Schritt 2: (Optional) Führen Sie Ihre Commits zu einem Commit zusammen

git reset --soft upstream/master

Dieser Befehl "macht" alle Ihre Commits rückgängig, ändert jedoch nicht die Dateien. So können Sie alle Ihre Änderungen in einem einzigen Commit festschreiben.

git commit -a

Schritt 3: Überprüfen und testen Sie Ihre Änderungen

Um zu zeigen , die Änderungen verwenden , um eine GUI wie der eingebauten in gitk, Sourcetree , TortoiseGit oder Turm ( gegen Entgelt) , usw.

Schritt 4: Drücken Sie

git pushwird einen Fehler auslösen, da der Push den Verlauf des Ziel-Repositorys ändern würde.
Wenn Sie sicher sind, dass die in Schritt 3 gezeigten Änderungen korrekt sind, drücken Sie mit "-f".

git push -f origin master


Zusätzliche Informationen
Der Befehl zum Hinzufügen einer Fernbedienung lautet:

git remote add upstream git://github.com/[username]/[project].git

Sie können auch von einer direkten URL abrufen:

git pull --rebase  git://github.com/[username]/[project].git

In den anderen Schritten benötigen Sie jedoch den Hash des neuesten Upstream-Commits anstelle von "Upstream / Master".

Bob Fanger
quelle
3
Vielen Dank. GitHub sollte sein Fork A Repo aktualisieren .
Buschtoens
Vielen Dank! Ich hatte zahlreiche Möglichkeiten ausprobiert, um dieses Problem zu lösen, nichts funktionierte. War kurz davor, meine Gabel wegzublasen, bevor ich diese Antwort fand ... und es funktionierte. Vielen Dank!
Judah Gabriel Himango
Hallo, @JudahHimango. Haben Sie auch den "Schritt 2" befolgt? Weil ich in der gleichen Situation bin wie du. Können Sie mir helfen.
Arunit21
Dies ist eine großartige Ressource. Vielen Dank!
Dr. Jan-Philip Gehrcke
Mein gegabeltes Repo sagte immer wieder, dass es nicht mit dem Upstream synchronisiert sei, also würde ich herunterziehen und zusammenführen - was zu Commits auf meiner Gabel führte, die nicht notwendig waren. Wenn Sie diesen Ansatz verwenden und den Push erzwingen, ist dies sortiert. Ich habe auch rebase verwendet, um einige meiner früheren Commits zu kombinieren: git rebase -i HEAD ~ n [wobei n die Anzahl der Commits ist]
The Coder
4

So wie ich es verstehe, ist es sowohl bei Git als auch bei Mercurial (ich habe nur letzteres verwendet, daher kann ich mich irren) überhaupt keine große Sache, eine Gabel wegzublasen und neu zu gabeln. Das mache ich die ganze Zeit mit meinen Projekten. Wenn Sie damit einverstanden sind (Ihre Änderungen sichern können oder keine wesentlichen Änderungen an Ihrer Gabel haben), würde ich sagen, dass dies wahrscheinlich der richtige Weg ist.

Denken Sie daran, dass mit DVCS durch das Verzweigen eines Repositorys ein vollständiger Klon des gesamten Repos erstellt wird . Wenn Sie Ihre aktuelle Gabel löschen und dann das ursprüngliche Repo erneut gabeln, haben Sie eine völlig saubere Tafel, von der aus Sie arbeiten können.

Sean Edwards
quelle
Fork ist in diesem Fall eine Besonderheit von Github, nicht Core Git, obwohl es Core Git-Funktionen verwendet. Es gibt spezielle administrative Github-Fähigkeiten, die Sie mit Github-Gabeln ausführen können.
Seth Robertson
1
Ah ich sehe. Ich benutze hauptsächlich BitBucket und dort ist "Fork" gleichbedeutend mit "Klon", wenn Sie mit persönlichen Arbeitskopien arbeiten. Ich werde meine Antwort trotzdem hier lassen, nur für den Fall.
Sean Edwards
Ja, ich habe meinen lokalen Klon gelöscht und bereits mehrmals neu geklont. Ich habe ein Experiment mit einem anderen Repo durchgeführt und es sieht so aus, als ob es kein Problem gibt, eine Gabel zu löschen und eine neue aus derselben Quelle zu erstellen.
pjmorse
NB Ich verwende git format-patch, um die Commits beizubehalten, die ich zuerst speichern möchte.
pjmorse
1
Das Löschen Ihres Forked-Repositorys und das Reforking sind nicht erforderlich, und git format-patchdas Speichern Ihrer Arbeit ist eine Art Umgehung aller hilfreichen Tools, die Git für die Verwaltung von Zweigen hat. In Zukunft ist es richtig, git rebase -iIhre Commits über dem neuen Upstream- masterZweig selektiv neu zu schreiben .
Mark Longair
0

Fügen Sie in Ihrem privaten Repo das Repo des Forkees als Fernbedienung hinzu. Setzen Sie Ihre Zweige von den Zweigen der Fernbedienung aus neu zurück. Machen Sie einen Kraftstoß auf Ihr Github-Repo.

Wenn Sie genaue Befehle benötigen, lassen Sie es mich wissen. Lassen Sie mich auch wissen, ob Sie versuchen möchten, lokale Commits beizubehalten, oder ob "wegblasen" in Ordnung ist.

Seth Robertson
quelle