Отбросьте все задержки, связанные с определенной ветвью

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

Когда я закончил работу с веткой, я возвращаюсь через свой список и вручную удаляю все штампы, связанные с веткой. Есть ли способ сделать это в одной команде?

Например, текущий текущий список выглядит следующим образом:

[email protected]:~/my/dev/work$ git stash list
[email protected]{0}: WIP on master: 346f844 Commit comment
[email protected]{1}: WIP on second_issues: a2f63e5 Commit comment
[email protected]{2}: WIP on second_issues: c1c96a9 Commit comment
[email protected]{3}: WIP on second_issues: d3c7949 Commit comment
[email protected]{4}: WIP on second_issues: d3c7949 Commit comment
[email protected]{5}: WIP on second_issues: d3c7949 Commit comment
[email protected]{6}: WIP on second_issues: 9964898 Commit comment

Есть ли команда, которая отбрасывает все штампы из second_issues?

Ответ 1

Как насчет этого? Это быстрый и грязный способ, который удаляет штампы, созданные на данной ветке.

Он просто перечисляет все тиски, поиски с grep для закладок, созданных на ветке, получает свое имя и затем передает те имена git stash drop через xargs.

git stash list | grep -E '[email protected]{[0-9]+}.+ YOUR_BRANCH_NAME' | cut -d ':' -f 1 | xargs git stash drop

Изменить

Копая страницы man, он говорит, что git stash list также принимает опции формата git log.
Поэтому мы говорим, что он печатает строки, которые соответствуют только YOUR_BRANCHNAME, и из этих строк просто печатать свое "идентификационное имя reflag" (%gd: shortened reflag selector, e.g., [email protected]{1}, с man-страницы).
Затем мы передаем вывод на xargs, чтобы удалить тайник.

git stash list --grep='YOUR_BRANCHNAME' --format='%gd' | xargs git stash drop

Ответ 2

Запас не зависит от какой-либо ветки. Кошелек - это всего лишь трюк для вашего хранилища. Каждый репозиторий имеет ровно один тайник, но вы можете поместить столько наборов изменений, сколько хотите в кошельке, и он сохранит их позже. Таким образом, ваши разметки не различаются между ветвями. В вашем случае stash @{6} покажет вам то же самое, независимо от того, какую ветвь вы проверили. Если вы хотите очистить свой кошелек, вы можете запустить git stash clear, и это очистит ваш тайник всех спрятанных изменений для этого репо. Это довольно деструктивная операция, поэтому будьте осторожны при ее использовании.

Ответ 3

Один из подходов к проверке взаимосвязи между косой чертой и данной ветвью заключается в проверке того, содержится ли родительская фиксация тайника в вашей ветке.

Родительская фиксация stash - это фиксация, из которой был создан stash. Если эта фиксация присутствует в вашей ветке интереса, вы можете сбросить ее или предпринять необходимые действия.

Существует небольшой bash script, чтобы определить, возникла ли какая-либо из ваших задержек от фиксации, которая в настоящее время содержится в HEAD:

#!/bin/bash

# Get a list of all stashes, like "[email protected]{0}", "[email protected]{1}", and so on
stashList=$(git stash list | grep -o "^[email protected]{[0-9]*}")

for stashRef in $stashList; do

    # Obtain hashes for the stash and its first parent
    currentHash=$(git rev-parse $stashRef)
    parentHash=$(git rev-parse $stashRef^)

    echo "$stashRef: $currentHash"
    echo "parent: $parentHash"

    # merge-base checks for the common parent
    mergeBase=$(git merge-base $parentHash HEAD)

    # If a commit is contained in another commit, it will be the base
    # commit returned by merge-base
    if [[ $mergeBase == $parentHash ]]; then
        echo 'Contained in HEAD'
    else
        echo 'Not contained in HEAD'
    fi
done