git - конфлікт злиття, коли локальний видалений, але файл існує віддалено


116

Я дуже новачок в git і цікавився, як мені зробити злиття, де в локальній репо я видалив кілька файлів на головній гілці, але ці файли існують у віддаленій гілці основного.

Після виконання git-merge він показує виникли конфлікти.

Використовуючи git gui, він показує, що локальний файл видалений, а файл віддаленої гілки містить вміст.

Як зупинити конфлікт цих файлів? Чи є простий спосіб використання git gui?

Велике дякую


У минулому одна річ, яку я робив, - це залишити "видалені" файли в контролі джерел, але виключити їх з проекту / makefile / будь-якого іншого. Це принаймні тимчасове рішення принаймні для конфліктів злиття.
Марк Рушакофф

2
Ви виправляєте це так само, як ви вирішуєте будь-який конфлікт злиття: додайте бажану версію (або файл, або відсутність файлу) до індексу, а потім виконайте фіксацію. Котрий саме ви хочете?
Каскабель


@MarkRushakoff я б перефразував вашу пораду, "коли я зіткнувся з ситуацією, коли мені потрібно вирішити конфлікт, я просто не вирішую справжніх, просто маскую їх, щоб вони кусали когось (мабуть, не я) у майбутньому". Це дійсно гарна порада для того, хто хотів би принести більше проблем у проект.
Віктор Ярема

Відповіді:


155

Ви повинні вирішити конфлікти так, як вважаєте за потрібне. Якщо файл дійсно повинен бути видалений, і ви опублікуєте цю зміну для походження, видаліть його знову:

git rm path/to/file

Якщо файл насправді слід відстежувати, додайте його (версія в робочому дереві буде версією з походження):

git add path/to/file

Зробивши будь-який із тих, щоб вирішити конфлікт, зробіть злиття.


У мене було кілька файлів, всі в одному каталозі і всі з тим самим суфіксом. Чи є ярлик для їх видалення відразу, зберігаючи решту файлів у режимі?
чиборг

@chiborg: Це лише питання оболонки. cdв каталог, і git rm *.ext. Ваша оболонка (не Git) розширюється *.extдо всіх відповідних імен файлів.
Каскабель

І якщо я хочу зберегти деякі файли? git rmне має -iпрапора.
чиборг

@chiborg: Ви сказали, що хочете видалити все із заданим суфіксом, а все інше залиште недоторканим. Саме це я і розповів, як робити. Або ти мав на увазі git rm *-suffix.ext? Однакова різниця. Якщо у вас виникли проблеми з роз'ясненням використання символів для оболонок, зверніться до сторінки Unix.stackexchange.com. Якщо ви знаєте напевно, що те, що ви хочете, не можна зробити з глобулюванням, скористайтеся rm -iта дотримуйтесь, git add -uщоб забрати видалення.
Каскабель

2
@Jefromi, якщо я вказую, -s recursive -X oursчому це все-таки потрібно git rmі git add?
Ноель Яп

27

На додаток до прийнятої підказки у "видаленому нами" , якщо ви хочете побачити зміни, які були внесені до видаленого файлу, щоб ви могли застосувати ці зміни в іншому місці, яке ви можете використовувати:

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

Якщо це сценарій "видалено ними" , і ви хочете побачити зміни, щоб ви могли застосувати їх в іншому місці, ви можете використовувати:

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

6
так! Це має вирішальне значення, якщо ви не хочете просто знеструмити зміни, які ви об'єднуєте, як, наприклад, коли я файл був просто перейменований або його вміст було переміщено до видалення файлу.
Едвард Андерсон

8
Як нагадування: Це не працює, коли конфлікт трапляється під час відмови . Потрібно бути чітким якgit diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschum Дякую! Це саме те, що я шукав.
Чуїм

2
Ви також можете скористатися git diff --base(див. Мою іншу відповідь).
Доріан Маршал

Привіт Йосифе, я все ще застряг, хоча ця відповідь виглядає багатообіцяючо. Якщо у вас є момент, я б хотів, щоб ви відповіли тут: stackoverflow.com/q/63044843/470749 Дякую!
Райан

9

У графічному інтерфейсі Git ви вибираєте конфліктуючий файл і клацніть правою кнопкою миші на головній області тексту, де відображається конфліктований текст.

У контекстному меню, яке з'явиться, ви можете вибрати "Remote" або перейти з "Local". Отже, якщо файл видалено віддалено, ви можете вибрати "Віддалене" для розповсюдження видалення локально, і навпаки.

Мені потрібен місяць, щоб розібратися ... було б добре, якби Git GUI насправді мав документацію ...


4

Відповідь, що найкраще оцінюється, зосереджується на способі вирішення конфлікту.

Перед цим, напевно, ви хочете знати, що змінився пульт у локально видалених файлах.

Для цього ви можете переглянути зміни за допомогою:

git diff --base

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

Порівняйте робоче дерево з версією «базовий» [...]. Індекс містить ці етапи лише для неперевірених записів, тобто під час вирішення конфліктів.


Ось гарне пояснення щодо git diff --base stackoverflow.com/a/60484874/470749
Райан

0

У EGit я також виявив проблеми. Моє рішення було:

  • Використовується подання Git Staging.
  • Двічі клацніть по кожному файлу, показаному на нестандартних змінах, щоб відкрити компаратор
  • Клацніть на іконку «Скопіювати все зліва направо»
  • Збережіть файл (він зникне з незазначеного списку)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.