Зафиксировать только часть файла в Git

Когда я вношу изменения в файл в Git, как я могу выполнить только некоторые из изменений?

Например, как я могу выполнить только 15 строк из 30 строк, которые были изменены в файле?

2032
задан freddiefujiwara 06 июля '09 в 5:25
источник поделиться

19 ответов

Вы можете использовать git add --patch <filename> (или -p для краткости), а git начнет разбивать ваш файл на то, что он считает разумными "кусками" (части файла). Затем он подскажет вам этот вопрос:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Ниже приведено описание каждой опции:

  • y запустите этот кусок для следующего фиксации
  • n не обрабатывать этот кусок для следующего фиксации
  • q quit; не ставьте этот кусок или любой из оставшихся кусков.
  • a запустите этот кусок и все последующие ханки в файле
  • d не обрабатывайте этот кусок или любой из более поздних фрагментов в файле
  • g выберите hunk, чтобы перейти к
  • / найти ханк, соответствующий данному регулярному выражению
  • j оставить этот кусок неопределенным, увидеть следующий неустановленный hunk
  • j оставить этот кусок неопределенным, см. следующий hunk
  • k оставить этот кусок неопределенным, см. предыдущий неопределенный hunk
  • k оставить этот кусок неопределенным, см. предыдущий hunk
  • s разделяет текущий кусок на более мелкие куски
  • e вручную отредактировать текущий hunk
  • ? помощь для печати hunk

Если файл еще не находится в репозитории, вы можете сначала сделать git add -N <filename>. Впоследствии вы можете продолжить git add -p <filename>.

Впоследствии вы можете использовать:
git diff --staged, чтобы проверить правильность внесенных изменений
git reset -p, чтобы проигнорировать ошибочно добавленные куски
git commit -v, чтобы просмотреть свою фиксацию во время редактирования сообщения фиксации.

Примечание. Это намного отличается от команды git format-patch, целью которой является синтаксический анализ данных фиксации в файлах .patch.

Ссылка на будущее: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging

2622
ответ дан cloudhead 06 июля '09 в 5:36
источник поделиться

Вы можете использовать git add --interactive или git add -p <file>, а затем git commit ( не git commit -a); см. интерактивный режим в git-add manpage или просто следуйте инструкциям.

Современный Git также имеет git commit --interactivegit commit --patch, который является ярлыком для параметра патча в интерактивной фиксации).

Если вы предпочитаете делать это из графического интерфейса, вы можете использовать git-gui. Вы можете просто отметить куски, которые вы хотите включить в фиксацию. Мне лично легче, чем использовать git add -i. Другие Git GUI, такие как QGit или GitX, также могут иметь эту функциональность.

201
ответ дан Jakub Narębski 06 июля '09 в 14:49
источник поделиться

git gui предоставляет эту функциональность под видом diff. Просто щелкните правой кнопкой мыши интересующую вас линию, и вы увидите пункт меню "Эта строка для фиксации".

100
ответ дан Ionuț G. Stan 06 июля '09 в 5:41
источник поделиться

Я считаю, что git add -e myfile - самый простой способ (по крайней мере, мое предпочтение), поскольку он просто открывает текстовый редактор и позволяет вам выбрать, какую строку вы хотите выполнить, а какая строка у вас нет. Что касается команд редактирования:

добавленный контент:

Добавленное содержимое представлено строками, начинающимися с "+". Вы можете предотвратить создание любых линий сложения, удалив их.

удаленный контент:

Удаленное содержимое представлено строками, начинающимися с "-". Вы можете предотвратить их удаление путем преобразования "-" в "" (пробел).

измененное содержимое:

Измененное содержимое представлено линиями "-" (удаление старого содержимого), за которым следуют строки "+" (добавление замещающего содержимого). Вы можете предотвратить установку модификации путем преобразования строк "-" в "" и удаления "+",            линий. Помните, что изменение только половины пары, скорее всего, приведет к запутывающим изменениям индекса.

Каждая информация о git add доступна на git --help add

45
ответ дан theFreedomBanana 25 сент. '15 в 23:45
источник поделиться

Если вы используете vim, вы можете попробовать отличный плагин под названием fugitive.

Вы можете увидеть diff файла между рабочей копией и индексом с помощью :Gdiff, а затем добавить строки или столбцы в индекс, используя классические команды vim diff, такие как dp. Сохраните изменения в индексе и скопируйте с помощью :Gcommit, и все готово.

Очень хорошие вступительные видеоролики здесь (см. часть 2).

39
ответ дан François 23 февр. '12 в 13:37
источник поделиться

Я настоятельно рекомендую использовать SourceTree от Atlassian. (Это бесплатно.) Это делает это тривиальным. Вы можете быстро и легко создавать отдельные куски кода или отдельные строки кода.

enter image description here

23
ответ дан user486646 12 авг. '14 в 16:32
источник поделиться

Стоит отметить, что для использования git add --patch для нового файла вам нужно сначала добавить файл в индекс с помощью git add --intent-to-add:

git add -N file
git add -p file
16
ответ дан user1338062 05 дек. '14 в 20:29
источник поделиться

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

Вот так:

$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop

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

15
ответ дан jdsumsion 07 июня '13 в 1:14
источник поделиться

Если вы используете emacs, посмотрите Magit, который предоставляет интерфейс git для emacs. Он хорошо поддерживает промежуточных фрагментов (части файлов).

10
ответ дан Mark van Lent 08 июля '09 в 10:00
источник поделиться

Как и в случае с jdsumsion, вы также можете спрятать свою текущую работу, но затем используйте difffool, например meld, чтобы вытащить выбранные изменения из тайника. Таким образом, вы можете даже вручную отредактировать куски, что немного больно, когда в git add -p:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

Использование метода stash дает вам возможность протестировать, если ваш код все еще работает, прежде чем выполнить его.

7
ответ дан derhoch 07 авг. '13 в 16:25
источник поделиться

Для тех, кто использует Git Расширения:

В окне "Копировать" выберите файл, который вы хотите частично совершить, затем выберите текст, который вы хотите зафиксировать, в правой панели, затем щелкните правой кнопкой мыши на выделенном фрагменте и выберите "Сформировать выбранные строки" в контекстном меню.

6
ответ дан srgstm 27 июля '15 в 12:52
источник поделиться

vim-gitgutter плагин может создавать ханки, не выходя из редактора vim, используя

:GitGutterStageHunk

Помимо этого, он предоставляет другие интересные функции, такие как столбец с разным знаком, как в некоторых современных IDE

Если только часть hunk должна быть поставлена ​​vim-fugitive

:Gdiff

позволяет выбирать диапазон видимого диапазона, затем :'<,'>diffput или :'<,'>diffget для изменения/изменения отдельных строк.

6
ответ дан c0ffeeartc 09 янв. '15 в 20:11
источник поделиться

Пробовал git add -p filename.x, но на маке я нашел gitx (http://gitx.frim.nl/ или https://github.com/pieter/gitx) было бы намного легче выполнить именно те строки, которые я хотел.

3
ответ дан jasongregori 16 авг. '11 в 2:43
источник поделиться

С TortoiseGit:

щелкните правой кнопкой мыши файл и используйте Context Menu → Restore after commit. Это создаст копию файла, как есть. Затем вы можете отредактировать файл, например. в TortoiseGitMerge и отмените все изменения, которые вы не хотите совершать. После сохранения этих изменений вы можете зафиксировать файл.

3
ответ дан Fr0sT 06 апр. '15 в 19:16
источник поделиться

Для emacs также есть gitsum

2
ответ дан zut 13 июля '09 в 0:52
источник поделиться

git-meld-index - цитирование с веб-сайта:

git -meld-index запускает meld - или любой другой git diffftool (kdiff3, diffuse и т.д.) - чтобы вы могли интерактивно изменять изменения индекса git (также известного как git).

Это похоже на функциональность git add -p и git add --interactive. В некоторых случаях meld легче/быстрее использовать, чем git add -p. Это потому, что meld позволяет вам, например,:

  • см. больше контекста
  • см. внутрилинейные различия
  • отредактируйте вручную и посмотрите 'live' diff updates (обновляется после каждого нажатия клавиши)
  • перейдите к изменению, не указывая "n" на каждое изменение, которое вы хотите пропустить.

Использование

В репозитории git запустите:

git meld-index

Вы увидите, что meld (или настроенный git diffftool) появляется с помощью

LEFT: файлы временного каталога, скопированные из рабочего дерева

ВПРАВО: временный каталог с содержимым индекса. Это также включает файлы, которые еще не находятся в индексе, но изменены или не проверены в рабочей копии - в этом случае вы увидите содержимое файла из HEAD.

Отредактируйте индекс (справа) до тех пор, пока он не станет счастливым. Не забудьте сохранить при необходимости.

Когда вы закончите, закройте meld и git -meld-index обновит индекс, чтобы он соответствовал содержимому временного каталога в правой части команды meld, которую вы только что отредактировали.

2
ответ дан Croad Langshan 04 июля '15 в 23:26
источник поделиться

Как один ответ выше показывает, вы можете использовать git add --patch filename.txt

или короткая форма git add -p filename.txt

... но для файлов, уже находящихся в вашем репозитории, есть намного лучше использовать флаг -patch для команды commit (если вы используете достаточно недавнюю версию git): git commit --patch filename.txt

... или, опять же, короткая форма git commit -p filename.txt

... и затем используя указанные ключи (y/n и т.д.), для выбора строк, которые должны быть включены в фиксацию.

1
ответ дан Samuel Lampa 30 июня '14 в 11:34
источник поделиться

git-cola - отличный графический интерфейс, а также встроенная функция. Просто выберите линии для сцены и нажмите S. Если выбор не производится, выполняется полный кусок.

0
ответ дан AndiDog 27 авг. '15 в 14:28
источник поделиться

Если на платформе Windows, на мой взгляд, git gui - лучший инструмент для stage/commit нескольких строк из unstaged файла

1. Хенк мудрый:

  • Выберите файл из раздела unstagged Changes
  • Щелкните правой кнопкой мыши код кода, который необходимо выполнить.
  • Выберите Stage Hunk for commit

2. Строка:

  • Выберите файл из раздела unstagged Changes
  • Выберите строку/строки, которые будут организованы
  • Выберите Stage Lines for commit

3. Если вы хотите создать полный файл, кроме пары строк:

  • Выберите файл из раздела unstagged Changes
  • Нажмите Ctrl+T (Stage file to commit)
  • Выбранный файл теперь перемещается в Staged Changes Раздел
  • Выберите строку/строки, которые будут организованы
  • Выберите UnStage Lines for commit
0
ответ дан Anvesh Yalamarthy 28 мая '15 в 15:52
источник поделиться

Другие вопросы по меткам