Используйте функцию интерактивного добавления Git, чтобы добавить только исправление в «область подготовки». Затем вы можете спрятать оставшиеся изменения, проверить исправление, чтобы убедиться, что оно работает, а затем зафиксировать его самостоятельно.
Ниже приведен пример прохождения. Сначала это может показаться длинным и сложным, но на самом деле это довольно просто. Когда вы сделаете это пару раз, это станет второй натурой, и вы, вероятно, обнаружите, что используете эту технику довольно часто.
В этом примере есть изменения как bar.c
, так и foo.c
, но только foo.c
имеет изменения, связанные с исправлением ошибки. Во-первых, я использую git add -i
для интерактивного добавления только исправления:
test(master *)$ git add -i
staged unstaged path
1: unchanged +1/-0 bar.c
2: unchanged +1/-1 foo.c
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
Я выбираю опцию «p», чтобы сообщить Git, что я хочу выбрать отдельные «патчи» для добавления в «область подготовки»:
What now> p
staged unstaged path
1: unchanged +1/-0 bar.c
2: unchanged +1/-1 foo.c
Далее я набираю 2
, чтобы сообщить, что я хочу выбрать отдельные патчи из foo.c
:
Patch update>> 2
staged unstaged path
1: unchanged +1/-0 bar.c
* 2: unchanged +1/-1 foo.c
Поскольку foo.c
- единственный файл, в котором есть исправления, которые я хочу добавить в «область подготовки», теперь я закончил выбор файлов, поэтому просто нажимаю клавишу ввода в командной строке:
Patch update>>
Далее Git показывает мне отдельные патчи из "foo.c" и спрашивает, хочу ли я добавить их в индекс. В этом примере есть только одно изменение, поэтому я ставлю его:
diff --git a/foo.c b/foo.c
index 7bc741e..ec7ddfc 100644
--- a/foo.c
+++ b/foo.c
@@ -1 +1 @@
-Here is foo.c; it has a bug.
+Here is foo.c.
Stage this hunk [y,n,q,a,d,/,e,?]? y
Теперь я поставил все, что является частью исправления. Поэтому я выхожу из режима «интерактивного добавления»:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> q
Bye.
Обратите внимание на статус. foo.c
имеет изменения, добавленные в "область подготовки", но "bar.c" не делает:
test(master *+)$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.c
#
# 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: bar.c
#
Затем я говорю Git, чтобы спрятать мою работу, но оставить то, что я добавил, в «область подготовки» (a.k.a.
«индекс»):
test(master *+)$ git stash --keep-index
Saved working directory and index state WIP on master: ba84dec Adding bar.c with new "bar feature"
HEAD is now at ba84dec Adding bar.c with new "bar feature"
test(master +$)$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.c
#
Теперь обратите внимание, что единственное, что есть в моем рабочем дереве, это исправление, и оно готово для фиксации в следующем коммите. Теперь я могу выполнить любое тестирование, которое я хотел бы выполнить для исправления ошибки, прежде чем его зафиксировать.
Когда я удовлетворен своими изменениями, я могу зафиксировать исправление:
test(master +$)$ git commit
[master 79acd00] Commit bugfix for foo.c
1 files changed, 1 insertions(+), 1 deletions(-)
Теперь я открываю тайник, чтобы получить другую работу, которую я делал в bar.c
, обратно в мое рабочее дерево:
test(master $)$ git stash pop
# On branch master
# 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: bar.c
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (d306d098a272335ed31c14f07cf57e62ffc13151)
И я закончил. Теперь я могу нажать на удаленный репозиторий, и он получит исправление, в то время как остальная часть моей работы все еще находится в моем рабочем дереве и не выдвигается.