Come posso dividere una git commit sepolta nella storia?
-
29-09-2019 - |
Domanda
I flubbed la mia storia e la voglia di fare alcune modifiche ad esso. Il problema è, ho un commit con due cambi non correlati, e questo impegno è circondato da alcuni altri cambiamenti nella mia storia locale (non premuto).
Voglio dividere questa commettere prima di spingere fuori, ma la maggior parte delle guide che sto vedendo hanno a che fare con il dividere la vostra più recenti commettere, o non impegnati cambiamenti locali. E 'fattibile per fare questo a un commit che è sepolto nella storia un po', senza la necessità di "ri-fare" i miei impegna da allora?
Soluzione
C'è una guida per commit spaccare nel rebase manpage . La sintesi è rapida:
-
Eseguire un rebase interattivo compreso l'obiettivo commit (per esempio
git rebase -i <commit-to-split>^ branch
) e segnare per essere modificato. -
Quando raggiunge REBASE che commettono, uso
git reset HEAD^
per ripristinare a prima del commit, ma mantenere intatto il vostro albero di lavoro. -
incrementale aggiungere modifiche e li commettono, rendendo il maggior numero di commit, se lo desideri.
add -p
può essere utile aggiungere solo alcune delle modifiche in un dato file. Usacommit -c ORIG_HEAD
se si vuole ri-utilizzare l'originale messaggio di commit per un certo commesso. -
Se si desidera verificare quello che stai commettendo (buona idea!) Uso
git stash
per nascondere via la parte che non hai commesso (ostash --keep-index
prima ancora di commit), prova, quindigit stash pop
di restituire il riposo per l'albero di lavoro. Continuare a fare impegna fino ad arrivare tutte le modifiche impegnati, vale a dire avere un albero di lavoro pulito. -
Esegui
git rebase --continue
procedere applicando i commit dopo l'ormai-split commit.
Altri suggerimenti
Ecco come farlo con Magit .
Say commettere ed417ae è quello che si desidera modificare; esso contiene due modifiche scollegate ed è sepolta sotto uno o più commit. Hit ll
per mostrare il registro, e passare a ed417ae:
Poi ha colpito r
per aprire il pop-up rebase
e m
per modificare il commit al punto.
Si noti come la @
ora c'è il commit si desidera dividere - che i mezzi HEAD è ora a che si impegnano:
Vogliamo spostare la testa al genitore, in modo da navigare al genitore (47e18b3) e hit x
(magit-reset-quickly
, legato a o
se si sta utilizzando evil-magit
) ed entrare a dire "sì significava commettere a punto". Il registro dovrebbe apparire così:
Ora, colpo q
per andare allo status Magit regolare, quindi utilizzare il comando regolare u
unstage a unstage ciò che non va nella c
primo commit, commettere il resto, come al solito, poi s
tage e c
ommit ciò che accade nel secondo impegnarsi, e quando è fatto: colpo r
per aprire il pop-up rebase
e un altro r
di continuare, e il gioco è fatto! ll
ora mostra:
Per dividere un commit <commit>
e aggiungere il nuova commettere prima di questo , e salva la data autore di <commit>
, - i passi sono i seguenti:
-
Modifica il commit prima
<commit>
git rebase -i <commit>^^
. NB: forse sarà necessaria anche per modificare
<commit>
così -
Cherry scegliere
<commit>
nell'indicegit cherry-pick -n <commit>
-
interattivo reimpostare le modifiche non necessarie dall'indice e ripristinare l'albero di lavoro
git reset -p && git checkout-index -f -a
In alternativa, basta riporre i cambiamenti necessari in modo interattivo:
git stash push -p -m "tmp other changes"
-
Apportare altre modifiche (se presente) e creare il nuovo commit
git commit -m "upd something" .
Facoltativamente, ripetere le voci 2-4 per aggiungere i commit più intermedi.
-
Continua rebasing
git rebase --continue
Se non si è ancora spinto, basta usare git rebase
. Ancora meglio, l'uso git rebase -i
a muoversi intorno impegna in modo interattivo. È possibile spostare l'incriminato impegnarsi per la parte anteriore, poi dividerlo come ti piace e spostare le patch di nuovo (se necessario).