Как можно объединить локальные изменения с удаленными, если некоторые из новых файлов присутствуют в обоих? (мерзавец) - PullRequest
0 голосов
/ 26 мая 2019

Я создал файл xyz.js в моем локальном хранилище. Коллега также создал одноименное имя.

Когда я закончил свою работу, я попытался запустить следующие команды:

git shash
git pull
git stash apply

Я получил сообщение aborting после git pull, потому что xyz.js присутствовал как в удаленном, так и локальном, поэтому я попробовал это:

git stash --all

После этого я смог позвонить git pull, но потом не смог запустить git stash apply. Я попытался спрятать его снова, а затем это:

 rm `git ls-tree -r stash@{1}^3 --name-only`
 git stash apply

Существует множество игнорируемых файлов, необходимых для запуска проекта, но некоторые из них все еще отсутствуют. Я пытался это исправить, но я только усугубил ситуацию.


Я бы хотел избежать этой ситуации в будущем. Как я должен вытащить изменения, а затем подтолкнуть свой собственный правильный путь?

Пожалуйста, не отмечайте этот вопрос как дубликат. Я нашел здесь несколько вопросов о том, какой вопрос является предпочтительным способом pull-commit-push, но ответы не детализированы, и в них не упоминается эта проблема.

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Вместо использования тайника я бы создал локальную ветку dev, потому что тогда полное разрешение конфликта слияния позволит вам решить проблему.

git checkout -b dev
git add xyz.js
git commit -m 'adding xyz.js'
git checkout master # or whatever branch you were on

Теперь используйте ваш обычный git pull или gitполучить рабочий процесс, возможно, с тайником.Мне больше нравится выборка, но ваш stash / pull тоже должен работать.

git stash 
git pull

Затем, перед применением stash, вы должны слить в dev, применить новый файл и исправить конфликт слияния

git merge dev # add --squash to avoid getting a bubble in your tree
# fix conflict and commit

И, наконец, вы можете применить свой тайник

git stash apply

Комментарий личного мнения

Обычно я не люблю копить или тянуть, потому что они автоматизируют больше вещейценой некоторой гибкости.

Я всегда использую fetch вместо pull, затем проверяю то, что было извлечено, и объединяюсь, только если я согласен с этим.

Я всегда использую частные ветви разработки вместотайника, потому что тогда у меня есть полный контроль над тем, как я объединяю удаленные изменения или (более часто) переназначаю свои локальные локальные изменения на обновленный мастер.

Мой рабочий процесс без извлечения без сохранения немного медленнее,но мне нравится иметь дополнительный контроль.

1 голос
/ 26 мая 2019

Чтобы добавить немного к ответу Джоаниса , независимо от того, как вы собираетесь объединить свой новый xyz.js с чужим также новым xyz.js, вы нажмете "добавить / добавить конфликт ". Помните, что механизм слияния Git, независимо от того, как вы его вызываете - и git stash apply и git stash pop вызывают его, поэтому, используете ли вы git merge (это мое собственное предпочтение) или git stash для достижения слияния - требуется три входа: базовая версия, левая или «локальная» или --ours версия и правая или удаленная или --theirs версия.

Git сравнивает базовую версию файла с вашей версией файла, чтобы увидеть что вы изменили . Отдельно он сравнивает (одну и ту же) базовую версию файла с их версией файла, чтобы увидеть что они изменили .

В данном конкретном случае базовая версия xyz.js: Файл не существует. Левая версия - это ваш файл, а правая - их. (Если поменять местами левую и правую стороны, ничего не изменится, кроме метки: --ours теперь означает их файл, а --theirs теперь означает ваш файл. Поскольку слияние в значительной степени симметрично У вас одни и те же конфликты и результаты. Вот почему, по крайней мере, для таких случаев, я просто люблю называть их левой и правой сторонами.) Так что base , из которого произошли ваши изменения, была пустотой. Основой, из которой произошли их изменения, была пустота. Git всегда использует один общий файл в качестве базы, поэтому общий файл - это пустота, а это означает, что для Git это конфликт «добавления / добавления» со всеми вашими строками (создание файла из ничего) конфликтует со всеми их строками (создавая другую версию этого файла из ничего): Git не знает, брать ли ваши строки, или их строки, или некоторую комбинацию этих двух.

Вам, как человеку, выполняющему слияние, решать, что делать. Но одна из приятных вещей, связанных с размещением ваших вещей в собственной ветке, заключается в том, что вы можете отменить слияние и затем начать с после создания нового коммита. Если ваш xyz.js полностью отличается от их xyz.js, перед объединением вы можете переименовать ваш xyz.js, например, iter-xyz.js. Внесите любые другие необходимые изменения, зафиксируйте результат, и теперь вы готовы к слиянию - и все это время нет конфликта добавления / добавления, так как добавляется ваш iter-xyz.js и их xyz.js добавлено, и в результате у вас есть оба файла в вашем рабочем дереве и в вашем коммите слияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...