2012-04-09 15 views
6

Modyfikuję kod kogoś innego (nie-git). Ściągnąłem oryginał, doszedłem do moich modyfikacji, wskoczyłem do pistoletu i zmodyfikowałem jego wersję jako pierwsze zatwierdzenie. To był błąd, powinienem dodać oryginalny pobrany kod jako moje pierwsze zatwierdzenie.(jeszcze inna) modyfikuj historię git, aby dodać pierwsze zatwierdzenie

Następnie na domiar zlego, dodałem oryginalny kod jako odgałęzienie od mojej pierwszej edycji .. Innymi słowy jest to duży bałagan teraz :(

W prostych słowach, co mam wygląda jak niebieski wykres poniżej. C5 jest rzeczywista oryginalny kod, C1, C2-C6 są moje stopniowe modyfikacje (C4 jest zbędny). wolałbym zielona moja historia.

enter image description here

Wszelkie pomysły jak zmienić historię, aby to osiągnąć?

Dzięki wielu,

chytry

+0

odciąłem C6 i kolejne, ale wszelkie przyszłe zobowiązania mają oczywiście podążać w obecnym stanie. – sly

+0

Zastanawiam się, czy może po prostu być czystszym, aby przywrócić każde zatwierdzenie do jego własnego folderu i zacząć od zera za pomocą 'init', a następnie skopiować po każdej wersji i' commit' w odpowiedniej kolejności. To nie jest rozwiązanie git, ale jest to obejście, które może być szybsze. –

+2

Dzięki Randolph. Jestem jednak bardzo zainteresowany rozwiązaniem git, aby się o tym dowiedzieć. (istnieje również internetowe - ale nie udostępnione - lustro, które chcę tylko popchnąć i zakończyć) – sly

Odpowiedz

9

Zrobiłem to całkowicie w linii poleceń, ale zamierzam wstawić screeny z SourceTree celu zilustrowania tego, co się dzieje.

najpierw uzyskać pierwsze 7 lub 8 cyfr popełnić ID (50da9c3) od C5 popełnić i umieścić w schowku lub na dysku w TextEdit czy coś - trzeba go później

Dla potwierdzenia, Oto nasza stan startu:

enter image description here

Oto kroki, aby dostać się tam, gdzie chcesz:

Utwórz nowy non-zakorzenione oddział rozpocząć budowę zobowiązuje off nazwie bazy

git symbolic-ref HEAD refs/heads/base 

teraz usunąć wszystkie pliki i katalogi z git

git rm --cached -r . 

teraz, że wszystkie pliki są „untracked” usunąć je z lokalnego katalogu roboczego

git clean -d --force 

teraz utworzyć popełnić z niczym w nim (to będzie zobowiązanie, na którym wszystko inne zostanie zbudowane).

git commit --allow-empty -m'Initial Commit' 

Twój drzewo powinno wyglądać tak teraz:

enter image description here

Teraz cherry pick C5 commit (co miałeś w schowku)

git cherry-pick 50da9c3 

enter image description here

Teraz ponownie zarchinizuj gałąź master na oddział baza

git rebase --onto base --root master 

enter image description here

Teraz można usunąć bazę i C4-C5 oddziały

git branch -d base 

enter image description here

git branch -D c4-c5branch 

enter image description here

Należy pamiętać, że "Wstępne zatwierdzenie" to puste zatwierdzenie bez plików, więc nie dajcie się oszukać. Zatwierdzenie C5 jest w rzeczywistości pierwszym zatwierdzeniem opartym na treści.

+1

było to niezwykle użyteczne. Dziękuję Ci! – sly

+0

Cieszę się, że mogę pomóc. –

+1

jeszcze raz dziękuję! – Benoit

Powiązane problemy