git checkout & git pull: избегайте промежуточных изменений файлов при выполнении - PullRequest
0 голосов
/ 06 марта 2019

Я удивлен, что ничего не смог найти об этом ...

Короче говоря, у меня вопрос: есть ли способ избежать изменения промежуточного файла между следующими двумя командами, если после следующих двух команд содержимое файла точно такое же, как и раньше?

git checkout dev
git pull

Мотивация (Решение, которое соответствует только одной из мотиваций, также лучше, чем ничего):

  • Я хочу, чтобы моя среда IDE не загружала файлы, если они не нужны (да, файлы проекта VS ...).
  • Избегайте хранения файлов, которые на самом деле не изменились.

Это очень распространенный сценарий, когда я возвращаюсь из ветви функций к мастеру после объединения origin / feature и origin / dev с использованием сервера удаленного управления исходным кодом.

Я ожидаю, что выполнение git fetch origin dev раньше решит это, но это не так. Также я нашел несколько ответов, таких как this , в которых говорится о группировке команд для простоты, но они не были нацелены на проблему изменения файла.

1 Ответ

1 голос
/ 06 марта 2019

Есть способ сделать это, используя git worktree add.Убедитесь, что ваш Git по крайней мере 2,5 (так что он имеет git worktree) и предпочтительно по крайней мере 2,15 (исправляет довольно серьезную ошибку с добавленными рабочими деревьями; без исправления добавленное рабочее дерево не должно использоваться более двух недель,в общем).

Ваша IDE может быть несовместима с git worktree add;Я избегаю IDE, поэтому не могу сказать, какие из них сотрудничают, а какие нет.

Предполагая, что у вас есть версия Git, которая поддерживает добавленные рабочие деревья, используйте git worktree add, чтобы создать ветку dev, и оставьте главнуюрабочее дерево на ветке master.В качестве альтернативы, используйте добавленное рабочее дерево для основной (основной или любой другой) ветви и главное рабочее дерево для ветви dev.Помните, что Git обеспечивает, чтобы у каждого рабочего дерева была размеченная ветвь.

Прекратить использование git pull.(Это не является строго необходимым, но я рекомендую его.)

Чтобы обновить хранилище с сервера, используйте git fetch - без дополнительных аргументов - в любое время из любого рабочего дерева.При этом будут получены все новые коммиты, которых у вас нет, и обновлены ваши origin/* имена для удаленного слежения.

Чтобы обновить ветку master, введите рабочее дерево master -отрасль и,в командной строке введите git merge или git merge origin/master.(Сначала запустите git fetch, если вы не сделали этого недавно, чтобы иметь обновленную версию origin/master.)

Чтобы обновить ветку dev, введите dev -ветвь рабочего дерева и в командной строке запустите git merge или git merge origin/dev.Как и раньше, если вы не запускали git fetch в последнее время, вы можете сначала сделать это, чтобы ваш origin/master был в курсе.

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

Помните, все, что git pull делает, это запускает git fetch, а затем git merge (или git fetch, а затем git rebase).Это git checkout, который мешает с отметками времени в ваших файлах рабочего дерева.Git на самом деле не использует и не нуждается в рабочем дереве: это для you .Запуск git checkout заменяет файлы в рабочем дереве файлами из другого коммита, а также заменяет файлы в индексе;индексные копии - это те, которые Git использует и заботится о них.

Git заменяет файлы рабочего дерева, поскольку предполагает, что вам нужны файлы из ветви, на которую вы переключаетесь.Конечно, при обратном переключении обновляются эти файлы рабочего дерева.Таким образом, теперь различные файлы были обновлены дважды и нуждаются в восстановлении.


Когда вы добавляете новое рабочее дерево, Git фактически добавляет группу из трех элементов:

  • aновый HEAD для нового рабочего дерева, чтобы запомнить, какие коммиты и / или ветви являются текущими в новом рабочем дереве;
  • индекс для нового рабочего дерева, который Git использует для храненияФайлы Git для следующего коммита, который вы можете сделать;и
  • само новое рабочее дерево для просмотра и работы с файлами.

Это рабочее дерево - это просто каталог (или папка), который находится за пределами основногоДерево репозитория.Например, если ваш главный репозиторий находится в ~/work/project, вы можете переместить его в ~/work/project/main и создать ~/work/project/dev для хранения рабочего дерева dev.

В принципе, проблема проста: Когда вы используете git checkout, git заменяет и индекс, и содержимое рабочего дерева по мере необходимости.Поэтому вам нужно прекратить использование git checkout.Если вам нужны оба рабочих дерева, создайте два отдельных рабочих дерева.


Если ваш Git слишком стар, чтобы поддерживать рабочие деревья, сделайте два клона.Все остальное работает так же, за исключением того, что два клона не имеют общих ветвей.

...