2012-02-04 1 views
45

Это трубопровод на ветке frontend за последние две недели.Как объединить несколько задержек в git

| [email protected]{3} - код с [email protected]{1} (за исключением двух крошечных залогов)
| Tiny Commit
| Крошечная фиксация
| Огромная сумма совершена две недели назад, теперь переустановлена ​​и переведена на [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} везде, где есть конфликты.

ответ

35

Вы можете применить кошелек только в том случае, если в рабочем дереве нет конфликтов с измененными файлами, поэтому убедитесь, что в 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}, так как первый был выталкивается.

+0

Два тайников большие и содержат много перекрывающей работу, поэтому я хотел бы избежать фиксаций. Можно ли просто объединить их в рабочем дереве, или я вынужден совершить эти большие куски, а затем объединить 2 дерьмовых фиксации и разделить их на ~ 10 хороших коммитов в vim? – sscirrus

+0

Другое дело: _I не хочу фиксировать весь этот код_. Значительные куски его все еще существуют только для развития. – sscirrus

+7

В чем разница между их объединением в рабочем дереве и изменением? Или выполнить «git reset HEAD ^» после применения второго тайника? Вы не можете применить кошелек на грязном рабочем дереве, поэтому вы должны * зафиксировать до его применения, но это не значит, что вы не можете отменить это фиксацию после применения. –

2

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

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

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

+0

Или просто вытащите stash @ {1} как diff и примените это локально (например, ответ siride и комментарии), но это тоже работает, спасибо! – rogerdpack

9

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

+0

Это, безусловно, самое простое, если изменения не перекрываются. Мне неловко приходится делать коммиты только для слияния контента. –

+1

@MarceloDiniz: всегда должно быть фиксация, если содержимое изменяется. Не глупо. – siride

+0

Применение штампа в качестве патча будет работать, если кошелек довольно тривиален, но не будет работать, если были промежуточные, нетривиальные изменения пробелов или изменения в пути к файлам – Kirby

74

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

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

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

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

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

    $ git reset --soft HEAD^ 
    
+4

Принял некоторое время, чтобы оценить красоту этого. Он работает намного лучше, чем пытаться применить патч, который часто терпит неудачу из-за изменений пробелов или путей файла. – Kirby

+0

Не забудьте перезагрузить свой файл после него, чтобы увидеть унифицированное изменение в 'git diff', потому что в настоящее время сбрасывается изменение поэтапно и рассматривается отдельно как 'git diff --staged'. – Nakilon

+0

Это похоже на лучшее решение, но я до сих пор не понимаю, почему мы не можем просто вышивать существующий тайник, пока у нас есть неустановленные изменения. Например, было бы неплохо просто запустить 'git stash pop', за которым следует' git stash pop'. Возможно, я пропустил что-то о внутренней оболочке git. – modulitos

 Смежные вопросы

  • Нет связанных вопросов^_^