Что означают те "WIP" и "индекс", которые появляются после скрепления?

Когда я запускаю git lg в моей локальной ветке разработки, последняя фиксация отображается ниже:

* 7d21213 - (1 hours ago) update business rules - developer1 (HEAD, origin/develop, origin/HEAD, develop)

Однако, если я задержу локальные изменения, запустив git stash, а затем запустив git lg, я получаю следующее:

*  at12334 - (13 seconds ago) WIP on develop: 7d21213 update business rules - developer1 (refs/stash)
|\
| * ef9a11b - (14 seconds ago) index on develop: 7d21213 update business rules - developer1
|/
* 7d21213 - (1 hours ago) update business rules - developer1 (HEAD, origin/develop, origin/HEAD, develop)

Что это значит? Кажется, что после скрепления создаются две новые коммиты (помеченные index и WIP). Это так, и если да, то какова логика таких коммитов?


Примечание

git lg

- это псевдоним, уже определенный в тестовой среде как

git log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)' --all

Ответ 1

git lg? Что git lg?

Помните, что lg не является нативным Git глаголом. Правда, многие люди используют псевдоним lg, который обычно соответствует

git log --all --oneline --graph --decorate

Это определение похоже на то, которое вы используете. Однако псевдонимы являются локальными; что git lg означает, что ваша конфигурация может отличаться от того, что она означает в конфигурациях Боба и Алисы.

Следовательно, вы всегда должны включать определение соответствующего псевдонима в свой вопрос, чтобы мы (пользователи) могли находиться на той же странице, что и вы, и точно знать, что происходит при запуске

git <alias>

(git lg, здесь).

Какие загадочные объекты

Это объясняется в разделе обсуждения справочной страницы git-stash:

Закладок представляется как фиксация, чье дерево записывает состояние рабочий каталог, а его первый родитель - это фиксация в HEAD, когда был создан stash. Дерево второго родителя записывает состояние индекс, когда он сделан, и он сделан ребенком HEAD совершить. Граф предков выглядит следующим образом:

       .----W
      /    /
-----H----I

где H - это HEAD commit, I - это фиксация, которая записывает состояние индекса, а W - это фиксация, которая записывает состояние рабочего дерева.

В вашем случае

  • объект, короткий SHA которого ef9a11b соответствует состоянию вашего индекса (I на графике выше),
  • объект, короткий SHA которого at12334 соответствует состоянию вашего рабочего каталога (W на графике выше).

Эти два объекта (W и I) обычно не отображаются в выводе git log, но они используются, если вы используете флаг --all.

Ответ 2

"WIP" является аббревиатурой "Выполнение работ" . Это означает, что вы временно сохраняете текущее состояние своей работы, даже если вы не находитесь в естественной точке остановки.

Stashing сохраняет вашу работу в репозитории с помощью привычных механизмов фиксации/слияния. В частности, можно просмотреть все вложенные в данный момент элементы в контексте, запустив gitk --reflog, хотя только последний тайник будет помечен stash. Важное различие между регулярным фиксацией и типом заключается в том, что при удалении штампов (например, через git stash clear) они больше не видны в рефлоге и поэтому будут сложнее восстановить.

Заготовка обычно выполняется в двух частях:

  • Конец "индекса" выполняется для всего, что было "добавлено" с момента последнего коммита.
  • Выполнение "WIP" выполняется как слияние между рабочим состоянием и фиксацией индекса.

Если вы не выполнили никаких операций add с момента последнего коммита, фиксация индекса будет пустой. Однако, даже если индекс пуст, он по-прежнему совершается. Последующее неявное слияние может усложнить ситуацию, если вы, например, захотите сделать вишневый выбор из кошелька, чтобы избежать определенных осложнений, связанных с git stash pop.


Git механизм закладок умный, мощный и полезен, но он также сложный, подверженный ошибкам и опасный. В последнее время моя практика заключалась в том, чтобы избежать использования git stash для получения похожих результатов с чем-то вроде git commit -a -m "stash" для сохранения моей работы и git reset HEAD~1 (после проверки из "фиксации" ), чтобы восстановить его.

Это самое удобное приложение git stash, поскольку это быстрый способ избавиться от всех локальных изменений, если вы знаете, что они вам больше не нужны.

Кстати, вы можете удалить "WIP" и "index" из ваших журналов, запустив git stash clear -, но не делайте этого, если у вас есть ценная работа, сохраненная только на stash.