Git частичное совершение поэтапных изменений

Мой текущий git status выглядит следующим образом:

# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   docs/file3.org
#       modified:   src/main/R/lib.R
#
# 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:   docs/file3.org
#       modified:   src/main/R/lib.R

Сначала я хочу совершить поэтапные изменения в docs/file3.org, а затем остальные изменения. Но если я сделаю git commit -m '...' docs/file3.org, он зафиксирует как поэтапные, так и неустановленные изменения в этом файле.

Есть ли простой способ сделать это? Или мне нужно stash мои неустановленные изменения, отключить один из файлов, совершить другое, поправить, зафиксировать и stash pop?

Ответ 1

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

git stash --keep-index #Note that the staged changes also become part of the stash
git commit -m "Commit only one file" docs/file3.org

git commit -m "Commit other staged changed"
git stash pop 
# This may raise CONFLICTS since the stash includes the earlier staged changes.
# In case of conflict, the stash is not popped, so you need to drop it explicitly.

Ответ 2

Что действительно странно, так это то, что книга git -scm объясняет, как именно вы описали:

неустановленные изменения одного и того же файла не идут с фиксацией, только поэтапные изменения.

Проверьте это: http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository#Staging-Modified-Files

Я начал тестировать и независимо от того, какие изменения в том же файле я поставил, все изменения пошли с фиксацией.

Ответ 3

Я собираюсь предположить, что вы находитесь на master для всего этого...

git branch whatever
git commit # commit currently staged changes as 'commit1'
git add docs/file3.org
git commit # commit unstaged changes as 'commit2'

Теперь у вас будет этот

master
  \
   \--commit1--commit2

Теперь запустите git log и запишите SHA для "commit1" и "commit2".

git checkout master
git cherry-pick commit2SHA
git cherry-pick commit1SHA

Что даст вам

master--newcommit2--newcommit1
   \
    \--commit1--commit2

И тогда вы можете уничтожить "любую" ветвь

git branch -D whatever

изменить:

Вы также можете сделать что-то подобное с помощью тарелки:

git stash --keep-index  # Save unstaged changes
git stash               # Save staged changes
git stash pop [email protected]{1} # Pop unstanged changes
git commit ...          # Commit unstanged changes
git stash pop [email protected]{0} # Pop staged changes
git commit ...          # Commit staged changes

Ответ 4

git stash - лучший вариант в сочетании с.

git add --interactive

Это должно позволить вам "вернуть" (неустановив) некоторые файлы, уже добавленные в индекс.
Затем git stash позволит вам сохранить эти файлы и восстановить их.

(См. " git add --patch и --interactive" для примера)