Parzialmente ciliegia-picking un commit con Git
-
20-09-2019 - |
Domanda
Sto lavorando su 2 rami diversi: stampa e sviluppo .
Ho notato che ho ancora bisogno di integrare alcuni cambiamenti che sono stati commessi al stampa ramo di nuovo nel sviluppo ramo.
Il problema è non ho bisogno di tutto il commit, solo alcuni grossi pezzi in alcuni file, quindi un semplice
git cherry-pick bc66559
non fare il trucco.
Quando faccio un
git show bc66559
Posso vedere il diff, ma non so davvero un buon modo di applicare, che in parte al mio albero di lavoro corrente.
Soluzione
La cosa principale che si sta andando a voler qui è git add -p
(-p
è sinonimo di --patch
). Questo fornisce un modo interattivo per il check-in dei contenuti, che ti permette di decidere se ogni pezzo dovrebbe andare in, e anche che ti permette di modificare manualmente la patch, se necessario.
Per utilizzarlo in combinazione con il cherry-pick:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Grazie a Tim Henigan per avermi ricordato che git-cherry-pick ha un --no-commit opzione, e grazie a Felix Rabe per aver ricordato che è necessario reimpostare! Se si desidera solo per lasciare un paio di cose del commit, si potrebbe usare per git reset <path>...
unstage solo quei file.)
È possibile, naturalmente, fornire percorsi specifici per add -p
se necessario. Se stai iniziando con una patch si potrebbe sostituire la cherry-pick
con apply
.
Se si vuole veramente una git cherry-pick -p <commit>
(questa opzione non esiste), il vostro possibile utilizzare
git checkout -p <commit>
Che diff la corrente commettere contro il commit si specifica, e permetterà di applicare grossi pezzi da quel diff singolarmente. Questa opzione può essere più utile se il commit si sta tirando in è unire i conflitti in una parte del impegnano non siete interessati a (Si noti, tuttavia, che si differenzia da checkout
cherry-pick
:. checkout
cerca di applicare i contenuti di <commit>
del tutto, vale cherry-pick
il diff della specificato commettere dal suo genitore. Ciò significa che checkout
possibile applicare più di solo che si impegnano, che potrebbe essere più di quello che vuoi.)
Altri suggerimenti
So che sto rispondendo una vecchia questione, ma sembra che ci sia un nuovo modo di fare questo con interattivo check-out:
git checkout -p bc66559
Posso interattivo raccogliere grossi pezzi di un altro git commit ?
Supponendo che le modifiche desiderate sono a capo del ramo si desidera che le modifiche rispetto, l'uso git checkout
per un singolo file:
git checkout branch_that_has_the_changes_you_want path/to/file.rb
per più file chain solo daisy:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
Mike Monkiewicz risponde, è possibile anche specificare un singolo o più file alla cassa dal SHA1 / filiale in dotazione.
git checkout -p bc66559 -- path/to/file.java
Questo vi permetterà di scegliere in modo interattivo le modifiche desiderate di aver applicato alla versione corrente del file.
Se si desidera specificare un elenco di file sulla riga di comando, e ottenere il tutto fatto in un unico comando atomica, provare:
git apply --3way <(git show -- list-of-files)
--3way
: Se una patch non si applica in modo pulito, Git crea un conflitto di unione in modo da poter eseguire git mergetool
. Tralasciando --3way
farà Git rinunciare a chiazze che non applicano in modo pulito.
Se "in parte cherry picking" significa "all'interno dei file, la scelta di alcuni cambiamenti, ma scartando gli altri", può essere fatto portando in git stash
:
- Fare il pieno di prelievo ciliegia.
-
git reset HEAD^
per convertire l'intero ciliegia raccolte commit in cambiamenti di lavoro unstaged. - Ora
git stash save --patch
: in modo interattivo selezionare il materiale indesiderato per riporre .
- Git rollback delle modifiche stashed dalla copia di lavoro.
-
git commit
- Buttare via la scorta di modifiche indesiderate:
git stash drop
.
Suggerimento: se si dà la scorta di modifiche indesiderate un nome:. git stash save --patch junk
poi se si dimentica di fare (6) ora, in seguito sarà possibile riconoscere la scorta per quello che è