Какова цель создания git stash и магазина git stash?

Из документации в git-scm есть две команды git stash, которые указывают на важность сценариев, но не для общего использования:

Создайте

Создайте stash (который является обычным объектом фиксации) и верните его имя объекта, не сохраняя его нигде в пространстве имен ref. Это предназначено для использования в скриптах. Это, вероятно, не та команда, которую вы хотите использовать; см. "сохранить" выше.

магазин

Храните заданный кошелек, созданный с помощью git stash create (который является обманывающим слиянием) в stash ref, обновляя stash reflog. Это предназначено для использования в скриптах. Это, вероятно, не та команда, которую вы хотите использовать; см. "сохранить" выше.

Предположим, что мы рассматриваем контекст автоматизированных скриптов, какие преимущества git stash create git stash store и git stash store дают мне возможность git stash save обычную git stash save и друзей?

Ответ 1

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

В зависимости от того, что произойдет дальше, вы можете (в случае ошибки, скажем) решить, что вы действительно хотите повредить stash reflog, после чего вы можете использовать git stash store.

Очевидно, что регулярный тайник может быть реализован с точки зрения create, а затем store, но я также могу предположить, что он используется в гипотетической команде update-branch которая делает что-то вроде этого:

git stash create
git fetch
git rebase
git stash apply

Ответ 2

К сожалению, хороший пример, показанный выше, не работает во всех случаях, потому что:

  • Если есть какие - то локальные изменения git stash create будет создать без ссылок совершить, но это не будет фактически очистить локальные изменения.

  • Если нет каких - либо локальных изменений, то он не будет создавать фиксацию вообще (как BlackVegetable указал). В этом случае мы не должны apply в конце.

  • (И второстепенный: Андрей забыл сохранить и использовать идентификатор фиксации, созданный при create.)

Имея это в виду, мне кажется, что использование должно быть таким:

# Save the local changes, keep a reference to them, and clear them
stashed_commit="$(git stash create)"
git reset --hard

# Do your thing
git fetch
git rebase

# If there were local changes, then restore them
if [ -n "${stashed_commit}" ]
then git stash apply "${stashed_commit}"
fi

Неплохо, если не сказать больше!

Увы. Это было бы намного проще, если бы я мог просто git stash save --allow-empty сверху, а git stash pop внизу.

Я хотел бы ошибаться. Пожалуйста, поправьте меня!