Chcę zresetować wiele oddziałów do ich wersji pochodzenia. Więc,

git fetch --all
for b in master work; do
  git switch $b; git reset --hard origin/$b
done

Ale prostsze? Myślałem o usunięciu wszystkich gałęzi, więc otrzymują odtworzenie, ale trzeba go wymeldować i wystąpił błąd.

Edytuj : Scenariusz jest taki, że origin często przepisuje wiele oddziałów bezkarności. Poniższa odpowiedź dała mi również pomysł oszczędzania różnych stanów do kopii zapasowej refs - co jest ładnym bonusem.

0
usretc 14 marzec 2021, 12:42

1 odpowiedź

Najlepsza odpowiedź

Nie musisz przełączać się na gałęzie. Możesz po prostu utworzyć oddział i ma to wskazywać na dowolne arbitralne ref:

git branch -f branchname "$target"

(Jako dodatkowy bonus, niezmienne zmiany w twoim drzewie roboczym nie będą dotknięte, w porównaniu do git reset --hard, które wyczyrzy lokalne zmiany.)

Podczas stosowania w skryptach git branch należy unikać i lepiej jest używać for-each-ref:

git for-each-ref 'refs/remotes/origin' --format='%(refname:strip=3)' \
| while read ref; do
    git branch -f "$ref" "origin/$ref";
done

Jeśli jesteś zainteresowany tylko utworzeniem "kopii zapasowej" bieżącego stanu oddziałów zdalnego śledzenia, git push lub git fetch może pomóc za pomocą klonów prądowych jako pilota.

Albo polecenie powtórzy wszystkie gałęzie pilota origin do nowej (lokalnej) hierarchii gałęzi z prefiksem backup/, tj. origin/dev staje się backup/dev:

git fetch . 'refs/remotes/origin/*:refs/heads/backup/*'
# or:
git push . 'refs/remotes/origin/*:refs/heads/backup/*'

Lub pobrać bezpośrednio z pilota do oddzielnego zestawu lokalnych refs:

git fetch origin 'refs/heads/*:refs/heads/backup/*'
3
knittl 14 marzec 2021, 11:10