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?

È stato utile?

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. Usa commit -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 (o stash --keep-index prima ancora di commit), prova, quindi git 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:

accesso iniziale

Poi ha colpito r per aprire il pop-up rebase

popup 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:

modifica di un commit

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ì:

log dopo il reset

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 stage e commit ciò che accade nel secondo impegnarsi, e quando è fatto: colpo r per aprire il pop-up rebase

popup rebase

e un altro r di continuare, e il gioco è fatto! ll ora mostra:

all log fatto

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:

  1. Modifica il commit prima <commit>

    git rebase -i <commit>^^
    

    . NB: forse sarà necessaria anche per modificare <commit> così

  2. Cherry scegliere <commit> nell'indice

    git cherry-pick -n <commit>
    
  3. 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"

  4. 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.

  5. 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top