Git инвертирует промежуточную область

У меня есть изменения в моей области подготовки, а другие еще не подготовлены (некоторые файлы имеют изменения как в области подготовки, так и за ее пределами). Я хочу инвертировать содержимое промежуточной области и изменения, которые не промежуточны. Существует ли для этого ярлык без выполнения более сложных действий, таких как локальные коммиты, сравнения или тайники [и т. д.]? Спасибо.


person moala    schedule 31.01.2013    source источник
comment
Вау, спасибо за ссылку. Не те же условия поиска, но действительно та же проблема.   -  person moala    schedule 01.02.2013


Ответы (4)


Вот как я это делаю:

  1. Зафиксировать индекс во временную фиксацию
  2. Зафиксируйте оставшуюся часть во вторичной временной фиксации
  3. Переключение порядка коммитов с помощью интерактивной перебазировки
  4. Смешанный сброс
  5. Мягкий сброс

Его можно напечатать вручную довольно быстро, особенно если вы используете 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
person gtd    schedule 25.03.2013
comment
Мне это нравится, за исключением ручного редактирования для замены коммитов. stackoverflow.com/questions/16203562/ - person Eric Woodruff; 08.12.2013
comment
Хорошая точка зрения. Но лично для меня проблема в том, что я не делаю этого достаточно, чтобы написать сценарий быстрого доступа и запомнить, как он называется и как он работает. Интерактивный ребейзинг я делаю почти каждый день, и он чрезвычайно интуитивно понятен и эффективен для меня. - person gtd; 12.12.2013

Вероятно, есть несколько способов сделать это, но я думаю, что я бы выбрал этот подход — в настоящее время для этого нет заранее созданного ярлыка, но вы можете довольно легко написать свой собственный скрипт, чтобы следовать этому процессу:

  1. Сгенерируйте патч для вещей, которые в данный момент находятся в вашем рабочем каталоге, но еще не в вашем индексе (вещи, для которых вы git add еще не сделали)

    git diff-files -p > /tmp/unstaged.patch
    
  2. Создайте патч для того, что вы уже добавили в индекс, по сравнению с вашим текущим HEAD

    git diff-index --cached -p HEAD > /tmp/staged.patch
    
  3. Сбросьте свой индекс и рабочий каталог на свой HEAD

    git reset --hard HEAD
    
  4. Примените свой неустановленный патч как к вашему рабочему каталогу, так и к вашему индексу, в результате чего эти изменения будут поэтапными.

    git apply --index /tmp/unstaged.patch
    
  5. Примените поэтапный патч только к своему рабочему каталогу.

    git apply /tmp/staged.patch
    

В зависимости от точного характера ваших изменений шаги 4 и/или 5 могут привести к некоторым конфликтам слияния, которые вам нужно разрешить вручную, но я не уверен, что есть чистый способ полностью избежать такой возможности.

Возможно, вы могли бы использовать git stash для выполнения шагов 1 и 4 вместо приведенных выше команд, но я не уверен, что это действительно принесет вам пользу…

Кроме того, вы можете сначала просмотреть справочные страницы для команд git diff-* и git apply, чтобы узнать, есть ли другие параметры, которые могут иметь смысл для вас.

person twalberg    schedule 31.01.2013

Основываясь на ответе 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

person Eric Woodruff    schedule 08.12.2013
comment
Я провел некоторое исследование и тестирование, и это моя неавторизованная документация: swaplast меняет местами последний и предпоследний коммит. Внимание: он отбрасывает незафиксированные изменения без предварительного уведомления. invertindex меняет местами поэтапные и неустановленные изменения, включая неотслеживаемые файлы. - person Melebius; 20.11.2014
comment
Если по какой-то причине это не удается, вам может потребоваться запустить git cherry-pick --abort, прежде чем вы сможете снова запустить git invertindex. - person u01jmg3; 18.07.2016
comment
Большое спасибо! Я превратил их в отдельные git swaplast и скрипты git invertstage (вам также понадобятся git existsbr), которые также предлагают продолжение (с --continue) в случае конфликтов. Исходные псевдонимы просто прерываются и оставляют пользователя в затруднительном положении. - person Ingo Karkat; 17.07.2019

Это то, что я использую для решения этой проблемы.

Сначала git reset, который удалит все файлы из «промежуточных» в «файлы, не подготовленные для фиксации». Файлы, которые находятся как в «промежуточных», так и в «файлах, не подготовленных для фиксации», сохранят ваши самые последние изменения, которые в настоящее время находятся в ваших «файлах, не подготовленных для фиксации».

тогда

git add /path/to/file конкретные файлы, которые нужно добавить в промежуточную версию

Не совсем короткий путь, но он выполняет свою работу

И наоборот, после того, как вы git reset, вы можете git checkout /path/to/file для файлов, которые в настоящее время «не подготовлены для фиксации», которые вы не хотите добавлять в подготовку. Это удалит определенные файлы из «не подготовленных к фиксации»

затем запустите git add ., который добавит все файлы из «не подготовленных для фиксации» в «постановочные» - в зависимости от того, что проще для вашей ситуации.

person Alex Naspo    schedule 31.01.2013
comment
На самом деле, я бы точно предпочел не делать это вручную, потому что граница между поэтапным и нестадийным довольно сложная: даже внутри некоторых файлов одни строки являются поэтапными, а другие нет. - person moala; 31.01.2013
comment
Вам не показалось мое недавнее редактирование в отношении файлов как поставленных, так и не поставленных? - person Alex Naspo; 31.01.2013
comment
Что вы имеете в виду, говоря, что вы можете git проверить файлы, которые вам не нужны [...]? мне это совсем непонятно... - person moala; 31.01.2013
comment
Я попробую это, но в настоящее время я не понимаю, как это может выполнить эту работу. - person moala; 31.01.2013