Что означают те "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.