2010-11-04 10 views
5

Nie znam dobrze Git i dla jednego z naszych repozytoriów popełniłem błąd.Git rozgałęzia się ze starszej wersji i cofa bieżącą gałąź.

Zobowiązałem się i pchnąłem zmiany do oddziału o nazwie "core". Ale wtedy zdałem sobie sprawę, że moje zmiany nie powinny tam być - powinienem był stworzyć nowy oddział kilka wersji temu, powiedzmy "core-experimental".

Aby wyjaśnić, mam:

A---B---C---D---E  "core" 

Ale teraz chcę go zmienić na

A---B    "core" 
    \ 
    C---D---E  "core-experimental" 

nikt inny w moim zespole wyciągnął jeszcze moje zmiany, więc wszelkie powraca zrobić shouldn Nikomu nie sprawiają bólu.

Czy to możliwe dla Gita?

Odpowiedz

9

Pozostałe dwie odpowiedzi działać dobrze, ale rzeczywiście można uniknąć konieczności zrobić coś w swoim drzewie pracy:

# create core-experimental using core as starting point 
git branch core-experimental core 
# move core 
git branch -f core <SHA1 of B> 

W ten sposób można zrobić nawet jeśli masz lokalne modyfikacje w drzewie roboczym i bez aktualizowania znaczników czasu podczas kasowania/resetowania, które spowodują konieczność przebudowania (zakładając, że jest to skompilowany projekt).

+0

Fajnie, to jest ten rodzaj małego dodatku, który poleruje moje git-fu – Benjol

+0

Używam robienia Ruby/Pythona/niezkładanych rzeczy, więc gram w gęste, gęste znaczniki czasu w pliku; ta sugestia jest lepsza. –

+0

@Adam: Tak, nigdy nie jestem pewien. Czasami "reset - ostro" jest wolny, czasami w dużym skompilowanym projekcie, resetowanie/pobranie trwa 20 sekund i wymusza 10-minutową kompilację. Jeszcze jedno wyróżnienie: 'reset' wstawi do reflagów" : aktualizując HEAD ", podczas gdy' branch -f' wstawi "branch: Reset to ". – Cascabel

6
git checkout core 
git branch core-experimental 
git reset --hard <SHA of B> 
git push -f <remote> core 

Albo bardziej opisowo ...

  1. Zamówienie rdzeń
  2. Tworzenie gałęzi eksperymentalnej w HEAD rdzenia
  3. zresetować rdzenia HEAD z powrotem do miejsca, gdzie chcesz go
  4. Wymusza naciśnięciem rdzeń aktualizacji
+0

To działało dobrze, nawet z rdzeniem zepchniętym do źródła (co miałem, w przeciwieństwie do pytającego). –

1

W rdzeniu:

git branch core-experimental 
git reset --hard <revision-B> 

A potem:

git push -f 
Powiązane problemy