Jak zresetować gałąź główną git do gałęzi upstream w repozytorium rozwidlonym?


108

Całkowicie zepsułem główną gałąź mojego rozwidlonego repozytorium git.

Chcę całkowicie zresetować gałąź główną, która została wypchnięta na mój fork, z zawartością głównego repozytorium głównego. Nie interesuje mnie zachowywanie żadnych zmian ani historii gałęzi głównej.

Najprostszym podejściem byłoby usunięcie mojego rozwidlonego repozytorium i ponowne uruchomienie z projektu. Jednak mam pracę w innych pchanych gałęziach, których nie chcę stracić.

Jak więc zresetować moją wypchniętą gałąź główną za pomocą głównego mastera?


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

Gdzie mam przejść z tego miejsca, aby zresetować lokalne i zdalne odgałęzienia główne z nadrzędnym serwerem głównym?

Odpowiedzi:


204

Możesz zresetować lokalną gałąź główną do wersji upstream i wypchnąć ją do swojego repozytorium.

Zakładając, że „upstream” to oryginalne repozytorium, a „źródło” to rozwidlenie:

# 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

(Oryginalne repozytorium można zdefiniować jako „upstream” za pomocą git remote add upstream /url/to/original/repo.)


1
Prawdopodobnie powinno być git reset --hard upstream/masterrównież zresetowanie katalogu roboczego. Jednak twoja odpowiedź jest poprawna.
j6t

1
To było bardzo pomocne.
Aleem S

4
git fetch upstreamNajpierw trzeba zadzwonić
Henry E

4
Jak zauważa @HenryE, nieudane pobranie wcześniejszych zmian i git fetch upstreamzazwyczaj powoduje następujący błąd nieczytelny dla człowieka:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry,

1
Uważaj tylko, aby wymuszone wypychanie automatycznie zamykało wszystkie otwarte żądania ściągnięcia, które wykonałeś dla nadawcy. Nie byłam tego świadoma, co było pewnym zaskoczeniem.
Frank Buss

5

Spowoduje to zresetowanie gałęzi głównej z głównym wzorcem, a jeśli gałąź została zaktualizowana od czasu rozwidlenia, również te zmiany zostaną usunięte.

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

PS: Zakładając, że Upstream to oryginalne repozytorium, podczas gdy źródło to twoja kopia.


Wyglądałoby to tak, jakbyś utworzył swoją gałąź z innego zatwierdzenia. Głównym powodem zmiany bazy jest zachowanie liniowej historii projektu. To powiedziawszy, nigdy nie powinieneś zmieniać bazy zatwierdzeń po ich opublikowaniu w publicznym repozytorium, ponieważ zastępuje to stare zatwierdzenia nowymi. Aby uzyskać szczegółowe informacje, zobacz atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167

0

Wypróbowałem taką metodę:

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

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

na wyjściu pojawi się ostrzeżenie:

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>...]'

Więc poprawny sposób jest umieszczony git pullprzed git reset:

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

wtedy wynik będzie taki:

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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.