Czy w Git można przejść do innej gałęzi bez wypisywania wszystkich plików?
Po zmianie gałęzi muszę usunąć wszystkie pliki, zregenerować je, zatwierdzić i przełączyć z powrotem. Więc wyewidencjonowywanie plików to tylko strata czasu (a jest ich około 14 000 - to długa operacja).
Aby wszystko było jasne:
Potrzebuję tego wszystkiego, aby przesłać dokumentację do GitHub.
Mam repozytorium z gałęzią gh-pages . Kiedy odbudowuję dokumentację lokalnie, kopiuję ją do katalogu repozytorium, zatwierdzam i wypycham do GitHub. Ale nie byłem zadowolony, bo miałem lokalnie dwie kopie dokumentacji. Postanowiłem stworzyć pustą gałąź i po zatwierdzeniu przełączyć się na opróżnianie i usuwanie plików. Ale powrót to długa operacja - więc zadałem to pytanie.
Wiem, że mogę po prostu zostawić gałąź gh-pages i usunąć pliki, ale nie lubię brudnych drzew roboczych.
źródło
Odpowiedzi:
Tak, możesz to zrobić.
Jeśli musisz zatwierdzić tę gałąź, będziesz chciał również zresetować indeks, w przeciwnym razie zatwierdzisz coś na podstawie ostatniej wyewidencjonowanej gałęzi.
źródło
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
a następnie,git reset
aby wskazać ref zamiast gałęzi.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
jest przydatny, ale przesuwa również końcówkę bieżącej gałęzi.Używanie tylko podstawowych poleceń git:
Ta odpowiedź jest nieco dłuższa niż odpowiedź Charlesa, ale składa się wyłącznie z podstawowych poleceń git, które mogę zrozumieć i dzięki temu zapamiętać, eliminując potrzebę ciągłego wyszukiwania.
Zaznacz swoją aktualną lokalizację (jeśli to konieczne, zatwierdź najpierw):
Zresetuj (przenosi) znacznik do innej gałęzi bez zmiany katalogu roboczego:
teraz temp i inna gałąź wskazują na to samo zatwierdzenie, a twój katalog roboczy pozostaje nietknięty.
ponieważ twoja HEAD już wskazuje na ten sam commit, dir roboczy nie jest poruszony
Należy pamiętać, że te polecenia są również łatwo dostępne z dowolnego klienta graficznego.
źródło
git reset --soft <branch where you want to go>
uniknąć aktualizacji indeksuZ korzyścią dla czytelnika:
Chociaż uważam, że rozwiązanie Charlesa Baileya jest poprawne, to rozwiązanie to wymaga poprawki przy przechodzeniu na coś, co nie jest lokalnym oddziałem. Powinien też istnieć sposób, jak to zrobić za pomocą zwykłych poleceń, które są łatwe do zrozumienia. Oto co wymyśliłem:
Wyjaśnione:
git checkout --detach
jest tym samym,git checkout HEAD^{}
co pozostawia bieżącą gałąź za sobą i przechodzi w „stan odłączonej głowy”. Więc następna modyfikacjaHEAD
nie ma już wpływu na jakąkolwiek gałąź. OdłączenieHEAD
nie wpływa na drzewo robocze ani indeks.git reset --soft commitish
następnie przechodziHEAD
do SHA danegocommitish
. Jeśli chcesz również zaktualizować indeks, zostaw to--soft
, ale nie polecam tego robić. To znowu nie dotyczy drzewa roboczego ani (--soft
) indeksu.git checkout commitish
następnie przyłączaHEAD
się ponownie do danejcommitish
(gałęzi). (Jeślicommitish
jest SHA, nic się nie dzieje.) To również nie wpływa na indeks ani na drzewo robocze.To rozwiązanie akceptuje wszystko, co odnosi się do zatwierdzenia, więc jest to idealne rozwiązanie dla niektórych
git
aliasów.rev-parse
Poniżej to tylko test, aby upewnić się, przerwy nic w łańcuchu, tak że literówki nie przypadkowo przełączyć do głowy państwa jednorodzinnego (usuwanie błędów byłoby o wiele bardziej skomplikowane).Prowadzi to do następującego
git hop treeish
aliasu:FYI, możesz go znaleźć na mojej liście
git
aliasów .źródło
$@
zamiast$*
? Różnica polega na tym, że $ @ bez rozszerzonych cudzysłowów, które mają spacje wewnątrz.$@
definitywnie nie ma tu na myśli.$*
jest używane zamiast$1
, takie, któregit switch -f b
staje się tym samym,git switch '-f b'
co powinno być błędem. W ten sposób mogę skrócić alias, rezygnując z obsługi błędów, takich jak!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Czy nie byłoby lepszym rozwiązaniem posiadanie dwóch katalogów roboczych (dwóch obszarów roboczych) z jednym repozytorium lub nawet dwoma repozytoriami?
W sekcji znajduje się narzędzie git-new-workdir ,
contrib/
które może Ci w tym pomóc.źródło
git-new-worktree
poprzedza skryptgit worktree
komendy; to polecenie nie było dostępne, kiedy pisano odpowiedź. Na przykład skrypt wymaga obsługi dowiązań symbolicznych; IMHO lepiej jest korzystać z natywnej obsługi.Myślę, że szukasz polecenia hydrauliki
git read-tree
. Spowoduje to zaktualizowanie indeksu, ale nie zaktualizuje żadnych plików w katalogu roboczym. Na przykład zakładając, żebranch
należy przeczytać nazwę oddziału:Jeśli chcesz następnie zaangażować się w gałąź, którą właśnie przeczytałeś, będziesz musiał również:
źródło
read-tree
generuje błąd:fatal: Not a valid object name branch
jeśli jeszcze go niegit switch branch
byłoMożesz nadpisać plik HEAD inną nazwą gałęzi:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
źródło
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?Przy tak wielu plikach najlepiej byłoby zachować tylko dwa repozytoria, po jednym dla każdej gałęzi. W razie potrzeby możesz przeciągać zmiany w tę iz powrotem. To będzie mniej zaskakujące niż próba oszukania gita.
źródło
git-new-worktree
do tego zamiast tego (wcontrib/
)Jeśli po prostu próbujesz zmienić miejsce, w którym wskazuje zdalna gałąź, możesz to zrobić za pomocą „git push” bez dotykania lokalnej kopii.
http://kernel.org/pub/software/scm/git/docs/git-push.html
Na przykład, aby zaktualizować foo do zatwierdzenia c5f7eba, wykonaj następujące czynności:
Nie jestem pewien, czy o to ci chodziło, czy nie.
źródło
możesz skorzystać
previous-branch-commit-id to zatwierdzenie, z którego chcesz skopiować stare dane.
źródło
Lub po prostu użyj pliku łatki, aby dokonać poprawki z innej gałęzi do swojego mastera
źródło
powiedz, że chcesz być w gałęzi A, ale z plikami z gałęzi B
znajdź aktualną referencję zatwierdzenia gałęzi A z logiem git, np. "99ce9a2",
powinieneś teraz znajdować się w gałęzi A, ze strukturą folderów odpowiadającą B, które pojawiają się jako zmiany niestacjonarne (historia nie uległa zmianie).
źródło