'git применить прикладывание' с интерактивным режимом

У меня есть серия файлов в stash (stash{0}), и я хотел бы git apply просто некоторые части/куски этих файлов (обычно называемые Interactive mode).

Возможно ли это?

Я видел, что можно выполнить

git stash save -p 'Stash name'

но кажется невозможным сделать

git stash apply -p 'Stash name'

Знаете ли вы способ достичь этого?

Ответы

Ответ 1

Возможно ли это?

Да, это!

git checkout -p [email protected]{0}

Где вы можете заменить 0 в [email protected]{0} индексом кошелька, который вы хотите применить.

Используйте git stash list и git show -p [email protected]{n}, если не уверены, какой n - это тавро, которое вы хотите применить.

Не забывайте git stash drop [email protected]{n}, когда вам известно, что этот тайник больше не нужен, так как git checkout, очевидно, не отбросит вас.

Почему это работает?

Ключ должен понять, что stashes по существу references для фиксирует точно так же, как теги и ветки.

В самом деле, они хранятся в .git/refs/stash, одна строка в хэш-таблице.

Предостережения

Поскольку @mgadda упоминает int комментарии ниже, git checkout -p пытается применить всю разницу между фиксацией и текущей рабочей областью.

В случае git stash, если stash, который вы пытаетесь применить, был сделан против другой фиксации, тогда git checkout -p [email protected]{n} попытается интерактивно применить все различия между [email protected]{n} и всеми он parent совершает и текущую рабочую область.

Например, если вы пытаетесь применить к текущему рабочему пространству сохраненный "много коммитов назад", git checkout -p [email protected]{n} попытается применить не только изменения в своде, но и попытаться выполнить вернуть все изменения, произошедшие между фиксацией, на которой основан stash, и текущей фиксацией.

Аналогичным образом, если вы пытаетесь применить кошелек "из будущего", т.е. в ветку, которая представляет собой количество коммитов до фиксации, на которой основан stash, тогда git checkout -p [email protected]{n} будет также применяться все другие изменения, которые произошли между текущим фиксацией и фиксацией из будущего, кроме изменений самого стата.

(В случае, если вам интересно, git checkout -p [email protected]{n}, тайник из параллельной ветки попытается вернуть все изменения между текущей фиксацией и исходной точкой ветвления, а также применить все изменения между точкой ветвления и другой веткой, кроме того изменение кошелька).

Есть несколько обходных решений, ни одна из них не идеальна для любой ситуации:

  • Будьте осторожны с патчами, которые вы принимаете, когда вы делаете git checkout -p [email protected]{n}

  • Сделайте git stash pop, затем git stash еще раз перед тем, как сделать git checkout -p .... Но если вы хотите сделать частичное применение своего кошелька, чтобы избежать конфликтов, это не поможет.

  • Если у вас есть инструмент графического разграничения, поддерживаемый git (например, meld), вы можете использовать git difftool и "применить левые" все изменения, которые вас интересуют.

    • git difftool -d [email protected]{n}, чтобы сравнить весь файл и все его файлы

    • git difftool [email protected]{n} -- path/to/file для сравнения одного файла

Ответ 2

Я не думаю, что есть способ применить изменения с помощью ханков (или даже файлов). Вам нужно будет применить кошелек, а затем сохранить изменения, которые вы не хотите в интерактивном режиме (с помощью git stash save -p). Если вы беспокоитесь о конфликтах, вы можете сначала спрятать любые незафиксированные изменения, применить свой кошелек, сшить любые конфликтующие куски, а затем применить другой тайник.