Aby przesunąć wskaźnik gałęzi pobranej gałęzi, można użyć git reset --hard
polecenia. Ale jak przesunąć wskaźnik gałęzi niezarejestrowanej gałęzi, aby wskazywał na inne zatwierdzenie (zachowując wszystkie inne rzeczy, takie jak śledzona gałąź zdalna)?
git
git-branch
Mot
źródło
źródło
git branch <branch-name> <SHA-1-of-the-commit>
i zrzucisz starą gałąź?Odpowiedzi:
Możesz to zrobić dla dowolnych referencji. Oto jak przenieść wskaźnik gałęzi:
Ogólna forma:
Jeśli chcesz, możesz wybrać gnidy dotyczące komunikatu o ponownym logowaniu - uważam, że
branch -f
ten różni się odreset --hard
jednego i nie jest to dokładnie żaden z nich.źródło
git branch -f
. Mówiąc ściślej, wydaje się, że ta metoda jest: (A) trudniejsza w użyciu (B) trudniejsza do zapamiętania i (C) bardziej niebezpiecznaźródło
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Jeśli chcesz, możesz wybrać gnidy na temat komunikatu o ponownym logowaniu - uważam, żebranch -f
ten różni się odreset --hard
jednego, i to nie jest dokładnie żaden z nich.)git help branch
mówi „-f, --force Zresetuj <nazwazgałęzienia> do <startpoint>, jeśli <nazwazgałęzienia> już istnieje. Bez -f gałąź git odmawia zmiany istniejącej gałęzi.”git branch -f master <hash>
i to mówi mifatal: Cannot force update the current branch.
Ummmm, co muszę teraz zrobić, sprawdź jakąś inną losową gałąź, zanim będę mógł używać tego polecenia?HEAD
wskazuje na nią).Możesz także przekazać
git reset --hard
odwołanie do zatwierdzenia.Na przykład:
Odkryłem, że robię coś takiego częściowo:
Zakładając tę historię
źródło
git update-ref
jak opisano powyżej.git reset --hard ...
Nie musisz go tutaj powtarzać! :-(Aby wzbogacić dyskusję, jeśli chcesz przenieść
myBranch
gałąź do bieżącego zatwierdzenia, po prostu pomiń drugi argument po-f
Przykład:
git branch -f myBranch
Generalnie robię to, gdy jestem
rebase
w stanie Odłączony HEAD :)źródło
W
gitk --all
:Uwaga: ponowne utworzenie zamiast modyfikacji istniejącej gałęzi spowoduje utratę informacji o gałęzi śledzenia . (Zasadniczo nie stanowi to problemu w prostych przypadkach użycia, w których jest tylko jeden pilot, a lokalny oddział ma taką samą nazwę jak odpowiadająca gałąź w pilocie. Zobacz komentarze, aby uzyskać więcej informacji, dzięki @mbdevpl za zwrócenie uwagi na ten minus.
Byłoby fajnie, gdyby
gitk
miał funkcję, w której okno dialogowe zawierało 3 opcje: nadpisywanie, modyfikowanie istniejących lub anulowanie.Nawet jeśli zwykle jesteś ćpunem z wiersza poleceń, takim jak ja,
git gui
igitk
jesteś całkiem ładnie zaprojektowany dla podzbioru użycia git, na który pozwalają. Gorąco polecam używanie ich do tego, w czym są dobrzy (tj. Wybiórcze umieszczanie przystawek do / z indeksu w git gui, a także po prostu zatwierdzanie. (Ctrl-s, aby dodać podpisany: wiersz, ctrl-enter, aby zatwierdzić .)gitk
jest świetny do śledzenia kilku gałęzi podczas sortowania zmian w ładną serię łatek do przesłania w górę lub w cokolwiek innego, w którym musisz śledzić to, co znajdujesz się w środku z wieloma gałęziami.Nie mam nawet otwartej graficznej przeglądarki plików, ale uwielbiam gitk / git gui.
źródło
git status
wydajność. Dodatkowo, w niektórych przypadkachgit fetch
igit push
nie będzie działać bez określania zdalnego wyraźnie, jeśli nie ustawić oddział śledzenia. Nie znam wszystkich przypadków, ale dla mnie ogólna zasada jest taka, że dla wygody i szybkości pracy lepiej jest mieć gałęzie śledzące w kolejności.Zalecanym rozwiązaniem
git branch -f branch-pointer-to-move new-pointer
w TortoiseGit :źródło
Szczerze mówiąc, jestem zaskoczony, jak nikt nie pomyślał o
git push
poleceniu:Kropka (.) Oznacza lokalne repozytorium i może być potrzebna opcja -f, ponieważ miejsce docelowe może znajdować się „za swoim zdalnym odpowiednikiem” .
Chociaż to polecenie służy do zapisywania zmian na serwerze, wynik jest dokładnie taki sam, jak w przypadku przeniesienia gałęzi zdalnej (
<branch>
) do tego samego zatwierdzenia, co gałąź lokalna (<destination>
)źródło
-f
unikania blokowania czegokolwiek lokalnego; na przykładgit fetch origin && git push . origin/develop:develop
jest to szybka i niezawodna wersja bezgit checkout develop && git pull --ff-only
Otwórz plik
.git/refs/heads/<your_branch_name>
i zmień przechowywany tam skrót na taki, w którym chcesz przenieść głowę oddziału. Po prostu edytuj i zapisz plik w dowolnym edytorze tekstu. Upewnij się tylko, że gałąź do modyfikacji nie jest aktualnie aktywna.Oświadczenie: Prawdopodobnie nie jest to zalecany sposób, ale wykonuje zadanie.
źródło
W przypadku, gdy zatwierdzenie, które chcesz wskazać, znajduje się przed bieżącą gałęzią (tak powinno być, chyba że chcesz cofnąć ostatnie zatwierdzenia bieżącej gałęzi), możesz po prostu zrobić:
źródło
git push . <commit>:<branch>
tak , jak już sugerowano.