Как заставить git объединить изменения как «локальные изменения» для целей проверки? - PullRequest
0 голосов
/ 23 мая 2011

Что я хочу сделать, это объединить изменения между 2 коммитами в текущую песочницу как локальные изменения. Это возможно и легко сделать?

Я знаю, что вы можете использовать diff, но это не так просто, как просмотр локальных изменений. Локальные изменения позволяют вам легко возвращать / изменять / добавлять изменения, когда вы проходите проверку. Ближе всего к тому, что я хочу, было это:

1 оформить коммит до создания моей ветки

2 Создать новую временную ветку (только для безопасности)

3 создать патч между началом и концом ветви, как

git diff f9802a30b589503cd61e..4f6ee3fb127d958b5621 --patience --ignore-space-at-eol  > diff.txt

4 применить исправление к локальной песочнице (все еще во временной ветке)

git apply diff.txt

Есть проблемы с этим подходом, хотя. (A) Это очень медленно и больно. (B) я получаю тонны пробелов. (С) наверное это не способ сделать это;)

Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 23 мая 2011

(я предполагаю, что перед тем, как вы начнете, состояние git чистое, чтобы не потерять локальные изменения.)

Так как вы все равно создали временную ветку, почему бы вам просто не использовать git merge othercommit для объединения в другой коммит? Конечно, ваше рабочее дерево и индекс будут обновлены с результатами слияния - оно создаст новый коммит, но если вам это не нравится, вы можете просто проверить исходную ветку, чтобы вернуться. Если вы хотите внести дополнительные изменения, чтобы исправить результаты слияния, это все равно должно быть в дополнительном коммите поверх слияния.

Кроме того, вам даже не нужно создавать временную ветку - вы всегда можете использовать git reset --hard (с осторожностью!), Чтобы переместить вашу ветку туда, где она была.

Кстати, на (B) вы можете передать --whitespace=nowarn на git apply, чтобы прекратить эти предупреждения, или изменить то, что считается ошибкой пробела, изменив параметр конфигурации core.whitespace.


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

Вы можете выполнить слияние без фиксации результата, используя:

git merge --no-commit othercommit

... которая обновит вашу рабочую копию и индекс (промежуточную область) с результатами слияния, но не создаст коммит. Однако это немного рискованно - если вы затем перейдете к дальнейшим изменениям, которых не было ни у одного из родителей, а затем совершите это, вы создадите злое слияние , которое может вызвать различные проблемы, когда вы изучаете историю позже.

Точно так же, если вы просто хотите посмотреть, каким будет эффект слияния, вы можете сделать:

 git merge --squash othercommit

... который изменит ваше рабочее дерево на результаты слияния и внесет все эти изменения, но не создаст коммит. Однако, в отличие от --no-commit, если вы продолжите коммит, он не будет записывать othercommit как родитель нового коммита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...