Как объединить несколько тайников в git - PullRequest
55 голосов
/ 04 февраля 2012

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

|Stash@{3} - это весь код, начиная с Stash@{1} (исключая два крошечных коммита)
|Tiny Commit
|Крошечный коммит
|Огромная массовая фиксация две недели назад, теперь перебазирована и перемещена в Stash@{1}

Мое рабочее дерево в настоящее время чистое.
Stash@{1} - это содержимое массовой фиксации общего кода разработки две недели назад (этонадо было спрятать в первую очередь).Этот коммит был отменен и перемещен в тайник.
Stash@{3} - самая новая работа с этим деревом с Stash@{1} (за исключением нескольких изменений, которые были зафиксированы).

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

Я запустил git stash apply stash@{1}, затем попытался:

git stash apply stash@{3}
git stash show -p | git stash apply stash@{3}

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

Ответы [ 4 ]

93 голосов
/ 24 января 2013

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

  1. Вытащите первый тайник

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

    $ git add . && git commit -am 'WIP'
    
  3. Суньте второй сундук

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

    $ git reset --soft HEAD^
    
42 голосов
/ 04 февраля 2012

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

git stash apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}

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

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

12 голосов
/ 12 марта 2012

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

2 голосов
/ 12 марта 2012

У меня была похожая проблема, и я решил ее следующим образом.

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

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

...