Mam dwa oddziały:
- oddział lokalny (ten, z którym pracuję)
- oddział zdalny (publiczny, tylko dobrze przetestowane commity tam)
Ostatnio poważnie popsułem mój lokalny oddział.
Jak całkowicie zastąpić oddział lokalny oddziałem zdalnym, aby móc kontynuować pracę z miejsca, w którym znajduje się teraz oddział zdalny?
Już przeszukałem SO i lokalne sprawdzenie w oddziale zdalnym nie ma żadnego efektu.
Odpowiedzi:
Zakładając, że master jest lokalną gałęzią, którą zastępujesz, a „origin / master” to gałąź zdalna, którą chcesz zresetować:
Spowoduje to zaktualizowanie lokalnej gałęzi HEAD do tej samej wersji co origin / master i
--hard
zsynchronizuje tę zmianę również z indeksem i obszarem roboczym.źródło
git reset
domyślnie przemieści bieżącą gałąź i zsynchronizuje indeks.--soft
pominie aktualizację indeksu,--hard
zsynchronizuje również przestrzeń roboczą. Moje własne doświadczenie wykorzystuje--hard
większość czasu, z wyjątkiem sytuacji, gdy chcę cofnąć ostatnie zatwierdzenie (co jest po prostugit reset HEAD^
)git fetch origin remote_branch
master
, więc upewnij się, że najpierw sprawdziłeś gałąź, którą zastępujesz.To tak proste, jak trzy kroki:
git branch -d local_branch
git fetch origin remote_branch
git checkout -b local_branch origin/remote_branch
źródło
git branch -D local_branch
pierwszego kroku, jeśli Twój oddział nie zostanie scalony.źródło
git help branch
mówi--track
.When creating a new branch, set up branch.<name>.remote and branch.<name>.merge configuration entries to mark the start-point branch as "upstream" from the new branch. This configuration will tell git to show the relationship between the two branches in git status and git branch -v. Furthermore, it directs git pull without arguments to pull from the upstream when the new branch is checked out.
Naprawiłem to polecenie w odpowiedzi. Dzięki za podniesienie punktu.git status
, zgłosi, czy oddział lokalny znajduje się przed, czy za oddziałem zdalnym, jeśli masz je powiązane. Dodatkowo możesz zrobićgit pull
(lubpush
) zamiast pełnego,git pull <remote> <branch>
jeśli już ustawiłeś swój oddział do śledzenia<remote/branch>
.Zastąp wszystko zdalnym oddziałem; ale tylko z tego samego zatwierdzenia, w którym działa Twój oddział lokalny:
LUB uzyskaj najnowsze informacje ze zdalnego oddziału i zamień wszystko:
Na bok, w razie potrzeby, możesz usunąć nieśledzone pliki i katalogi, których jeszcze nie dopuściłeś:
źródło
git clean
Komenda zrobił to dla mnie.git reset hard origin/master
nie usuwaj nieśledzonych plików. Dzięki!Najbezpieczniejszy i najbardziej kompletny sposób zastąpienia obecnego oddziału lokalnego pilotem:
stash
Linia zapisuje zmiany, które nie zostały popełnione.branch
Linia przenosi swój oddział do innej nazwy, zwalniając oryginalną nazwę.fetch
Linia pobiera najnowszą kopię pilocie.checkout
Linia odtwarza oryginalny oddział jako oddział śledzenia.Lub jako funkcja bash:
która zmienia nazwę bieżącej gałęzi na coś takiego jak replace_master_98d258f.
źródło
git stash pop
w tym przepływie pracy. Jeśli chcesz ponownie zastosować ukryte pliki.Jestem trochę zaskoczony, że nikt jeszcze o tym nie wspominał; Używam go prawie codziennie:
Zasadniczo
@{u}
jest to tylko skrót dla gałęzi upstream, którą śledzi twoja obecna gałąź. Na przykład zwykle jest to równeorigin/[my-current-branch-name]
. To miłe, ponieważ jest agnostyczne dla gałęzi.git fetch
Najpierw upewnij się, aby uzyskać najnowszą kopię zdalnego oddziału.źródło
Można to zrobić na wiele sposobów, kontynuując edycję tej odpowiedzi w celu rozpowszechnienia lepszej perspektywy wiedzy.
1) Zresetuj mocno
Jeśli pracujesz ze zdalnej gałęzi rozwoju, możesz zresetować HEAD do ostatniego zatwierdzenia na zdalnej gałęzi, jak poniżej:
2) Usuń bieżącą gałąź i ponownie dokonaj płatności ze zdalnego repozytorium
Biorąc pod uwagę, że pracujesz nad rozwojem oddziału w lokalnym repozytorium, który synchronizuje się ze zdalnym / develop oddziału, możesz wykonać następujące czynności:
3) Przerwij scalanie
Jeśli znajdujesz się pomiędzy złym scaleniem (błędnie zrobionym z niewłaściwą gałęzią) i chciałeś uniknąć scalenia, aby wrócić do gałęzi najpóźniej jak poniżej:
4) Przerwij wycofanie
Jeśli jesteś pomiędzy złym rebase, możesz przerwać żądanie rebase, jak poniżej:
źródło
Możesz zrobić, jak powiedział @ Hugo z @Laurent, lub możesz użyć
git rebase
do usunięcia zatwierdzeń, które chcesz się pozbyć, jeśli wiesz, które. Zazwyczaj używamgit rebase -i head~N
(gdzie N jest liczbą, umożliwiającą manipulowanie ostatnimi N zatwierdzeniami) do tego rodzaju operacji.źródło
Wybrana odpowiedź jest absolutnie poprawne , jednakże nie zostawił mnie ostatni commit / naciska ...
Więc dla mnie:
Ponieważ wiem, że chcę tymczasowo ustawić moją gałąź nadrzędną na kilka tygodni na konkretną gałąź (taką samą jak ta, którą przełączyłem / wylogowałem wcześniej i dokonałem twardego resetu)
Więc PO zresetowaniu
źródło
Jeśli chcesz zaktualizować gałąź, która nie jest obecnie wyewidencjonowana, możesz:
źródło
Jak podano w wybranym objaśnieniu, git reset jest dobry. Ale obecnie często używamy podmodułów: repozytoriów w repozytoriach. Na przykład, jeśli używasz ZF3 i jQuery w swoim projekcie, najprawdopodobniej chcesz, aby zostały one sklonowane z ich oryginalnych repozytoriów. W takim przypadku reset git nie wystarczy. Musimy zaktualizować submoduły do dokładnie tej wersji, która jest zdefiniowana w naszym repozytorium:
jest to to samo, co rekursywnie będziesz wchodził (cd) do katalogu roboczego każdego podmodułu i będzie działał:
I to bardzo różni się od
ponieważ podmoduły wskazują nie rozgałęzienie, ale zatwierdzenie.
W takich przypadkach, gdy ręcznie wyewidencjonujesz jakiś oddział dla 1 lub więcej submodułów, możesz uruchomić
źródło
git reset --hard
. Daje to niewielką wartość.To działało dla mnie - clean pokazał także wszystkie pliki, które usunął. Jeśli powie ci, że stracisz zmiany, musisz się schować.
źródło
Brzydki, ale prostszy sposób: usuń folder lokalny i ponownie sklonuj zdalne repozytorium.
źródło