Создать git commit из diff в другой ветке без переключения - PullRequest
1 голос
/ 11 марта 2019

Мне интересно, возможно ли зафиксировать изменения, представленные в виде diff, в отдельной локальной ветви, не переключаясь на эту ветку.

Чтобы представить вещи в перспективе, давайте предположим, что я работаю над master ветвь и иметь diff, представленный в виде файла raw.diff.Теперь я хотел бы применить этот diff к новой локальной ветке (или тегу) needs_change и зафиксировать изменения без переключения с master.

. Я знаю, что в обычном потоке я бы сделал что-то вродеthis:

git checkout -b needs_change             # create and switch to local branch
git apply raw.diff                       # apply diff in needs_change
git commit -am "New commit with changes" # commit changes
git checkout master                      # switch back to master branch

Однако в этой последовательности шагов мне нужно переключиться на ветку needs_change, и мне интересно, можно ли как-нибудь этого избежать.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

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

Следовательно, способ сделать это без создания отдельного клонадобавить еще одно рабочее дерево и индекс , что вы можете сделать с git worktree add, при условии, что ваш Git не менее 2,5. 1 Это фактически добавляет набор из трех элементов:

  • новое рабочее дерево, как подразумевается командой git worktree add;
  • новый индекс для предоставления индексной / промежуточной области для этого нового рабочего дерева;и
  • новый HEAD для отслеживания того, какая ветвь в этом новом рабочем дереве.

Теперь вы можете cd в новомwork-tree, делайте любую работу, которая вам нравится, git add файлы, чтобы скопировать их обратно в индекс для этого рабочего дерева, и git commit там, чтобы использовать индекс этого рабочего дерева для создания нового коммита, который обновляет ветку, котораяпроверяется в этом рабочем дереве.

(Если у вас нет git worktree, просто сделайте еще один клон.)


1 Ваш Gitпредпочтительно должно быть не менее 2,15, так как были некоторые важные исправления ошибок, приведшие к 2,15.Наиболее важным из них является то, что в 2.5 - 2.14, если вы работаете в добавленном рабочем дереве, а затем прерываетесь и оставляете его на 14 или более дней, Git может разрушить то, что вы делали в этом рабочем дереве.Если вы просто что-то делаете быстро, а затем удаляете добавленное рабочее дерево, эти ошибки не будут кусаться.

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

Не совсем.Вам нужно переключиться на другую ветку, чтобы применить патч / коммит.Обойти это невозможно (на всякий случай, в одном локальном репо).

...