2013-09-02 16 views
6

Mam dwa kolejne zatwierdzenia, gdzieś w historii lokalnej, a jeden plik został błędnie dodany do drugiego. Chcę naprawić sytuację.Przenoszenie plików między zatwierdzeniami

Nie rozumiem, jak powinienem używać interaktywnego rebase. Zrobiłem git rebase -i HEAD~10 i wybrałem, aby edytować zatwierdzenie z plikiem, aby go sprawdzić. Używam git guit, ale nie widzę plików w obszarze zatwierdzania. Mogę zmienić poprzednie zatwierdzenie, a potem pliki. Ale nie mogę dodać niewłaściwie umieszczonego pliku do poprzedniego zatwierdzenia, ponieważ nie widzę pliku w bieżącym zatwierdzeniu, aby rozpocząć.

+0

Należy pamiętać, że zmiana dotychczasowego zatwierdzenia powoduje przepisanie historii, a od tego zatwierdzenia uzyskuje się zupełnie nowe wartości skrótów.Nie rób tego, jeśli zatwierdzenie jest już opublikowane. – aragaer

+0

@aragaer Mam celowo zastrzegłem, że przepisuję historię _LOCAL_. – Val

Odpowiedz

8

Jeśli nie to źle, co chcesz to przenieść pewne zmiany, które zostały zawarte popełnić 2 popełnić 1.

znajdę Najprostszym sposobem na to jest robić dwóch kolejnych rebases interaktywne.

W pierwszym dzieli się zatwierdzenie 2 na dwa zatwierdzenia: pierwszy zawiera tylko zmianę, którą chce się przenieść, a drugi zawiera całą resztę. Teraz zatwierdzamy 1, 2.1 i 2.2.

Wtedy rebase ponownie i tym razem wybrać zgnieść popełnić 2.1 do 1.

16

Tak więc, podczas zmiany nazwy, wybierz edycję zarówno zatwierdzenia, w którym dodałeś plik przez pomyłkę, jak i tego, do którego chcesz go dodać w tej kolejności. Jeśli plik jest w późniejszym zatwierdzeniu, ale powinien znajdować się we wcześniejszym, musisz zmienić kolejność linii. Na przykład, zacznę

pick 8de731b Commit with missing file. 
pick bbef925 Commit with too many files. 
pick 52490ce More history. 

muszę go zmienić na

edit bbef925 Commit with too many files. 
edit 8de731b Commit with missing file. 
pick 52490ce More history. 

Następnie,

# In the commit containing an extra file 
git reset HEAD^ badfile.c 
git commit --amend 
git rebase --continue 

# Now in the commit to add it to 
git add badfile.c 
git commit --amend 
git rebase --continue 

Niestety, podczas edycji historii w jednej gałęzi, nie wiem od jakikolwiek sposób, aby uniknąć edycji historii we wszystkich gałęziach. Rebase powinno być wykonane tak wcześnie, jak to możliwe, aby uniknąć takich problemów. W moim prostym przypadku Tutaj mogę połączyć master i drugi oddział, ale nie dopuszcza, scalanie, to muszę rebase master i uporządkować i Squash zobowiązuje, tak:

pick 7cd915f Commit with missing file. 
fixup 8de731b Commit with missing file. #This was the higher of the two entries 
pick 8b92c5a Commit with too many files. 
fixup bbef925 Commit with too many files. #This was the higher of the two entries 
pick 94c3f7f More history. 
fixup 52490ce More history. #This was the higher of the two entries 

późnego edit: Po prostu zauważyłem, że przypadkowo zmieniłem historię commitów jako przeniesienie z mojej oryginalnej odpowiedzi. Zamiana linii w bazie danych zmienia kolejność, którą zatwierdzasz; po zakończeniu edycji możesz ponownie dokonać ponownego podziału i zamienić je, aby powrócić do pierwotnej kolejności zatwierdzania.

+0

Plik bad został dodany później, a nie za wcześnie. Czy mówisz, że powinienem stworzyć nowy oddział w punkcie historii? – Val

+0

Udało mi się przenieść plik w nowym oddziale, który miał drugie zatwierdzenie na górze. Ale mam problem z ponownym umieszczeniem całej historii na szczycie tej gałęzi. Wydaje się, że dwa zobowiązania głównego konfliktu z dwoma zobowiązaniami nowego oddziału. – Val

+0

Zaktualizowałem odpowiedź, ale niestety jedynym sposobem, w jaki mogę to naprawić, jest edycja historii we wszystkich gałęziach, w taki czy inny sposób. – dwarduk

5

Jak często natknąć się ten problem, napisałem skrypt do tego. Działa w pełni automatycznie. Można go znaleźć na Github. Skopiuj go do lokalnego systemu plików, dodaj go do PATH i będziesz w stanie uruchomić go jako:

mv-changes <source-commit> <destination-commit> <path>... 

Można również uruchomić skrypt w powłoce Bash Git na Windows.

Należy pamiętać, że w przypadku zmian <path> w pośrednich zatwierdzeniach między source-commit i destination-commit, to nie zadziała.

Więcej informacji podano pod numerem here.

+0

To naprawdę nie działa w pełni automatycznie, ponieważ wyskakuje edytor, ale jest świetny. Dzięki.. – Hunsu

Powiązane problemy