2013-03-05 12 views
6

Mam dwa zatwierdzenia w tej samej gałęzi, jedna po drugiej. Dodałem zmiany do pliku A do pierwszego zatwierdzenia, a następnie wprowadziłem pewne zmiany do innych plików, a następnie dokonałem kolejnego zatwierdzenia. Teraz chcę, żeby zmiany w pliku A były na drugim zatwierdzeniu, a nie na pierwszym. Jaki jest najbardziej elegancki sposób?Jak przenieść zmiany z jednego commitowania na drugi?

+1

można sprawdzić git rebase [tutaj] (https://git-scm.com/docs/git-rebase # _splitting_commits) – rumman0786

+0

To pytanie jest specjalnym przypadkiem "Squasha, który mój ostatni X popełnia razem używając Gita" https://stackoverflow.com/questions/5189560/squash-my-last-x-commits-together-using -git –

Odpowiedz

6

Jeśli są małe zobowiązuje, i zobowiązuje się zawsze powinny być małe w git, najprostszym sposobem jest git reset HEAD^^ a potem po prostu zrobić je ponownie. Zauważ, że każde rozwiązanie tego problemu wymaga przepisania historii, a jeśli już gdzieś wypchnąłeś te poprawki, nie powinieneś tego robić, jeśli nie wiesz, co robisz.

+2

"i zatwierdzenia powinny zawsze być małe w git" Pewnie ... – Betamos

0

W prawdopodobnie mało prawdopodobnym zdarzeniu, w którym zostały utworzone te zatwierdzenia, cofnij drugie zatwierdzenie za pomocą git reset HEAD^, a następnie dodaj zmiany do pierwszego zatwierdzenia z git commit --amend.

W bardziej prawdopodobnym zdarzeniu, w którym nastąpiło przeniesienie, a zatwierdzenia były w pewnym momencie w przeszłości, najlepszym rozwiązaniem jest ponowne przesyłanie. Nie znając dokładnej sytuacji, najlepiej jest powołać się na odwołanie, które wyjaśnia to dobrze.

Zarówno w pierwszym, jak i drugim wydarzeniu rozdział książki Pro Git o historii przepisywania dobrze wyjaśnia opcje - zarówno wtedy, gdy powinny być używane, jak i wtedy, gdy należy zachować ostrożność.

6.4 Git Tools - Rewriting History

3

napisałem skrypt do osiągnięcia tego celu. Możesz go wypiąć here.

Używanie skryptu byłoby tak proste, jak:

mv-changes HEAD~ HEAD fileA 
0

Innym rozwiązaniem tego problemu

  • Znajdź popełnić tuż przed dwoma zatwierdzeń (prawdopodobnie jest to gałąź master)
  • Wykonaj git rebase -i <commit before commits to be reordered> (git rebase -i master w większości przypadków)
  • W edytorze tekstu zamień kolejność zatwierdzeń (dla vima użyj sekwencji ence ddp podczas gdy na linii, które powinny poruszać się w dół)
  • Zapisz, zamknij i niech git rebase zrobić resztę
Powiązane problemy