Git: предупреждать при переходе на ветку, в которой сохранены изменения

Есть ли способ заставить git автоматически предупреждать вас при переходе на ветку, в которой есть спрятанные изменения?

Я ищу что-то вроде:

$ git checkout my-branch
Switched to branch 'my-branch'
Stashed changes present: stash@{0}: WIP on my-branch: 836b45a My HEAD commit

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


person zool    schedule 08.11.2015    source источник


Ответы (3)


В ветке нет "заначки".

Тайник — это просто список патчей, которые вы можете применять где угодно.

Как насчет того, чтобы добавить предупреждение к более независимой от ветки команде, такой как git status?

У вас есть коммит 2414b45 (git 1.6.4, июнь 2009 г.)

Показать наличие спрятанных изменений в командной строке bash.

Добавьте '$' в вывод __git_ps1, чтобы показать, что сохраненные изменения присутствуют, когда GIT_PS1_SHOWSTASHSTATE установлено непустое значение.

Код для проверки наличия записей в тайнике взят из 'git-stash.sh'.

Так что постарайтесь:

export GIT_PS1_SHOWSTASHSTATE=1 # Unix
set GIT_PS1_SHOWSTASHSTATE=1 # Windows

git stash изначально был добавлен в git в commit f2c66ed (git 1.5.3, июнь 2007 г.) Нанако Шираиси.

Это совсем новый git (2.4.2, апрель 2014 г., commit ed178ef) который пытался отобразить предупреждение только относительно вашего текущего индекса (независимо от вашей текущей ветки):

Cannot apply stash: Your index contains uncommitted changes.

stash: для применения требуется чистый индекс

Если вы поместили содержимое в свой индекс и запустили «stash apply», мы можем столкнуться с конфликтом и добавить новые записи в индекс. Восстановление исходного состояния в этот момент затруднено, потому что такие инструменты, как «git reset --keep», снесут все, что было поставлено. Мы можем сделать это более безопасным, отказавшись от применения, когда есть поэтапные изменения.

Возможно, здесь мы могли бы предоставить лучший инструментарий, так как "git stash apply" должен записывать в индекс только конфликты (поэтому мы знаем, что любые записи этапа 0 потенциально ценны).
Но это странная утка; большинство команд «объединения» будут обновлять индекс для чисто объединенных записей, и не стоит обновлять наш инструментарий для поддержки этого варианта использования, который вряд ли будет представлять интерес (кроме того, нам все равно нужно будет заблокировать грязный индекс для «stash apply --index ", так как этот случай будет неоднозначным).

Однако это было отменено в commit 1937610 (git 2.4.6, июнь 2015 г.).


person VonC    schedule 08.11.2015

Нет, это невозможно просто потому, что в Git спрятанные изменения не связаны с веткой. т.е. вы можете легко stash незафиксировать изменения, находясь в ветке A, и stash pop их, находясь в ветке B. Вероятно, в таком случае вам нужно разрешать конфликты, но тем не менее это доказывает, что тайник является глобальным для репозитория, а не локальным для ветки.

Также см. вопросы Относится ли git stash к ветке или ко всему репозиторию? или Почему тайник git не уникален для каждой ветки?

person sschuberth    schedule 08.11.2015
comment
Хорошо знать. Как насчет того, чтобы добавить предупреждение к более независимой от ветки команде, такой как git status? Что-то вроде nothing to commit, working directory clean, but stashed changes present. - person zool; 08.11.2015
comment
Что ж, вы можете придумать для этого решение на основе git-prompt или просто использовать существующее решение, например bash-git-prompt, который показывает количество спрятанных записей. - person sschuberth; 08.11.2015

Как насчет того, чтобы использовать для этого какой-нибудь bash?

Вы можете добавить к своему ~/.bashrc что-то вроде:

gco() {
    git checkout $@
    local CURRENT_BRANCH=$(git branch | grep '*' | awk '{ print $2 }')
    git stash list | grep $CURRENT_BRANCH
    if [ $? -eq 0 ]; then
        echo Hello! The current branch has stashed content!
    fi
}

Примечание: псевдонимы имеют приоритет над функциями. Сначала убедитесь, что gco не имеет псевдонимов.

Если which gco показывает что-то вроде gco: aliased to git checkout, вам придется использовать что-то другое.

person Diego Milán    schedule 24.04.2018