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

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

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

22 ответов


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

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

Вот описание каждого варианта:

  • y этап этот кусок для следующего коммита
  • n не ставьте этот кусок для следующего коммита
  • q выход; не этап этот ломоть или любой из оставшихся ломоть
  • a этап этот кусок и все последующие куски в файле
  • d не ставьте этот кусок или любой из более поздних кусков в файле
  • g выберите кусок, чтобы перейти к
  • / поиск ломоть, соответствующий данному regex
  • j оставьте этот кусок нерешенным, см. Следующий нерешенный Ханк!--18-->
  • J оставьте этот кусок нерешенным, см. следующий кусок
  • k оставьте этот кусок нерешенным, см. предыдущий нерешенный кусок
  • K оставьте этот кусок нерешенным, см. предыдущий кусок
  • s разделить текущий кусок на меньшие куски
  • e вручную редактировать текущий ломоть
  • ? печать красавчик помогите!--18-->

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

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

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

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


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

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

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


git графический интерфейс предоставляет эту функциональность в представлении diff. Просто щелкните правой кнопкой мыши строку(ы), которые вас интересуют, и вы должны увидеть пункт меню "stage this line to commit".


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

добавлены содержания:

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

удалены содержания:

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

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

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

все подробности о git add доступны git --help add


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

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

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


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

enter image description here


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

git add -N file
git add -p file

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

такой:

$ 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
Whymarrh - это то, что я обычно делаю, за исключением того, что иногда есть много изменений, и я могу сказать, что могу сделать ошибку при постановке вещей, и я хочу, чтобы зафиксированное состояние я мог вернуться на второй проход.

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


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

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

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


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

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


Intellij IDEA (и я думаю, что все другие продукты серии) встроены в поддержку частичных коммитов с v2018.1

enter image description here


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

:GitGutterStageHunk

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

если только часть ломоть должен быть поставлен ВИМ-беглец

:Gdiff

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


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


С TortoiseGit:

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


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


git-meld-index - цитирую с сайта:

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

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

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

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

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

git meld-index

вы увидите, что meld (или ваш настроенный git difftool) всплывает с:

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

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

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

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


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

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

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

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

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


на Атом пользователи, пакет github включает интерактивную постановку, в стиле git gui. Для ярлыков см. пакет документация.

использование Atom позволяет работать с темой, которая имеет темный фон (по умолчанию,git gui имеет белый фон).


добавление предыдущего ответа, если вы предпочитаете использовать командную строку, введите git add -e myfile дает вам возможность выбрать построчно, что вы хотите совершить, потому что эта команда откроет редактор с различиями, например, так:

enter image description here

как вы можете знать строки, которые начинаются с + будут использованы, строки, которые начинаются с - несколько удалений. Итак:

  • чтобы не создавать добавление, просто удалите это линия.
  • не удаления просто заменить - С места .

This is what git add -h говорит о добавлении файлов таким образом (патчинг файлов):

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

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

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

внимание: не изменяйте содержимое файла, это не лучшее место для этого. Просто измените операторы удаленных или добавленных строк.


если это на мой взгляд git gui лучший инструмент stage/commit несколько строк из

1. Ломоть мудрый:

  • Выберите файл unstagged Changes раздел
  • Правой Кнопкой Мыши кусок кода, который должен быть поставлен
  • выберите Stage Hunk for commit

2. Линия мудрая:

  • Выберите файл
  • выберите строку / строки должны быть расположены
  • выберите Stage Lines for commit

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

  • Выберите файл unstagged Changes раздел
  • нажмите Ctrl+T (Stage file to commit)
  • выбранный файл теперь перемещается в Staged Changes раздел
  • выберите строку / строки должны быть расположены
  • выберите UnStage Lines for commit

ГИТ-Кола является отличным GUI, а также имеет эту встроенную функцию. Просто выберите строки для этапа и нажмите S. Если выбор не сделан,то полный кусок поставлен.