Desidero ripristinare le modifiche apportate da un particolare commit solo a un determinato file.
Posso usare il comando git revert per questo?
Qualche altro modo semplice per farlo?
Desidero ripristinare le modifiche apportate da un particolare commit solo a un determinato file.
Posso usare il comando git revert per questo?
Qualche altro modo semplice per farlo?
Risposte:
Il modo più pulito che ho visto per farlo è descritto qui
git show some_commit_sha1 -- some_file.c | git apply -R
Simile alla risposta di VonC ma utilizzando git show
e git apply
.
fatal: unrecognized input
-3
flag a git apply per l'unione a tre vie quando la patch fallisce, poiché di solito correggo una modifica un po 'indietro nel tempo.
some_file.c
includere il percorso del file se ce n'è uno, altrimenti non
Supponendo che sia corretto modificare la cronologia del commit, ecco un flusso di lavoro per annullare le modifiche in un singolo file in un commit precedente:
Ad esempio, vuoi annullare le modifiche in 1 file ( badfile.txt
) nel commit aaa222
:
aaa333 Good commit
aaa222 Problem commit containing badfile.txt
aaa111 Base commit
Ripeti il commit di base, modifica il commit del problema e continua.
1) Avvia rebase interattivo:
git rebase -i aaa111
2) Contrassegna il commit del problema per la modifica nell'editor cambiando pick
in e
(per la modifica):
e aaa222
pick aaa333
3) Ripristina le modifiche al file danneggiato:
git show -- badfile.txt | git apply -R
4) Aggiungi le modifiche e modifica il commit:
git add badfile.txt
git commit --amend
5) Termina il rebase:
git rebase --continue
edit
non venivano visualizzati come modificati. Ma ha git show -- badfile.txt | git apply -R
dato la risposta di cui avevo bisogno <3
git revert
è per tutti i contenuti dei file all'interno di un commit.
Per un singolo file, puoi scrivere uno script :
#!/bin/bash
function output_help {
echo "usage: git-revert-single-file <sha1> <file>"
}
sha1=$1
file=$2
if [[ $sha1 ]]; then
git diff $sha1..$sha1^ -- $file | patch -p1
else
output_help
fi
(Dalle utilità git-shell-scripts di smtlaissezfaire )
Nota:
un altro modo è descritto qui se non è ancora stato eseguito il commit della modifica corrente.
git checkout -- filename
git checkout
ha alcune opzioni per un file, modificando il file da HEAD, sovrascrivendo la modifica.
Dropped.on.Caprica menziona nei commenti :
Puoi aggiungere un alias a git in modo da poter fare
git revert-file <hash> <file-loc>
e ripristinare quel file specifico.
Vedi questo succo .
[alias]
revert-file = !sh /home/some-user/git-file-revert.sh
git revert-file <hash> <file-loc>
e ripristinare quel file specifico. Ho sollevato da questa risposta (anche se ho dovuto apportare un paio di modifiche per funzionare correttamente). Puoi trovare una copia del mio .gitconfig
script modificato qui: gist.github.com/droppedoncaprica/5b67ec0021371a0ad438
Vorrei semplicemente utilizzare l' --no-commit
opzione git-revert
e quindi rimuovere i file che non si desidera vengano ripristinati dall'indice prima di eseguirne il commit. Ecco un esempio che mostra come ripristinare facilmente solo le modifiche a foo.c nel secondo commit più recente:
$ git revert --no-commit HEAD~1
$ git reset HEAD
$ git add foo.c
$ git commit -m "Reverting recent change to foo.c"
$ git reset --hard HEAD
Il primo git-reset
"rimuove lo stage" da tutti i file, in modo che possiamo quindi aggiungere nuovamente solo un file che vogliamo ripristinare. Il finale git-reset --hard
elimina i restanti file ripristinati che non vogliamo mantenere.
Molto più semplice:
git reset HEAD^ path/to/file/to/revert
poi
git commit --amend
e poi
git push -f
il file è andato e il commit di hash, messaggio, ecc. è lo stesso.
git checkout -- path/to/file/to/revert
passaggio? Inoltre, non è vero che l'hash è lo stesso dopo, giusto? L'ultima frase potrebbe essere migliore come qualcosa del tipo: "Il risultato è che l'ultimo commit viene sostituito da uno nuovo che differisce solo per il fatto che non contiene le modifiche al file ripristinato."
git reset HEAD^ path/to/file/to/revert/in/commit
Il comando precedente toglierà il file dal commit, ma si rifletterà in git status
.
git checkout path/to/file/to/revert/in/commit
Il comando precedente annullerà le modifiche (di conseguenza otterrai il file uguale a HEAD).
git commit
(Passare --amend
per modificare il commit.)
git push
Con questo, il file che è già nel commit viene rimosso e ripristinato.
I passaggi precedenti dovrebbero essere seguiti dal ramo in cui viene effettuato il commit.
Puoi seguire questa procedura:
git revert -n <*commit*>
( -n
annulla tutte le modifiche ma non le impegna)git add <*filename*>
(nome del / dei file che vuoi ripristinare e salvare)git commit -m 'reverted message'
(aggiungi un messaggio per il ripristino)Se desideri ripristinare le modifiche su un file dal tuo ultimo commit, questo è quello che sto usando di solito. Penso che questa sia la soluzione più semplice.
Si noti che il file verrà aggiunto all'area di staging.
git checkout <prev_commit_hash> -- <path_to_your_file>
Spero che sia d'aiuto :)