Если некоторые изменения добавлены в индекс, а есть некоторые изменения, которые не добавлены в индекс, как мне поменять местами эти два набора изменений?
Способ с патчами (не работает для бинарных изменений):
Сохранять патчи как для подготовленных, так и для неустановленных состояний
git diff >> unstaged.patch
git diff --cached >> staged.patch
Применить исходные неустановленные изменения
git reset --hard
git apply unstaged.patch
Поместить эти изменения, кроме файлов патчей
git add -A
git reset -- staged.patch unstaged.patch
Применить первоначально подготовленные изменения
git apply staged.patch
Удалить файлы исправлений
rm staged.patch unstaged.patch
У Чарльза Бейли есть более полное решение, включающее коммиты и управление потенциальными разрешениями конфликтов.
Первоначально я пытался использовать только git stash
, за исключением того, что я изначально упустил из виду, что git stash
save сохранит оба индекса (поэтапные изменения) и неустановленные изменения (что неудобно, если вы хотите поменять местами содержимое индекса с неустановленными изменениями).
Поэтому вместо этого я изменил следующий подход:
git commit
-m "temp commit" (создать фиксацию для текущего индекса) git stash
(спрятать, очевидно, то, что еще не добавлено в индекс) git reset --soft HEAD^
(сохранить ранее зафиксированные файлы) git stash
снова git stash pop stash@{1}
(применяется не то, что вы только что спрятали, а то, что вы спрятали раньше, то есть первоначальные изменения, которые еще не были добавлены в индекс) git add -A
git stash drop stash@{1}
для очистки тайник, который мы ранее применили ( stash@{0} по-прежнему содержит то, что изначально было в индексе) В конце: