Git частичная фиксация поэтапных изменений - PullRequest
10 голосов
/ 26 января 2012

Мой текущий 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?

Ответы [ 4 ]

9 голосов
/ 26 января 2012

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

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.
3 голосов
/ 31 августа 2012

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

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

Проверкаэто вышло: http://git -scm.com / book / ru / Git-Basics-Recording-Changes-to-Repository # Staging-Modified-Files

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

2 голосов
/ 26 января 2012

Я собираюсь предположить, что вы на 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

И затем вы можете уничтожить ветку 'what'

git branch -D whatever

edit :

Вы также можете сделать что-то подобное, используя stash:

git stash --keep-index  # Save unstaged changes
git stash               # Save staged changes
git stash pop stash@{1} # Pop unstanged changes
git commit ...          # Commit unstanged changes
git stash pop stash@{0} # Pop staged changes
git commit ...          # Commit staged changes
1 голос
/ 26 января 2012

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

git add --interactive

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

(см., Например, статью "git add --patch и --interactive")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...