как заставить git объединить изменения как «локальные модификации» для целей проверки?

#git #merge

#git #слияние

Вопрос:

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

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

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

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

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

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

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

 git apply diff.txt
  

Однако с этим подходом есть проблемы. (A) Это очень медленно и болезненно. (B) я получаю предупреждение о множестве пробелов. (C) вероятно, это не тот способ сделать это 😉

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

Комментарии:

1. не могли бы вы нарисовать ascii-график текущего состояния репозитория и объяснить, что вы хотите таким образом?

Ответ №1:

(Я предполагаю, прежде чем вы начнете, что состояние 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 как родительская для нового коммита.