git - unire il conflitto quando il locale viene eliminato ma il file esiste in remoto


116

Sono molto nuovo su git e mi chiedevo come dovrei fare un'unione in cui nel repository locale ho cancellato diversi file sul ramo master ma questi file esistono all'interno del ramo master remoto.

Dopo aver eseguito git-merge mostra i conflitti che si sono verificati.

Usando git gui mostra che il file locale è cancellato, mentre il file del ramo remoto ha dei contenuti.

Come si impedisce che questi file siano in conflitto? C'è un modo semplice per usare git gui?

Grazie molto


In passato, una cosa che ho fatto è lasciare i file "cancellati" nel controllo del codice sorgente, ma escluderli dal progetto / makefile / qualunque cosa. Almeno è una soluzione temporanea accettabile per i conflitti di unione.
Mark Rushakoff

2
Lo risolvi nello stesso modo in cui risolvi qualsiasi conflitto di unione: aggiungi la versione desiderata (il file o la mancanza di file) all'indice, quindi esegui il commit. Quale vuoi?
Cascabel


@MarkRushakoff Vorrei riformulare il tuo consiglio a "quando mi imbatto nella situazione in cui ho bisogno di risolvere il conflitto, semplicemente non risolvo quelli per davvero, li maschererei in modo che mordano qualcuno (probabilmente non io) in futuro". Questo è davvero un buon consiglio per qualcuno che vorrebbe portare più problemi nel progetto.
Victor Yarema

Risposte:


155

Dovresti risolvere i conflitti come meglio credi. Se il file deve essere davvero rimosso e pubblicherai la modifica all'origine, rimuovilo di nuovo:

git rm path/to/file

Se il file dovesse essere ancora tracciato, aggiungilo (la versione nell'albero di lavoro sarà la versione di origine):

git add path/to/file

Dopo aver eseguito una di queste operazioni per risolvere il conflitto, eseguire il commit dell'unione.


Avevo diversi file, tutti nella stessa directory e tutti con lo stesso suffisso. C'è un collegamento per rimuoverli tutti in una volta preservando il resto dei file nella directory?
chiborg

@chiborg: Questa è solo una domanda sulla shell. cdalla directory e git rm *.ext. La tua shell (non Git) si espande *.exta tutti i nomi di file corrispondenti.
Cascabel

E se voglio conservare alcuni file? git rmnon ha -ibandiera.
chiborg

@chiborg: hai detto che volevi rimuovere tutto con un dato suffisso e lasciare tutto il resto intatto. È esattamente quello che ti ho detto come fare. O intendevi git rm *-suffix.ext? Stessa differenza. Se hai problemi a capire come utilizzare i caratteri jolly della shell, chiedi a unix.stackexchange.com. Se sai per certo che ciò che vuoi non può essere fatto con il globbing, usa rm -ie segui con git add -uper raccogliere le eliminazioni.
Cascabel

2
@Jefromi, se sto specificando -s recursive -X ours, perché è ancora necessario git rme git add?
Noel Yap

27

Come suggerimento aggiuntivo oltre alla risposta accettata, in un "cancellato da noi" , se desideri vedere le modifiche apportate al file eliminato in modo da poterle applicare altrove, puoi utilizzare:

git diff ...origin/master -- path/to/file

Se si tratta di uno scenario "cancellato da loro" e desideri vedere le modifiche in modo da poterle applicare altrove, puoi utilizzare:

git diff origin/master... -- path/to/file

6
sì! Questo è fondamentale se non vuoi semplicemente spazzare via le modifiche che stai unendo, come quando un file è stato appena rinominato o il suo contenuto è stato spostato prima che il file fosse eliminato.
Edward Anderson

8
Come promemoria: questo non funziona quando il conflitto si verifica durante il rebase . git diff mybranch@{1}...origin/master -- path/to/file
Devi

@nschum Grazie! Questo è esattamente quello che stavo cercando.
Chuim,

2
Puoi anche usare git diff --base(vedi la mia altra risposta).
Dorian Marchal

Ciao Joseph, sono ancora bloccato anche se questa risposta sembra promettente. Se hai un momento, mi piacerebbe che tu rispondessi qui: stackoverflow.com/q/63044843/470749 Grazie!
Ryan

9

In Git GUI, seleziona il file in conflitto, quindi fai clic con il pulsante destro del mouse sull'area di testo principale in cui viene visualizzato il testo in conflitto.

Nel menu contestuale che appare, puoi scegliere di andare con "Remoto" o andare con "Locale". Quindi, se un file viene eliminato in remoto, puoi scegliere "Remoto" per propagare l'eliminazione localmente e viceversa.

Mi ci è voluto un mese per capirlo ... sarebbe bello se la GUI di Git avesse effettivamente la documentazione ...


4

La risposta più apprezzata si concentra sul modo in cui risolvere il conflitto.

Prima di ciò, probabilmente vorrai sapere cosa è cambiato il telecomando nei file rimossi localmente.

Per farlo, puoi vedere le modifiche con:

git diff --base

Da https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Confronta l'albero di lavoro con la versione "base" [...]. L'indice contiene queste fasi solo per le voci non unite, ovvero durante la risoluzione dei conflitti.


Ecco una buona spiegazione di git diff --base stackoverflow.com/a/60484874/470749
Ryan

0

In EGit ho anche riscontrato problemi. La mia soluzione era:

  • Ha utilizzato la vista Staging di Git.
  • Fare doppio clic su ogni file mostrato nelle modifiche non in scena per aprire il comparatore
  • Fare clic sull'icona "Copia tutto da sinistra a destra"
  • Salva file (scomparirà dall'elenco non gestito)

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.