2015-02-27 20 views
7

Mam oddział A i oddział B (i kilka innych oddziałów).Git: zresetować/przywrócić całą gałąź do stanu innej gałęzi?

Powiedzmy „s popełnić historia wygląda następująco:

  • popełnić 5
  • popełnić 4
  • popełnić 3
  • ...

I B Historia zmian:

  • inny popełnienia
  • popełnienia 4
  • seryjnej innych rzeczy, z gałęzi C (w branży B)
  • popełnienia 3
  • ...

Zasadniczo co chcę, to "usunąć" wszystkie zmiany wprowadzone przez zatwierdzenie inne zatwierdzenie i Scalenie innych rzeczy z oddziału C do oddziału B.

Chcę drzewo roboczą oddział B być drzewo działa dokładnie tak samo jak oddział „s.

Jak to osiągnąć?

Odpowiedz

9

Jednym ze sposobów osiągnięcia tego jest git reset. Podczas gdy na oddział B wykonać

git reset --hard A 

Następnie oddziały B punktów na głowę-commit A. Opcja --hard resetuje indeks i drzewo robocze, tak aby wszystkie śledzone pliki zostały zresetowane do wersji w gałęzi A. Stary head-commit z A jest kopiowany do .git/ORIG_HEAD, aby umożliwić cofnięcie zmiany.

Alternatywnie - choć nie na oddział B - można usunąć gałąź B i ponownie stworzył go tak:

git branch -d B  # delete branch B 
git branch B A  # re-create branch B and let it point to the commit of branch A 

Inne niż pierwsza sugestia, to zostawić drzewo indeksu i pracy nietknięte.

+0

dzięki. reset --hard A jest dokładnie tym, czego szukałem. Jednak: jak mogę wypchnąć to (zresetowany oddział) z powrotem do miejsca pochodzenia? pochodzenie zaprzecza popychaniu, ze względu na rozbieżne zatwierdzenia. – daniel451

+1

Możesz dodać opcję '--force' do polecenia' push', aby nadpisać zdalną gałąź. Ale powinieneś zdawać sobie sprawę z konsekwencji, na przykład opisane [tutaj] (http://stackoverflow.com/questions/21259585/other-consequences-of-git-push-force) lub [tutaj] (http://stackoverflow.com/questions/23432788/git-push- za kulisami). –

3

Jeśli chcesz, aby Twój oddział wyglądał dokładnie jak oddział A. Możesz po prostu wykonać tę operację, uważając, aby w takim przypadku stracić zatwierdzenie.Twoja gałąź-B będzie wyglądać dokładnie jak gałąź-A, niezależnie od tego, jakie zobowiązania zostały wprowadzone do gałęzi B, które nie były obecne w gałęzi-A, zostanie utracone. Również jeśli gałąź B jest współdzielona z innymi osobami, nie zaleca się wykonywania tej operacji.

W takim przypadku można spróbować cofnięcia zobowiązuje nie chcesz w branży-B

git revert <sha-of-"some other commit"> 
git revert <sha-of-"merge of other stuff from branch C (into branch B)"> 

Drugi popełnić wygląda seryjnej popełnić więc może trzeba przejść rodzica, jak również.

git revert <sha-of-"merge of other stuff from branch C (into branch B)"> -m1 
Powiązane problemy