Как объединить несколько задержек в git

Это конвейер на ветке frontend за последние две недели.

| [email protected]{3} - это весь код с [email protected]{1} (за исключением двух крошечных коммитов)
| Крошечный коммит
| Крошечная передача
| Огромная сумма денег совершена две недели назад, теперь переустановлена ​​и переместилась на [email protected]{1}

В настоящее время мое рабочее дерево чист. [email protected]{1} - это содержимое от массового коммита общего кода разработки две недели назад (это должно было быть спрятано в первую очередь). Эта фиксация была отменена и перемещена в stash.
[email protected]{3} - это новейшая работа над этим деревом с [email protected]{1} (минус несколько изменений, которые были совершены).

Мне нужно объединить эти два штампа вместе в моем рабочем дереве, чтобы я мог сделать несколько коммитов из этого огромного пула работы.

Я побежал git stash apply [email protected]{1}, затем я попробовал:

git stash apply [email protected]{3}
git stash show -p | git stash apply [email protected]{3}

но я получаю "грязное рабочее дерево" в обоих случаях. Как я могу объединить эту работу вместе? Поскольку [email protected]{3} является более новым, я хочу, чтобы он заменил [email protected]{1} везде, где есть конфликты.

Ответ 1

Вы можете применить только кэш, если в рабочем дереве нет конфликтов с измененными файлами, поэтому, во-первых, убедитесь, что в git status нет измененных файлов, если есть, зафиксировать их. Затем выполните:

git stash apply [email protected]{1}
git commit -a
# Enter your commit message
git stash apply [email protected]{3}

Затем вы можете либо сделать новую фиксацию, либо изменить предыдущую, чтобы объединить их. Возможно, вам придется разрешать конфликты слияния после каждого применения.

Кроме того, если вы когда-нибудь решили использовать git stash pop, а не apply, обратите внимание, что [email protected]{3} станет [email protected]{2}, поскольку первый был удален.

Ответ 2

Это немного связано, но это почти всегда работает:

  • Попасть в первый тайник

    $ git stash pop
    
  • Временно зафиксировать изменения с первого тайника

    $ git add . && git commit -am 'WIP'
    
  • Попасть во второй тайник

    $ git stash pop
    
  • Отменить временную фиксацию, сохраняя внесенные изменения

    $ git reset --soft HEAD^
    

Ответ 3

Лучше всего использовать git stash show -p [email protected]{whatever} > stash-{whatever}.diff, а затем использовать git apply для каждого из них.

Ответ 4

У меня была аналогичная проблема, и я решил это так.

Используйте git stash pop, чтобы применить одно из заданий. Затем создайте патч этого тайника с помощью git diff -p > ../stash.diff. Затем вы можете reset создать свое рабочее дерево (или снова вставить изменения), а другой трюк - git stash pop [email protected]{1}. Если вы примените свой патч в этот момент, вы можете "объединить" два разных штампа.

Вероятно, вам удастся разрешить некоторые конфликты. Если все пойдет хорошо, вы можете отменить спрятанные изменения.