C'è un modo per risolvere il conflitto per tutti i file utilizzando checkout --ours
e --theirs
? So che puoi farlo per singoli file ma non riesci a trovare un modo per farlo per tutti.
C'è un modo per risolvere il conflitto per tutti i file utilizzando checkout --ours
e --theirs
? So che puoi farlo per singoli file ma non riesci a trovare un modo per farlo per tutti.
Risposte:
Basta grep attraverso la directory di lavoro e inviare l'output tramite il comando xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
o
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Come funziona: grep
cercherà in ogni file nella directory corrente (la .
) e nelle sottodirectory in modo ricorsivo (il -r
flag) cercando i marcatori di conflitto (la stringa '<<<<<<<')
il flag -l
o --files-with-matches
fa sì che grep restituisca solo il nome del file in cui è stata trovata la stringa. La scansione si interrompe dopo la prima corrispondenza, quindi ogni file corrispondente viene emesso una sola volta.
I nomi dei file corrispondenti vengono quindi reindirizzati a xargs , un'utilità che suddivide il flusso di input reindirizzato in singoli argomenti per git checkout --ours
o--theirs
Maggiori informazioni a questo link .
Dato che sarebbe molto scomodo doverlo digitare ogni volta dalla riga di comando, se ti ritrovi a usarlo molto, potrebbe non essere una cattiva idea creare un alias per la tua shell preferita: Bash è il solito .
Questo metodo dovrebbe funzionare almeno con le versioni di Git 2.4.x
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Più veloce del grepping se hai un grande progetto.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Puoi -Xours
o anche -Xtheirs
con git merge
. Così:
git reset --hard HEAD
)git merge -Xours
o git merge -Xtheirs
)DISCLAIMER: ovviamente puoi scegliere solo un'opzione, -Xours
oppure -Xtheirs
, se usi una strategia diversa dovresti ovviamente andare file per file.
Non so se ci sia un modo checkout
, ma onestamente non penso che sia terribilmente utile: selezionare la strategia con il comando checkout è utile se vuoi soluzioni diverse per file diversi, altrimenti scegli l'approccio della strategia di unione.
--theirs
o --ours
-Opzione per git v1.9.4. Sarebbe un approccio git merge -s recursive -Xtheirs BRANCH
.
--theirs
e --ours
non sono disponibili nemmeno con git 2.2.0
. O la mia risposta non era precisa o erano disponibili nella versione git precedente (questa risposta è piuttosto vecchia in epoca IT). L'approccio giusto è con -X
. Mi
git checkout --[ours/theirs] .
farà quello che vuoi, fintanto che sei alla radice di tutti i conflitti. ours / theirs influisce solo sui file non uniti, quindi non dovresti dover grep / find / etc specificatamente.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Sembra fare il lavoro. Nota che devi essere trasferito nella directory principale del repository git per ottenere ciò.
Nel caso in cui qualcun altro stia cercando di sovrascrivere semplicemente tutto da un ramo (ad esempio master) con il contenuto di un altro, c'è un modo più semplice:
git merge origin/master --strategy=ours
Grazie a https://stackoverflow.com/a/1295232/560114
O per il contrario, vedere Esiste una versione "loro" di "git merge -s ours"?
git checkout --ours -- .
? I.
mezzi directory corrente, quando applicata dalla radice directory di lavoro, quindi significa sostanzialmente sull'intera directory di lavoro. Non sono sicuro se questo funzionerà con il--ours
flag, e non sono sicuro di come gestirà i conflitti di file cancellati o rinominati.