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
" для примера)