git - merge Konflikt, wenn local gelöscht wird, aber die Datei in remote vorhanden ist

116

Ich bin sehr neu in Git und habe mich gefragt, wie ich eine Zusammenführung durchführen soll, bei der ich im lokalen Repo mehrere Dateien im Hauptzweig gelöscht habe, diese Dateien jedoch im Remote-Hauptzweig vorhanden sind.

Nach dem Zusammenführen von git-merge werden die aufgetretenen Konflikte angezeigt.

Mit git gui wird angezeigt, dass die lokale Datei gelöscht wird, während die Remote-Verzweigungsdatei Inhalt enthält.

Wie verhindern Sie, dass diese Dateien in Konflikt geraten? Gibt es eine einfache Möglichkeit, Git Gui zu verwenden?

Danke vielmals

binäre Kreationen
quelle
In der Vergangenheit habe ich die "gelöschten" Dateien in der Quellcodeverwaltung belassen, sie aber aus dem Projekt / Makefile / was auch immer ausgeschlossen. Zumindest für die Zusammenführungskonflikte ist dies eine gute vorübergehende Problemumgehung.
Mark Rushakoff
2
Sie beheben es auf die gleiche Weise, wie Sie einen Zusammenführungskonflikt beheben: Fügen Sie dem Index die gewünschte Version (entweder die Datei oder das Fehlen einer Datei) hinzu und schreiben Sie sie fest. Welches willst du?
Cascabel
@MarkRushakoff Ich würde Ihren Rat umformulieren zu "Wenn ich in die Situation gerate, in der ich den Konflikt lösen muss, löse ich diese einfach nicht wirklich, maskiere sie einfach, damit sie in Zukunft jemanden (wahrscheinlich nicht mich) beißen". Dies ist wirklich ein guter Rat für jemanden, der mehr Probleme in das Projekt einbringen möchte.
Victor Yarema

Antworten:

155

Sie sollten die Konflikte nach Belieben lösen. Wenn die Datei wirklich entfernt werden soll und Sie diese Änderung am Ursprung veröffentlichen, entfernen Sie sie erneut:

git rm path/to/file

Wenn die Datei tatsächlich noch verfolgt werden soll, fügen Sie sie hinzu (die Version im Arbeitsbaum ist die Version vom Ursprung):

git add path/to/file

Nachdem Sie eine der beiden Aktionen ausgeführt haben, um den Konflikt zu lösen, führen Sie die Zusammenführung durch.

Cascabel
quelle
Ich hatte mehrere Dateien, alle im selben Verzeichnis und alle mit demselben Suffix. Gibt es eine Verknüpfung, um alle auf einmal zu entfernen und gleichzeitig die restlichen Dateien im Verzeichnis beizubehalten?
Chiborg
@chiborg: Das ist nur eine Shell-Frage. cdin das Verzeichnis und git rm *.ext. Ihre Shell (nicht Git) wird *.extauf alle übereinstimmenden Dateinamen erweitert.
Cascabel
Und wenn ich einige der Dateien behalten möchte? git rmhat keine -iFlagge.
Chiborg
@chiborg: Sie sagten, Sie wollten alles mit einem bestimmten Suffix entfernen und alles andere intakt lassen. Genau das habe ich dir gesagt. Oder meintest du git rm *-suffix.ext? Gleicher Unterschied. Wenn Sie Probleme haben, herauszufinden, wie Shell-Platzhalter verwendet werden, wenden Sie sich an unix.stackexchange.com. Wenn Sie sicher sind, dass das, was Sie wollen, nicht mit Globbing gemacht werden kann, verwenden Sie rm -iund folgen Sie git add -u, um die Löschungen aufzunehmen.
Cascabel
2
@Jefromi, wenn ich spezifiziere -s recursive -X ours, warum ist es immer noch notwendig git rmund git add?
Noel Yap
27

Als zusätzlichen Tipp zusätzlich zu der akzeptierten Antwort in einem "von uns gelöschten" , wenn Sie die Änderungen sehen möchten, die an der gelöschten Datei vorgenommen wurden, damit Sie diese Änderungen an anderer Stelle anwenden können, können Sie:

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

Wenn es sich um ein Szenario handelt, das von ihnen gelöscht wurde und Sie die Änderungen sehen möchten, damit Sie sie an anderer Stelle anwenden können, können Sie Folgendes verwenden:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
quelle
6
Ja! Dies ist von entscheidender Bedeutung, wenn Sie die Änderungen, die Sie zusammenführen, nicht einfach wegblasen möchten, z. B. wenn eine Datei gerade umbenannt oder ihr Inhalt verschoben wurde, bevor die Datei gelöscht wurde.
Edward Anderson
8
Zur Erinnerung: Dies funktioniert nicht, wenn der Konflikt während des erneuten Basierens auftritt . git diff mybranch@{1}...origin/master -- path/to/file
Müssen
@nschum Danke! Genau das habe ich gesucht.
Chuim
2
Sie können auch verwenden git diff --base(siehe meine andere Antwort).
Dorian Marchal
Hallo Joseph, ich stecke immer noch fest, obwohl diese Antwort vielversprechend aussieht. Wenn Sie einen Moment Zeit haben, würde ich mich freuen, wenn Sie hier antworten: stackoverflow.com/q/63044843/470749 Vielen Dank!
Ryan
9

In der Git-GUI wählen Sie die Konfliktdatei aus und klicken dann mit der rechten Maustaste auf den Haupttextbereich, in dem der Konflikttext angezeigt wird.

Im angezeigten Kontextmenü können Sie zwischen "Remote" und "Lokal" wählen. Wenn eine Datei remote gelöscht wird, können Sie "Remote" auswählen, um das Löschen lokal zu verbreiten, und umgekehrt.

Ich habe einen Monat gebraucht, um es herauszufinden ... es wäre schön, wenn Git GUI tatsächlich Dokumentation hätte ...

Joel Freeman
quelle
4

Die am besten bewertete Antwort konzentriert sich auf den Weg zur Lösung des Konflikts.

Vorher möchten Sie wahrscheinlich wissen, was die Fernbedienung in den lokal entfernten Dateien geändert hat.

Dazu können Sie die Änderungen sehen mit:

git diff --base

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

Vergleichen Sie den Arbeitsbaum mit der "Basis" -Version [...]. Der Index enthält diese Phasen nur für nicht zusammengeführte Einträge, dh während der Lösung von Konflikten.

Dorian Marchal
quelle
Hier ist eine gute Erklärung für git diff --base stackoverflow.com/a/60484874/470749
Ryan
0

In EGit habe ich auch Probleme gefunden. Meine Lösung war:

  • Verwendete die Git Staging-Ansicht.
  • Doppelklicken Sie auf jede Datei, die bei nicht bereitgestellten Änderungen angezeigt wird, um den Komparator zu öffnen
  • Klicken Sie auf das Symbol "Alle von links nach rechts kopieren"
  • Datei speichern (sie verschwindet aus der nicht bereitgestellten Liste)
Borjab
quelle