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.

È stato utile?

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:

  1. Fare il pieno di prelievo ciliegia.
  2. git reset HEAD^ per convertire l'intero ciliegia raccolte commit in cambiamenti di lavoro unstaged.
  3. Ora git stash save --patch: in modo interattivo selezionare il materiale indesiderato per riporre
  4. .
  5. Git rollback delle modifiche stashed dalla copia di lavoro.
  6. git commit
  7. 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 è

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