git переместит часть изменений из раздела «подлежащие внесению» в раздел локальные изменения

#git #git-add

#git #git-добавить

Вопрос:

У меня есть файл, который я модифицировал с помощью двух наборов изменений: форматирования и добавления новой функции.

Мне нужно превратить их в 2 коммита.
— Изменения форматирования
— Новая функция A.

Теперь я использовал git add --patch и подготовил все материалы для форматирования. Итак, у меня есть:

 Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   FileA   <-- formatting changes

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   FileA  <-- Feature A
  

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

Могу ли я как-то отредактировать изменения, которые должны быть зафиксированы? Файл важен, и я не хочу повторять с git add --patch .

Единственное решение, которое я могу придумать, чтобы не выполнять выполнение git add --patch , — это зафиксировать текущие изменения, а затем удалить эти строки из самого коммита.

Есть ли другой способ сделать это?

Комментарии:

1. Мне было бы любопытно узнать, что послужило причиной снижения, поскольку я нашел это полезным и четко заданным. Не то, чтобы могло быть никаких причин для понижения, конечно, мне просто интересно.

Ответ №1:

Есть также, git reset --patch что является обратным git add --patch .

Однако для одного небольшого изменения использование git gui может быть проще — вы можете интерактивно создавать отдельные строки кода, просто щелкнув их правой кнопкой мыши. Некоторые другие графические интерфейсы Git могут иметь аналогичные функции.

В противном случае, вот немного уродливый способ сделать это, не проходя все заново:

  • git diff --cached >temp.diff
  • git reset
  • Отредактируйте temp.diff и удалите фрагмент с изменением, которое вы не хотели фиксировать
  • git apply --cached --recount temp.diff
  • Фиксация

Комментарии:

1. Спасибо, это то, что мне действительно было нужно!

Ответ №2:

Я бы предложил следующее:
Использовать git stash (https://www.git-scm.com/docs/git-stash ):

  1. git stash --keep-index
    Это помещает ваше текущее рабочее дерево в хранилище и сохраняет ваши поэтапные изменения
    Будьте в курсе неотслеживаемых файлов. По умолчанию неотслеживаемые файлы не помещаются в хранилище! (Для этого есть другой вариант: --include-untracked )
  2. Изменить FileA соответствующим образом
  3. git add -p -- FileA
    Внесите свои новые изменения — теперь у вас готов первый коммит
  4. git stash pop или git stash apply (независимо от того, хотите ли вы сохранить свои изменения в тайнике или нет)
  5. Теперь у вас почти готов второй коммит в рабочем дереве (внесите необходимые изменения, этап, зафиксируйте, …)