Отбросьте все задержки, связанные с определенной ветвью
Я привык записывать свои изменения в 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