Wie setze ich den Git-Master-Zweig auf den Upstream-Zweig in einem gegabelten Repository zurück?

97

Ich habe den Hauptzweig meines gegabelten Git-Repos völlig durcheinander gebracht.

Ich möchte den Master-Zweig, der mit dem Inhalt des Upstream-Master-Repos auf meine Gabel geschoben wurde, vollständig zurücksetzen. Ich habe kein Interesse daran, Änderungen oder die Historie des Hauptzweigs beizubehalten.

Der einfachste Ansatz wäre gewesen, mein gespaltenes Repo und meine Refork aus dem Upstream-Projekt zu löschen. Ich habe jedoch Arbeit in anderen Push-Branchen, die ich nicht verlieren möchte.

Wie setze ich also meinen Push-Master-Zweig mit dem Upstream-Master zurück?


git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

Wohin gehe ich von hier aus, um meine lokalen und Remote-Master-Zweige mit dem Upstream-Master zurückzusetzen?

Fossfreiheit
quelle

Antworten:

186

Sie können Ihren lokalen Hauptzweig auf die Upstream-Version zurücksetzen und in Ihr Repository übertragen.

Angenommen, "Upstream" ist das ursprüngliche Repository und "Ursprung" ist Ihre Gabel:

# ensures current branch is master
git checkout master

# pulls all new commits made to upstream/master
git pull upstream master

# this will delete all your local changes to master
git reset --hard upstream/master

# take care, this will delete all your changes on your forked master
git push origin master --force

(Sie können das ursprüngliche Repo als "Upstream" mit definieren git remote add upstream /url/to/original/repo.)

Johannes Barop
quelle
1
Es sollte wahrscheinlich auch sein git reset --hard upstream/master, das Arbeitsverzeichnis zurückzusetzen. Aber Ihre Antwort ist trotzdem richtig.
6.
Die Nichtverwendung von "--hard" funktioniert auch unter Beibehaltung lokaler Änderungen. Ich würde den Hard-Reset in einem sperierten Schritt durchführen, um möglicherweise das Diff zu inspizieren.
Johannes Barop
1
Das war sehr hilfreich.
Aleem S
4
Müssen git fetch upstreamzuerst anrufen
Henry E
3
Wie @HenryE bemerkt, führt das Versäumnis, Upstream-Änderungen zuerst mit abzurufen, git fetch upstreamnormalerweise zu dem folgenden nicht vom Menschen lesbaren Fehler:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry
5

Dies würde Ihren Master-Zweig mit dem Upstream-Master zurücksetzen. Wenn der Zweig seit Ihrem Verzweigen aktualisiert wurde, werden auch diese Änderungen übernommen.

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS: Angenommen, Upstream ist das Original-Repo, während Origin Ihre Kopie ist.

Bhavesh Gupta
quelle
Es scheint, als hätten Sie Ihren Zweig aus einem anderen Commit erstellt. Der Hauptgrund für die Neugründung ist die Aufrechterhaltung einer linearen Projekthistorie. Das heißt, Sie sollten Commits niemals neu starten, sobald sie in einem öffentlichen Repository veröffentlicht wurden, da dies alte Commits durch neue ersetzt. Weitere Informationen finden Sie unter atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167
0

Ich habe die Methode so ausprobiert:

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

Die Ausgabe zeigt eine Warnung:

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Der richtige Weg ist also git pullvorher festgelegt git reset:

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

dann wird die Ausgabe wie folgt sein:

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.
Chetabahana
quelle