Ho due rami (A e B) e voglio unire un singolo file dal ramo A con un singolo file corrispondente dal ramo B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Ho due rami (A e B) e voglio unire un singolo file dal ramo A con un singolo file corrispondente dal ramo B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Risposte:
Mi sono imbattuto nello stesso problema. Per essere precisi, ho due rami A
e B
con gli stessi file ma una diversa interfaccia di programmazione in alcuni file. Ora i metodi di file f
, che sono indipendenti dalle differenze di interfaccia tra i due rami, sono stati cambiati in ramo B
, ma la modifica è importante per entrambi i rami. Quindi, ho bisogno di unire solo il file f
del ramo B
nel file f
del ramo A
.
Un semplice comando ha già risolto il problema per me se presumo che tutte le modifiche vengano eseguite in entrambi i rami A
e B
:
git checkout A
git checkout --patch B f
Il primo comando passa al ramo A
, nel punto in cui voglio unire B
la versione del file f
. Il secondo comando corregge il file f
con f
of HEAD
of B
. È anche possibile accettare / scartare singole parti della patch. Invece di B
te puoi specificare qualsiasi commit qui, non deve essere HEAD
.
Modifica comunità : se il file f
su B
non esiste A
ancora, ometti l' --patch
opzione. Altrimenti, otterrai un "Nessun cambiamento". Messaggio.
git checkout --patch B -- f
per farlo funzionare.
a
durante la fase interattiva, invece di premere y
ogni volta. O usa git checkout B -- f
invece il comando.
Ecco cosa faccio in queste situazioni. È un kludge ma funziona bene per me.
Ho provato a patchare e la mia situazione era troppo brutta per questo. Quindi in breve sembrerebbe così:
Ramo di lavoro: A Ramo sperimentale: B (contiene file.txt con le modifiche che voglio piegare.)
git checkout A
Crea un nuovo ramo basato su A:
git checkout -b tempAB
Unisci B in tempAB
git merge B
Copia l'hash sha1 dell'unione:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Dai un'occhiata al tuo ramo di lavoro:
git checkout A
Guarda il tuo file fisso:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
E lì dovresti averlo. Commetti il tuo risultato.
A
è spostato B
dall'inizio, in altri modi. La copia sovrascriverà quelle differenze.
Questo utilizza il difftool interno di git. Forse un po 'di lavoro da fare ma diretto.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(etichetta argomento vuota), git checkout docs: ARGUMENT DISAMBIGUATION dire: "usa git checkout -- <pathspec>
se vuoi controllare questi percorsi fuori dall'indice". Questo perché potresti avere sia un ramo che un file / percorso con lo stesso nome. In questi casi, invece di chiederti di non chiarire se il ramo o il percorso debbano essere estratti quando entrambi esistono, git sceglierà di controllare il ramo per impostazione predefinita. Tuttavia, se --
precede, git verificherà invece il file / percorso.
Ho trovato questo approccio semplice e utile: come "unire" file specifici da un altro ramo
A quanto pare, ci stiamo sforzando troppo. Il nostro buon amico Git Checkout è lo strumento giusto per il lavoro.
git checkout source_branch <paths>...
Possiamo semplicemente dare a git checkout il nome del ramo della caratteristica A e i percorsi dei file specifici che vogliamo aggiungere al nostro ramo principale.
Si prega di leggere l'intero articolo per una maggiore comprensione
-p
opzione in quel comando. Che quindi, sovrascrive tutte le parti del tuo file di worktree che in precedenza hanno deviato dal ramo da cui stai estraendo, prima delle modifiche della patch, sfortunatamente.
Puoi usare:
git merge-file
Suggerimento: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
Il seguente comando confronterà (1) il file del ramo corretto, con master (2) ti chiederà in modo interattivo quali modifiche applicare.
git checkout --patch master
La mia modifica è stata respinta, quindi allego come gestire qui l'unione delle modifiche da un ramo remoto.
Se devi farlo dopo un'unione errata, puoi fare qualcosa del genere:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Supponendo che B sia l'attuale ramo:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Si noti che ciò applica solo le modifiche al file locale. Dovrai impegnarti in seguito.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Puoi verificare la vecchia versione del file da unire, salvandola con un nome diverso, quindi eseguire qualunque sia il tuo strumento di unione sui due file.
per esempio.
git show B:src/common/store.ts > /tmp/store.ts
(dove B è il nome della filiale / commit / tag)
meld src/common/store.ts /tmp/store.ts
Lo farò come
git format-patch branch_old..branch_new file
questo produrrà una patch per il file.
Applica patch sul target branch_old
git am blahblah.patch