Git Merge без постановочных изменений - PullRequest
0 голосов
/ 20 ноября 2019

Я хотел бы объединить ветку, не ставя автоматически объединенные файлы для фиксации. Я ожидаю, что слияние будет грязным, и я хотел бы использовать git diff, чтобы просмотреть все изменения перед фиксацией. Флаг --no-commit предотвращает завершение фиксации, но файлы все еще находятся в стадии подготовки. Есть ли способ слияния без постановки файлов на коммит?

Ответы [ 2 ]

3 голосов
/ 20 ноября 2019

Если речь идет только о проверке, вы можете увидеть поэтапные изменения, используя git diff --cachedБудет ли это работать для вас ситуации?

2 голосов
/ 20 ноября 2019

Нет.

Техническая причина этого заключается в том, что Git объединяется на самом деле в индексе , который временно расширяется, чтобы удержать все три входных коммита. Поскольку каждый файл успешно объединен (без конфликтов), Git сжимает эту конкретную запись индекса прямо до одной записи с нулевым интервалом, которая, следовательно, ставится для фиксации. Для конфликтующих файлов Git оставляет эту запись индекса как три занятых слота с номерами 1 (база слияния), 2 (--ours или версия фиксации HEAD) и 3 (--theirs).

Во время слияния работаФайлы -tree в основном представляют собой пустышки / пустые листы, за исключением того факта, что Git обновляет их, чтобы сохранить попытку слияния. Все реальные действия в индексе. Если все идет хорошо, все файлы рабочего дерева обновляются в соответствии с конечной копией с нулевым интервалом, т. Е. Похоже, что Git их поставил. Но на самом деле все пошло иначе: правильная версия вошла в индекс в нулевом слоте, а затем Git выполнил операцию в стиле git checkout-index, чтобы скопировать файл индекса в рабочее дерево.

As EncryptedWatermelon сказал в комментарии , вы можете использовать git reset здесь:

git reset HEAD -- <filename>

говорит Git скопировать запись фиксации HEAD для файла в запись индекса для этого файла. Использование git reset --mixed HEAD, которое можно записать git reset без параметров, говорит Git сделать это для каждого файла. 1 Нет прямого / немедленного значения для использования git reset, какэто потому, что вы можете использовать git diff --cached для сравнения HEAD с индексом, если вы хотите посмотреть, что происходит с обновленными индексными копиями файлов. Но вы можете сделать это, если хотите, и если вы хотите снять все с сцены, а затем поставить только несколько вещей, по любой причине, это доступно.


1 Эта --mixed форма git reset также указывает Git обновить текущее имя ветки, чтобы его сохраненный хеш-идентификатор был текущим сохраненным хеш-идентификатором. Если вы написали это git reset --mixed <em>hash</em>, вы сбросили бы индекс с указанного идентификатора хеша и записали указанный идентификатор хеша в имя текущей ветви. Используя HEAD, мы заставляем «изменить» имя ветви, чтобы «установить его на текущее значение», т. Е. Вообще не перемещать его. Это оставляет перезапись содержимого индекса как единственный видимый эффект.

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