Come mantenere il file locale o il file remoto durante l'unione usando Git e la riga di comando?


195

So come unire le modifiche usando vimdiff, ma, supponendo che so solo che l'intero file è buono da conservare o da buttare via, come posso farlo?

Non voglio aprire Vimdiff per ognuno di essi, cambio voglio un comando che dice "mantieni locale" o "mantieni remoto".

Ad esempio: ho ottenuto un'unione con i file contrassegnati come modificati perché qualcuno lo ha aperto sotto Windows, cambiando l'EOL e poi ha eseguito il commit. Quando mi unisco, voglio solo mantenere la mia versione e scartare la sua.

Sono anche interessato al contrario: ho sbagliato molto e voglio accettare il file remoto, scartando le mie modifiche.

Risposte:


310

Puoi anche fare:

git checkout --theirs /path/to/file

per mantenere il file remoto e:

git checkout --ours /path/to/file

per mantenere il file locale.

Quindi git addloro e tutto è fatto.

Edizione: tieni presente che questo è per uno mergescenario. Durante a si rebase --theirsriferisce al ramo in cui hai lavorato.


4
L'ho fatto .. ma non succede nulla .. come faccio a sapere che sta prendendo il file corretto? Sto usando git version 1.8.4se questo conta.
Rosdi Kasim,

3
perché la parola inversa usa? Presumo che "il loro" sarebbe un file remoto e "nostro" sarebbe il mio file
phuclv,

1
Così è, @ LưuVĩnhPhúc
Aspettando Dev ...

7
no, i loro significati sono invertiti stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 il loro sarebbe stato il mio file e il nostro sono i file nella remota ramo
phuclv

6
"Facile", sì. Intuitivo? No.
Wilbur Whateley

110

Questo approccio sembra più semplice, evitando la necessità di selezionare individualmente ogni file:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

o

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Copiato direttamente da: Resolve Git unisce conflitti a favore delle loro modifiche durante un pull


3
Ama questo. Soprattutto se c'è più di un file.
Tek,

La domanda era per due diversi comandi, ma non c'è una descrizione di ciò che fanno questi due. Cosa fa ogni linea?
Alex,

Ho esaminato almeno cinque risposte StackOverflow prima di trovare questo, che è quello che volevo. Grazie.
Bolton Bailey,

14

git checkout {branch-name} -- {file-name}

Questo utilizzerà il file dal ramo di scelta.

Mi piace perché il posh-gitcompletamento automatico funziona alla grande con questo. Rimuove inoltre qualsiasi ambiguità su quale ramo è remoto e quale è locale. E --theirscomunque non ha funzionato per me.


Nessuna ambiguità, funziona sia per {mine} che per {loro}, supporta l'aggiunta di intere directory. Questa dovrebbe essere la risposta accettata.
dotancohen,

9

Per il fine linea, fare riferimento a man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Assicurati di aggiungere autocrlf = falsee / o safecrlf = falseal clone di Windows (.git / config)

Usando git mergetool

Se configuri un mergetool come questo:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Quindi un semplice

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Farà il lavoro

Utilizzando semplici comandi git

In altri casi, presumo

git checkout HEAD -- path/to/myfile.txt

dovrebbe fare il trucco

Modifica per fare il contrario (perché hai rovinato):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 per i suggerimenti, ma non accettato ma perché non è quello che ho chiesto. Voglio qualcosa che funzioni in tutti i casi, non solo nei casi di esempio. Inoltre "git checkout remote / branch_to_merge - path / to / myfile.txt" non funzionerà se hai già iniziato la tua unione: dirà che sei nel mezzo di una fusione e ti impedirà di farlo.
e-soddisfa l'

1
@ e-satis: è sorprendente. Vorrei considerare che un bug, dal momento che il checkout con un percorso non è un checkout regolare (e non influisce su HEAD). Sto andando provare ora perché non riesco a crederci
sehe

1
@ e-satis: Soooo ... avevo ragione; git checkout remote/branch_to_merge -- path/to/myfile.txtfunziona come un incantesimo mentre risolve un conflitto di unione. (git 1.7.1)
vedi l'

1
Aggiunta una soluzione basata su git mergetool ora
vedere l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.