В чем разница между git удаленного чернослив, чернослив Гит, Гит выборки, сливовый и т. д.
моя ситуация такова... кто-то, работающий над тем же РЕПО, удалил ветку из своего локального и удаленного РЕПО...
большинство людей, которые спрашивали об этой проблеме при переполнении стека или на других сайтах, имеют проблему ветвей, которые все еще отображаются в их списке ветвей удаленного отслеживания git branch -a
внизу:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
однако, в моей ситуации ветка, которая не должна быть там, является локальной:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
когда я делаю что-либо из следующего, это не так удаляются локально:
$ git prune
я тоже пробовал:
$ git remote prune origin
$ git fetch --prune
более полезная информация: когда я проверяю git remote show origin
вот как это выглядит:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
обратите внимание, что это только в раздел Local branches configured for 'git pull':
почему?
4 ответа:
я не виню вас за то, что вы расстраиваетесь по этому поводу. Лучший способ посмотреть на это. Существует потенциально три версии каждой удаленной ветви:
С
- фактическая ветвь в удаленном репозитории
- ваш снимок этой ветви локально (хранится под
refs/remotes/...
)- и локальная ветвь, которая может отслеживать удаленную ветвь
git prune
. Это удаляет объекты что нет больше не используется, он не удаляет ссылки. В вашем случае, у вас есть местное отделение. Это означает, что есть ссылка с именемrandom_branch_I_want_deleted
это относится к некоторым объектам, которые представляют историю этой ветви. Так что, по определению,git prune
не будут удаленыrandom_branch_I_want_deleted
. Действительно,git prune
- это способ удаления данных, которые накопились в Git, но на которые ничего не ссылается. В общем, это не влияет на ваше представление о каких-либо ветвях.
git remote prune origin
иgit fetch --prune
как работать на ссылки в разделеrefs/remotes/...
(Я буду ссылаться на них как на удаленные ссылки). Это не влияет на местные филиалы. Элементgit remote
версия полезна, если вы хотите удалить удаленные ссылки под конкретный пульт. В противном случае, они делают точно то же самое. Итак, короче говоря,git remote prune
иgit fetch --prune
приведитесь в действие дальше номер 2 выше. Например, если вы удалили ветку с помощью Git web GUI и больше не хотите, чтобы она отображалась в вашем локальном списке ветвей (git branch -r
), то это команда, которую вы должны использовать.чтобы удалить локальную ветку, нужно использовать
git branch -d
(или-D
если он нигде не объединен). FWIW, нет команды git для автоматического удаления локальных ветвей отслеживания, если удаленная ветвь исчезает.
git remote prune
иgit fetch --prune
сделайте то же самое: удалите ссылки на ветви, которые не существуют на пульте дистанционного управления, как вы сказали. Вторая команда подключается к удаленному устройству и извлекает его текущие ветви перед обрезкой.однако он не касается локальных ветвей, которые вы проверили, которые вы можете просто удалить с помощью
git branch -d random_branch_I_want_deleted
заменить
-d
by-D
если ветка не слилась в другом месте
git prune
делает что-то другое, он очищает недостижимые объекты, те коммиты, которые недоступны ни в одной ветке или теге и, следовательно, больше не нужны.
обратите внимание, что единственное различие между
git remote --prune
иgit fetch --prune
ремонтируется, с commit 10a6cc8, by Тома Миллера (tmiller
) (для git 1.9 / 2.0, Q1 2014):когда у нас есть ветка удаленного отслеживания с именем"
frotz/nitfol
" из предыдущей выборки, и вышестоящим теперь имеет филиал под названием "**содержаться материалы только"**,fetch
не удалить "frotz/nitfol
" С "git fetch --prune
" от вышестоящего.
ГИТ будет информировать пользователей, чтобы использовать "git remote prune
" исправить проблему.Итак: когда a вверх по течению РЕПО имеет ветку ("frotz") с тем же именем, что и ветвь иерархии ("frotz / xxx", возможно соглашение об именовании ветвей),
git remote --prune
удалось (в очистке ветви удаленного отслеживания из вашего РЕПО), ноgit fetch --prune
неспособность.больше не буду:
изменить в сторону "
fetch --prune
" работает перемещая операцию обрезки перед операцией выборки.
Таким образом, вместо предупреждения пользователя о конфликте он автоматически исправляет его.
в том случае, если кто-то будет заинтересован. Вот быстрый сценарий оболочки, который удалит все локальные ветви, которые не отслеживаются удаленно. Слово предостережения: это позволит избавиться от любой ветви, которая не отслеживается удаленно, независимо от того, была ли она объединена или нет.
если вы видите какие-либо проблемы с этим, пожалуйста, дайте мне знать, и я буду это исправить (и т. д. так далее.)
сохраните его в файле под названием
git-rm-ntb
(назовите это как угодно) наPATH
и беги:
git-rm-ntb <remote1:optional> <remote2:optional> ...
clean() { REMOTES="$@"; if [ -z "$REMOTES" ]; then REMOTES=$(git remote); fi REMOTES=$(echo "$REMOTES" | xargs -n1 echo) RBRANCHES=() while read REMOTE; do CURRBRANCHES=($(git ls-remote $REMOTE | awk '{print }' | grep 'refs/heads/' | sed 's:refs/heads/::')) RBRANCHES=("${CURRBRANCHES[@]}" "${RBRANCHES[@]}") done < <(echo "$REMOTES" ) [[ $RBRANCHES ]] || exit LBRANCHES=($(git branch | sed 's:\*::' | awk '{print }')) for i in "${LBRANCHES[@]}"; do skip= for j in "${RBRANCHES[@]}"; do [[ $i == $j ]] && { skip=1; echo -e "3[32m Keeping $i 3[0m"; break; } done [[ -n $skip ]] || { echo -e "3[31m $(git branch -D $i) 3[0m"; } done } clean $@