2016-01-28 8 views
6

Rozważmy następujący problem:Squash pierwszy N zobowiązuje historii git/zachować resztę jak

  • prywatny projekt zawierający pewne poświadczenia we wczesnych stadiach
  • Chcemy przejść open source
  • musimy pozbyć mandatów w historii
  • poświadczenia nie są w pojedynczych plików, ale w kodzie
  • Skomplikowana historia z kilkoma zlepia wyciągnąć wnioski itp

Co chcę zrobić:

Squash wszystkie zobowiązuje od nasady aż do arbitralne popełnić z czysty stan na jeden wielki „wstępny popełnić”.

Kiedy zrobić:

git rebase -i --root 

i squash pierwszy popełni razem:

pick Initial commit \ 
fixup dirty1  | 
fixup dirty2  | Squash these to one, to remove credentials. 
fixup dirty3  | 
fixup clean1  /
pick clean2 
pick clean3 
... 
... 

muszę rebase wszystko i rozwiązać wszystkie konflikty scalania ponownie później.

Jak mogę po prostu zgnieść pierwsze N ​​commitów bez konieczności rozwiązywania całej historii, w tym konfliktów scalania po zatwierdzeniu N + 1.

+0

Niestety, nie ma sposobu na przerobienie całej historii. Dzieje się tak dlatego, że gdy clean2 otrzyma nowego rodzica (ang. Squashed commit), jego zmiany mieszania. Oznacza to, że clean3 ma nowego rodzica, który zmienia swój skrót i tak dalej. –

+0

To byłoby w porządku. Po prostu nie chciałbym ponownie rozwiązywać każdego konfliktu scalania. – MaxNoe

+0

Podniosłem twoje pytanie, ale sądzę, że będziesz musiał uporać się z rozwiązaniami konfliktów dla każdego kolejnego zatwierdzenia w historii. Chociaż nigdy go nie używałem, podejrzewam, że byłoby to przydatne w przypadku https://www.kernel.org/pub/software/scm/git/docs/git-rerere.html –

Odpowiedz

0

Możesz użyć git-rerere, aby ponownie wykorzystać te same rozdzielczości konfliktów.

Jedynym minusem jest to, że będziesz musiał je jeszcze raz rozwiązać po, co pozwoli ponownie wznowić proces, zanim będzie mógł automatycznie ponownie wykorzystać uchwały.

Powiązane problemy