2016-01-28 20 views
6

Si consideri il seguente problema:Squash prima N commette della storia git/mantenere il resto come è

  • Privato Progetto contenente alcune credenziali nelle prime fasi
  • Vogliamo andare open source
  • Abbiamo bisogno per sbarazzarsi di credenziali nella storia
  • le credenziali non sono in file singoli, ma nel codice
  • storia complicata con diverse unioni, tirare le richieste ecc

Quello che voglio fare:

squash tutti i commit dalla radice fino ad un arbitrario impegnarsi con pulito stato ad un grande 'iniziale commettere'.

Quando faccio:

git rebase -i --root 

e squash la prima impegna insieme:

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

devo rebase tutto e risolvere tutti i conflitti si fondono ancora una volta dopo.

Come posso semplicemente schiacciare i primi N commit senza dover risolvere l'intera cronologia compresi i conflitti di merge dopo il commit N + 1.

+0

Sfortunatamente, non c'è modo di riscrivere l'intera cronologia. Questo perché quando clean2 ottiene il suo nuovo genitore (il commit schiacciato), il suo hash cambia. Ciò significa che clean3 ha un nuovo genitore, che modifica il suo hash e così via e così via. –

+0

Questo sarebbe ok. Vorrei solo non dover risolvere nuovamente ogni conflitto di unione manualmente. – MaxNoe

+0

Ho svalutato la tua domanda ma ritengo che dovrai affrontare le risoluzioni dei conflitti per ogni commit successivo nella cronologia. Anche se non l'ho mai usato, sospetto che questo sarebbe un caso d'uso per https://www.kernel.org/pub/software/scm/git/docs/git-rerere.html –

risposta

0

È possibile utilizzare git-rerere per riutilizzare le stesse risoluzioni di conflitto.

L'unico svantaggio è che dovrete risolverli ancora una volta dopo il abilitare la rerere prima che possa riutilizzare automaticamente le risoluzioni.

Problemi correlati