Git Invert Staging Area
У меня есть изменения в моей промежуточной области, а другие еще не подготовлены (некоторые файлы имеют изменения как в промежуточной области, так и вне ее). Я хотел бы инвертировать содержимое области подготовки и изменения, которые не являются этапами. Существует ли ярлык для того, чтобы сделать это, не выполняя более сложные действия, такие как локальные коммиты боковых ветвей, или diff, или stashes [etc.]? Благодарю.
4 ответа
Вот как я это делаю:
- Зафиксировать индекс во временную фиксацию
- Зафиксируйте остаток во вторичной временной фиксации
- Переключите порядок коммитов с интерактивной перебазировкой
- Смешанный сброс
- Мягкий сброс
Он может быть напечатан вручную довольно быстро, особенно если вы используете Vim для сообщений коммита:
git commit -m tmp1
git add . # optionally with `git add -u` if there are deletions
git commit -m tmp2
git rebase -i HEAD~2 # swap the order of the commits; `ddp:wq` in vi
git reset HEAD~1
git reset HEAD~1 --soft
Вероятно, есть несколько способов сделать это, но я думаю, что я бы выбрал этот подход - в настоящее время нет готовых ярлыков для этого, но вы могли бы довольно легко написать свой собственный скрипт, чтобы следовать этому процессу:
Сгенерируйте патч для материала, который в данный момент находится в вашем рабочем каталоге, но еще не в вашем индексе (вещи, которые вы еще не сделали
git add
за)git diff-files -p > /tmp/unstaged.patch
Сгенерируйте патч для того, что вы уже добавили в индекс против вашего текущего
HEAD
git diff-index --cached -p HEAD > /tmp/staged.patch
Сбросьте свой индекс и рабочий каталог к вашему
HEAD
git reset --hard HEAD
Примените ваш необработанный патч как к вашему рабочему каталогу, так и к индексу, в результате чего эти изменения будут поэтапно
git apply --index /tmp/unstaged.patch
Примените ваш поэтапный патч только к вашему рабочему каталогу
git apply /tmp/staged.patch
В зависимости от точного характера ваших изменений, шаги 4 и / или 5 могут привести к некоторым конфликтам слияния, которые вам нужно разрешить вручную, но я не уверен, что есть чистый способ полностью избежать этой возможности.
Вы могли бы, вероятно, использовать git stash
выполнить шаги 1 и 4 вместо вышеперечисленных команд, но я не уверен, что это действительно поможет вам...
Кроме того, вы можете просмотреть справочные страницы для git diff-*
а также git apply
Сначала команды, чтобы увидеть, есть ли другие варианты, которые могут иметь смысл для вас.
Основываясь на ответе gtd и возможности сценария инвертирования коммитов, я сейчас использую:
[alias]
swaplast = !git tag _invert && git reset --hard HEAD~2 && git cherry-pick _invert _invert~1 && git tag -d _invert
invertindex = !git commit -m tmp1 && git add -A && git commit -m tmp2 && git swaplast && git reset HEAD~1 && git reset HEAD~1 --soft
Размещено в моем блоге здесь: http://blog.ericwoodruff.me/2013/12/inverting-git-index.html
Это то, что я использую для решения этой проблемы.
Первый git reset
который удалит все файлы из "промежуточной" в "файлы, не подготовленные для фиксации". Файлы, которые находятся как в "промежуточных", так и в "файлах, не подготовленных для фиксации", сохранят ваши последние изменения, которые в настоящее время находятся в ваших "файлах, не подготовленных для фиксации".
затем
git add /path/to/file
конкретные файлы, которые вам нужно добавить в постановку
Не совсем короткий путь, но он выполняет свою работу
Обратно, после тебя git reset
, вы могли бы git checkout /path/to/file
для файлов, которые в данный момент "не подготовлены для фиксации", которые вы не хотите добавлять в промежуточную. Это приведет к удалению определенных файлов из "не подготовлено к фиксации"
затем беги git add .
который добавит все файлы в "не подготовленные для фиксации" к "подготовительные" - в зависимости от того, что проще для вашей ситуации