2016-05-27 5 views
1

Так что я работаю в Git и пытаюсь создать новую ветку, где я могу сбросить содержимое своего кошелька, и отдаю предпочтение моему при любых конфликтах слияния, возникающих при этом. Я делаю следующее:Хотите применить мой кейс к новой ветке и переопределить все, что у меня есть в моем stash

git checkout -b *newbranchname* 
git stash apply 

И это говорит мне о конфликтах слияния в файле. Как я могу это сделать в терминале и автоматически одобрять тайник в любых конфликтах без необходимости иметь дело с ними конкретно?

ответ

2

На мой взгляд, самый простой способ «не делай этого» :-)

Вместо этого, превратить ваш git stash содержимое в филиал своей собственной:

git stash branch newbr 

Теперь у вас есть новый филиал newbr, с индексом, готовым к фиксации (если у вас есть элементы git add ed для индекса) и дерево работы, измененное в соответствии с приложением, готовое к отправке git add ed и совершенное. Если вы тщательно добавили материал раньше, продолжайте и зафиксируйте это сейчас, затем добавьте все остальное и совершите еще раз. Если нет, просто добавьте все сейчас и совершите. Теперь у вас есть новая ветка newbr с одним или двумя коммитами на нее - сколько зависит от количества git commit s, которое вы только что сделали, - которое соединяется с тем, что было зафиксировано, когда вы сделали git stash.

Теперь вы можете создать другую новую ветку с другой отправной точки, если это то, что вы хотите, и используйте git cherry-pick для переноса этих коммитов, а затем отбросьте новую ветку. Или, вы можете использовать git rebase -i (с аргументами <upstream> и, необязательно, --onto), чтобы скопировать коммиты в другом месте по обычной схеме переустановки, отменив первоначальные фиксации после завершения копирования. Или, если существующая начальная точка newbr - это то, что вы хотели в конце концов, вы уже настроены.


Все, что сказал, если вы действительно сделать хотите просто проверить версию работы-древовидную конфликтующих файлов, полностью игнорируя текущую версию этих файлов, вы можете сделать это довольно легко. Важно помнить, что имя ссылки stash (или [email protected]{N} для некоторого числа N) относится к w орк дерева фиксации, что git stash сделал, когда он спас i и w фиксаций на stash bag. Следовательно:

git checkout stash -- path/to/file 

извлекает версию path/to/filew, записав его через индекс (отсюда и решение любых конфликтные слияний), полностью игнорируя версию этого файла HEAD.

(The i NDEX-совершающие версии файлов в stash^2, и если есть неотслеживаемый/все-файлы совершают эти файлы находятся в stash^3, как я уже отмечал в that other answer. Хотя w технически слияние совершить, это не является нормальным слиянием, и, в частности, совершение всех файлов очень необычно, поскольку у него есть только этих файлов и ни один из файлов индекса/дерева работ.)

0

Вы можете попробовать

git merge-recursive --theirs stash^ -- @ stash 

, чтобы увидеть, если вам нравятся результаты.