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.