2010-02-25 2 views
23

У меня есть исходный файл, в котором добавлено 2 функции. Чтобы сделать выбор вишни, я бы хотел сделать это в 2 этапа: по одной для каждой функции. До сих пор в подобных ситуациях использование git add -p служило мне хорошо, чтобы зафиксировать одну функцию, оставив локальные файлы на завершающей стадии.Как отредактировать Git «добавить патч» hunks/diffs/lines во время выборочной постановки?

Однако у меня теперь есть проблема, что git add -p хочет поставить кусок, который включает изменения для обеих функций. Несмотря на то, что изменения находятся на отдельных строках, s (для «split») больше не хочет разбить кусок на более мелкие куски ...

Вкратце: я не могу отделить изменения для этих двух функций таким образом , Есть ли способ вручную отредактировать патч, например, с помощью vi, без фактического изменения исходного файла?

+1

Часть моей проблемы заключается в том, что я, вероятно, не могу придумать правильные условия для поиска в Google. – bart

+0

Подробные инструкции по ручному редактированию патчей можно найти в [официальном git add docs - РЕДАКТИРОВАТЬ ПАРТНЕРЫ] (https://www.kernel.org/pub/software/scm/git/docs/git-add.html#_editing_patches) , – 2013-07-14 19:15:21

ответ

24

Как говорит Алан, отредактируйте патч, нажав e (вместо s) во время git add -p. Это запустит ваш редактор с этим куском патча, чтобы вы могли вручную его отредактировать. В тексте есть комментарии, которые объясняют, как правильно отказаться от модификаций, и на самом деле это довольно легко.

Когда вы закончите, обратите внимание, что вы можете проверить его только с изменениями, которые вы только что добавили, выполнив git stash --keep-index. Изменения, внесенные вами не сделали add to the index будут удержаны, и теперь вы сможете протестировать только те изменения, которые вы собираетесь совершить. Когда закончите, просто git stash pop или git stash apply, чтобы получить другие изменения.

+0

Спасибо за полезную дополнительную информацию ... – bart

+0

Если вы часто делаете 'git stash -keep-index',' git stash -k' будет делать то же самое и сэкономить некоторое время. – Ryan

5

Вы можете отредактировать патч, нажав e во время git add -p. Это не повлияет на исходный файл.

+0

git отвечает с 'Huh (e)?'. Может быть, моя версия немного устарела? (Хотя у меня было только 2 недели, и это официальный порт для CentOS ...) – bart

+0

Исправление, неправильная фаза 'git add -i'. В подсказке, что делать с hunk, git просто игнорирует мой «e». – bart

+0

«e» ничего не делает. git --version говорит 1.5.5.6. Это слишком старо! – bart

6

Как и другие люди, вы можете использовать e, чтобы отредактировать кусок, который хотите разбить.

Чтобы добавить только часть куска, вы можете удалить строки из изменения, которое хотите разделить.

+Line 1 
+Line 2 
+Line 3 

Допустим, что вы хотите сохранить линию 1 и линию 3 в одной фиксации и строку 2 в другой. Все, что вам нужно сделать, это удалить строку 2:

+Line 1 
+Line 3 

Это положит линию 1 и линию 3 в вашу промежуточную зону. Строка 2 по-прежнему будет индексироваться, но не поставлена.

0

Обычно я получаю конфликты слияния от git stash pop, описанных в ответе @ Dan. См. git stash and edited hunks для решения, которое позволяет избежать конфликтов.

1

Есть Git GUI, которые позволят вам выбрать отдельные линии, которые вы хотите выполнить, позволяя разделить линии, которые вы обычно не сможете использовать с помощью командной строки git add --patch.

Два таких ГПИ являются:

  1. SourceTree.
  2. Git Cola.