Kontekst: Pracuję nad mistrzem dodając prostą funkcję. Po kilku minutach zdaję sobie sprawę, że to nie było takie proste i powinno być lepiej pracować w nowym oddziale.
To zawsze mi się zdarza i nie mam pojęcia, jak przejść do innej gałęzi i zabrać ze sobą wszystkie te niezaangażowane zmiany, pozostawiając gałąź główną czystą. Miałem git stash && git stash branch new_branch
po prostu to osiągnąć, ale oto co otrzymuję:
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ echo "hello!" > testing
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing
~/test $ git status
# On branch master
nothing to commit (working directory clean)
~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)
~/test $ git s
# On branch new_branch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
~/test $ git checkout master
M testing
Switched to branch 'master'
~/test $ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Czy wiesz, czy jest jakiś sposób na osiągnięcie tego?
Odpowiedzi:
Nie musisz ukrywać.
nie zmienia twoich lokalnych zmian. Po prostu tworzy gałąź z bieżącego HEAD i ustawia HEAD tam. Myślę, że tego właśnie chcesz.
--- Edytuj, aby objaśnić wynik kontroli nad kasą ---
Czy jesteś zdezorientowany, ponieważ
checkout master
nie odrzuca twoich zmian?Ponieważ zmiany są tylko lokalne, git nie chce, abyś je zbyt łatwo stracił. Po zmianie oddziału git nie zastępuje lokalnych zmian. Wynikiem twojego
checkout master
jest:, co oznacza, że twoje pliki robocze nie są czyste. git zmienił HEAD, ale nie zastąpił plików lokalnych. Dlatego twój ostatni status nadal pokazuje lokalne zmiany, mimo że jesteś włączony
master
.Jeśli naprawdę chcesz odrzucić lokalne zmiany, musisz wymusić kasę za pomocą
-f
.Ponieważ zmiany nigdy nie zostały zatwierdzone, stracisz je.
Spróbuj wrócić do swojego oddziału, zatwierdzić zmiany, a następnie ponownie dokonać transakcji.
Powinieneś otrzymać
M
wiadomość po pierwszym kasie, ale już nie pocheckout master
, i niegit status
powinien pokazywać żadnych zmodyfikowanych plików.--- Edytuj, aby usunąć nieporozumienia dotyczące katalogu roboczego (plików lokalnych) ---
W odpowiedzi na twój pierwszy komentarz lokalne zmiany są po prostu ... cóż, lokalne. Git nie zapisuje ich automatycznie, musisz powiedzieć, aby je zapisać na później. Jeśli dokonasz zmian i nie zatwierdzisz ich wyraźnie ani nie ukryjesz, git ich nie zaktualizuje. Jeśli zmienisz HEAD (
checkout master
), lokalne zmiany nie zostaną nadpisane od momentu niezapisania.źródło
git checkout
„Aktualizuje pliki w drzewie roboczym, aby pasowały do wersji w indeksie lub w określonym drzewie”. Zakłada, że zmiany w systemie plików zostanie GONE później. Bez szansy na ich odzyskanie. Nawet jeśli powiesz, że nie zrobią tego, nadal będzie to bardzo złe uczucie. Nie ufam tym w ogóle . Albo dokumentacja jest naprawdę zła, albo domyślne zachowanie gita jest naprawdę niebezpieczne. Nie należy ufać jakiejś „automagicznej” heurystyce, aby wykryć, że w tym przypadku nie chcesz stracić swoich zmian.checkout
nie powoduje konfliktu z lokalnymi zmianami, kasa działa i pozostawia lokalne zmiany w spokoju. Rozumiem jednak złe przeczucie, strona podręcznika powinna powiedzieć „Aktualizuje niezmodyfikowane pliki w działającym drzewie”. Z drugiej strony Git nie sprawia, że zbyt łatwo tracić lokalne zmiany.git checkout
pozwala samemu na lokalne zmiany lub odmawia, jeśli występuje konflikt.git checkout <other_branch> -f
. Utracisz lokalne zmiany bez ostrzeżenia.Próbować:
źródło
Dwie rzeczy, które możesz zrobić:
lub
(
git checkout -
<- myślnik to skrót do poprzedniej gałęzi, w której byłeś)(
git stash -u
<--u
oznacza, że przyjmuje również zmiany nieetapowane)źródło
Jeśli używasz klienta GitHub dla systemu Windows (tak jak ja) i jesteś w sytuacji, gdy dokonałeś niezatwierdzonych zmian, które chcesz przenieść do nowego oddziału, możesz po prostu „utworzyć nową gałąź” za pomocą klienta GitHub. Przejdzie do nowo utworzonego oddziału i zachowa twoje zmiany.
źródło
Jeśli chcesz, aby bieżące niezatwierdzone zmiany w bieżącej gałęzi zostały przeniesione do nowej gałęzi, użyj następującego polecenia, aby utworzyć nową gałąź i skopiować automatycznie niezatwierdzone zmiany.
Spowoduje to utworzenie nowej gałęzi z bieżącej gałęzi (zakładając, że jest ona główną), skopiowanie nieprzewidzianych zmian i przejście do nowej gałęzi.
Zatwierdź zmiany w nowym oddziale.
Ponieważ tworzony jest nowy oddział, przed wypchnięciem go do zdalnego, musisz ustawić upstream. Użyj poniższego polecenia, aby ustawić wysyłanie i wypchnij go na zdalne.
Po naciśnięciu tego polecenia na oddziale zostanie utworzona nowa gałąź, a nowa gałąź lokalna zostanie przekazana na odległość.
Teraz, jeśli chcesz wyrzucić swoje niezaangażowane zmiany z gałęzi master, użyj:
Spowoduje to odrzucenie wszelkich niezatwierdzonych lokalnych zmian przy kasie.
źródło
W najnowszym kliencie GitHub dla systemu Windows , jeśli dokonałeś niezatwierdzonych zmian i zdecydowałeś się utworzyć nowy oddział.
Podpowiedzi, jak poradzić sobie z tym dokładnie scenariuszem:
To samo dotyczy, jeśli po prostu zmienisz także gałąź.
źródło