Volevo avere una soluzione semplice per mettere insieme due commit di unione durante un rebase interattivo.git rebase interattivo: l'unione di squash si impegna insieme
mio repository sembra:
X --- Y --------- M1 -------- M2 (my-feature)
/ / /
/ / /
a --- b --- c --- d --- e --- f (stable)
Cioè, ho un ramo my-feature
che è stata fusa per due volte di recente, senza alcun reale impegna in mezzo. Io non voglio solo rebase al ramo my-feature
dal momento che è un ramo pubblicato proprio, voglio solo schiacciare insieme gli ultimi due si fondono impegna in uno (non hanno ancora pubblicato i commit)
X --- Y ---- M (my-feature)
/ /
/ /
a --- ... -- f (stable)
ho provato:
git rebase -p -i M1^
Ma ho ottenuto:
Refusing to squash a merge: M2
Quello che ho finalmente fatto è:
git checkout my-feature
git reset --soft HEAD^ # remove the last commit (M2) but keep the changes in the index
git commit -m toto # redo the commit M2, this time it is not a merge commit
git rebase -p -i M1^ # do the rebase and squash the last commit
git diff M2 HEAD # test the commits are the same
Ora, il nuovo commit di unione non è più considerato un commit di unione (ha mantenuto solo il primo elemento principale). Quindi:
git reset --soft HEAD^ # get ready to modify the commit
git stash # put away the index
git merge -s ours --no-commit stable # regenerate merge information (the second parent)
git stash apply # get the index back with the real merge in it
git commit -a # commit your merge
git diff M2 HEAD # test that you have the same commit again
Ma questo può complicarsi se ho molti commit, avete una soluzione migliore? Grazie.
Mildred
Beh, quando si fai la tua seconda unione, puoi sempre usare '--squash' per evitare di creare un commit, e quindi usare' git commit --amend' per modificare la precedente unione. – Mildred
Questo non funzionerà, non salverà la nuova versione del ramo da cui è stato effettuato il commit nel commit – Mildred