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


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

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


2205


источник


Ответы:


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

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

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

  • Y сместите этот кусок для следующего фиксации
  • N не ставьте этот кусок для следующего фиксации
  • Q уволиться; не ставьте этот кусок или какой-либо из оставшихся кусков
  • сценируйте этот кусок и все последующие ханки в файле
  • d не ставьте этот кусок или какой-либо из последующих хаков в файл
  • г выберите кусок, чтобы перейти к
  • / поиск hunk, соответствующего данному регулярному выражению
  • J оставьте этот кусок неопределенным, см. следующий неустановленный кусок
  • J оставьте этот кусок неопределенным, см. следующий кусок
  • К оставьте этот кусок неопределенным, см. предыдущий неопределенный кусок
  • К оставьте этот кусок неопределенным, см. предыдущий кусок
  • s разделить текущий кусок на более мелкие куски
  • е вручную отредактировать текущий кусок
  • ? распечатать hunk help

Если файл еще не находится в репозитории, вы можете сначала сделать 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


2877



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

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

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


212



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


111



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

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

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

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

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

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

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

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


55



If you are using vim, you may want to try the excellent plugin called fugitive.

You can see the diff of a file between working copy and index with :Gdiff, and then add lines or hunks to the index using classic vim diff commands like dp. Save the modifications in the index and commit with :Gcommit, and you're done.

Very good introductory screencasts here (see esp. part 2).


40



I would strongly recommend using SourceTree from Atlassian. (It's free.) It makes this trivial. You can stage individual hunks of code or individual lines of code quickly and easily.

enter image description here


26



Worth noting that to use git add --patch for a new file you need to first add the file to index with git add --intent-to-add:

git add -N file
git add -p file

20



When I have a lot of changes, and will end up creating a few commits from the changes, then I want to save my starting point temporarily before staging things.

Like this:

$ 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's answer is what I usually do, except sometimes there are lots of changes and I can tell I might make a mistake while staging things, and I want a committed state I can fall back on for a second pass.


17



Should you use emacs, take a look at Magit, which provides a git interface for emacs. It supports staging hunks (parts of files) quite well.


12



Much like jdsumsion's answer you can also stash your current work but then use a difftool like meld to pull selected changes from the stash. That way you can even edit the hunks manually very easy, which is a bit of a pain when in git add -p:

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

Using the stash method gives you the opportunity to test, if your code still works, before you commit it.


7



For those who use Git Extensions:

In the Commit window, select the file you want to partially commit, then select the text you want to commit in the right pane, then right-click on the selection and choose 'Stage selected lines' from the context menu.


7



vim-gitgutter plugin can stage hunks without leaving vim editor using

:GitGutterStageHunk

Beside this, it provides other cool features like a diff sign column as in some modern IDEs

If only part of hunk should be staged vim-fugitive

:Gdiff

allows visual range selection then :'<,'>diffput or :'<,'>diffget to stage/revert individual line changes.


6