Chcę, aby moje lokalne i zdalne repozytoria były zawsze zsynchronizowane pod względem oddziałów.
Po przejrzeniu pull requesta na GitHubie scalam i usuwam tam moją gałąź (zdalnie). Jak mogę pobrać te informacje z mojego lokalnego repozytorium i sprawić, by Git usunął również moją lokalną wersję gałęzi?
git ls-remote
igit show-ref
.git symbolic-ref
igit update-ref
.Odpowiedzi:
Szybki sposób
Uwaga: jeśli nie masz konta, może
master
to spowodować usunięcie oddziału. Czytaj dalej, aby znaleźć „lepszy sposób”.Upewnij się, że trzymamy mistrza
Możesz upewnić się, że
master
ani jakakolwiek inna gałąź nie zostanie usunięta przezgrep
dalsze. W takim przypadku poszedłbyś:Więc jeśli chcemy zachować
master
,develop
astaging
na przykład pójdziemy:Uczyń to aliasem
Ponieważ jest trochę długi, możesz dodać alias do swojego
.zshrc
lub.bashrc
. Mój nazywa sięgbpurge
(dlagit branches purge
):Następnie załaduj ponownie
.bashrc
lub.zshrc
:lub
źródło
branch
jest to polecenie dotyczące porcelany, a nie hydrauliki , uważaj na wszelkie zmiany interfejsu użytkownika w przyszłych wersjach Git, które mogą go zepsuć.master
zostanie usunięty.grep -Ev '(\*|master|important-branch)'
~/.gitconfig
zamiast tego chcesz umieścić to w swoim , dodaj do[alias]
sekcji:gbpurge = !"git branch --merged | grep -Ev '\\*|master|develop|staging' | xargs -n 1 git branch -d"
(nie ma potrzeby używania () w wyrażeniu grep).Używam tego samego przepływu z GitHubem i nie znalazłem poprzednich odpowiedzi satysfakcjonujących mnie, ponieważ
git branch --merged
zawiera listę gałęzi, które zostały scalone, ale nie wszystkie zostały usunięte zdalnie w moim przypadku. Więc to zadziałało dla mnie:git fetch --all -p; git branch -vv | grep ": gone]" | awk '{ print $1 }' | xargs -n 1 git branch -d
gdzie:
git fetch --all -p
: aktualizacja statusu oddziałów lokalnychgit branch -vv
: wyświetla stan oddziałów lokalnychgrep ": gone]"
: filtruj usunięteawk '{ print $1 }'
: wyodrębnij ich nazwyxargs -n 1 git branch -d
: przekazuje nazwę do polecenia usuwaniaUwaga: jeśli wolisz, możesz użyć -D zamiast -d, co wymusza usuwanie.
Na przykład:
Odniesienie:
http://git-scm.com/book/en/v2/Git-Branching-Remote-Branches
źródło
git checkout master; git pull origin master; git fetch --all -p; git branch -vv | grep gone | awk '{ print $1 }' | xargs -n 1 git branch -d
Świetny scenariusz i wyjaśnienie, dziękuję za to :)branch -vv
pokazuje ostatni komunikat o zatwierdzeniu z gałęzi. Jeśli zdarzyło ci się „odejść” w tej wiadomościgrep gone
, trafiłoby to również w tę gałąź. Więcgrep ": gone]"
prawdopodobnie jest trochę bezpieczniejszy w użyciu.awk '$3 $4 ~ /:gone]$/ { print $1 }'
-D
zamiast-d
tego jest to idealna odpowiedź!próbować:
który usuwa twój lokalny oddział, jeśli odpowiadający mu zdalny oddział zostanie usunięty.
Zaktualizowano:
Powyższe stwierdzenie nie jest tak poprawne.
W rzeczywistości uruchomienie
git pull --prune
spowoduje tylko USUNIĘCIE gałęzi zdalnego śledzenia takie jakNastępnie możesz uruchomić,
git branch -r
aby sprawdzić gałęzie zdalnego śledzenia pozostawione na twoim komputerze. Załóżmy, że lewe gałęzie to:co oznacza, że oddział
origin/fff
został usunięty.Więc po bieganiu po
git pull --prune
prostu uruchom:git branch --merged | grep -vFf <(git branch -r | cut -d'/' -f2-)
możesz znaleźć wszystkie lokalne oddziały, które:
następnie
<the command above> | xargs git branch -d
może usunąć je wszystkie.źródło
--prune
Flag usunie tylko zdalne śledzenie oddziałów, a nie lokalne oddziały.git fetch --prune
, to mój sposób wyborugit pull --prune
spowodował, że „Poprosiłeś o ściągnięcie ze zdalnego '--prune', ale nie określiłeś gałęzi. Ponieważ nie jest to domyślny zdalny skonfigurowany dla Twojej bieżącej gałęzi, musi określić gałąź w wierszu poleceń. "Powinno to zadziałać, aby uniknąć usunięcia gałęzi głównej i deweloperskiej z zaakceptowanym rozwiązaniem:
źródło
Dla osób używających PowerShell jest to odpowiednik powyższej odpowiedzi :
git branch -D
każdą ze znalezionych gałęziźródło
Nic z tego nie działało dla mnie. Możesz zobaczyć moją drugą odpowiedź tutaj: https://stackoverflow.com/a/34969726/550454
Ale zasadniczo mam teraz to w moim
~/.gitconfig
:źródło
Bardzo proste rozwiązanie: usuń lokalne repozytorium i ponownie sklonuj zdalne. Może nie wydawać się zbyt eleganckie, ale jest proste i dokładnie zrozumiesz, co robisz, nie czytając stron podręcznika :-).
źródło
Napisałem tę jedną linijkę, aby wyświetlić wszystkie lokalne oddziały, które nie mają odpowiedniego oddziału zdalnego:
Po wykonaniu tej czynności usunięcie tych lokalnych oddziałów jest łatwe dzięki
xargs
:źródło
master
też mnie wymienia , nie działa zgodnie z oczekiwaniami; uważajRobię to po prostu, aby usunąć połączone oddziały lokalne:
a jeśli chcesz usunąć również nieistniejące śledzenia:
źródło
W przypadku, gdy właśnie wypchnąłeś i scaliłeś swoją gałąź do mastera, wykonaj następujące czynności w git bash:
Jeśli jesteś obecnie w tej gałęzi, odepchnie cię to z powrotem do mastera. W tym momencie wykonaj pociągnięcie
źródło
Głosowana odpowiedź ma potencjał usunięcia wzorca. Rozważ poniższy praktyczny przykład.
Miałem dwie gałęzie funkcji hemen_README i hemen_BASEBOX, które zostały połączone w develop, a następnie develop w master. Gałęzie funkcji hemen_README i hemen_BASEBOX zostały usunięte zdalnie, ale nadal były widoczne lokalnie. Nie jestem też lokalnie mistrzem, ale rozwijam się.
W tym wypadku
Więc jeśli uruchomię powyższe częściowe polecenie
Zwróć uwagę, że pokazuje również master, który ostatecznie zostanie usunięty.
W każdym razie udało mi się to zrobić. Dzielę się z wami moim dziennikiem sesji, w jaki sposób to osiągnąłem.
Właśnie sprawdziłem, co będzie przycinane, a potem je przycinam. patrząc na polecenie oddziału poniżej, zajęliśmy się pilotami
Teraz idź dalej i usuń lokalne oddziały
Teraz dobrze, gałęzie są zgodne z życzeniem.
źródło