Git pull po wymuszonej aktualizacji
Właśnie zgniatałem niektóre commity git rebase
i zrobiłem git push --force
(co jest złe, wiem).
Teraz inni inżynierowie oprogramowania mają inną historię i kiedy wykonają git pull
, Git połączy się. Czy jest jakiś sposób, aby to naprawić, poza zrobieniem rm my-repo; git clone [email protected]:my-repo.git
?
Potrzebuję czegoś odwrotnego do git push --force
, ale git pull --force
nie dało zamierzonych rezultatów.
2 answers
Aby otrzymać nowe commity
git fetch
Reset
Możesz zresetować commit dla lokalnej gałęzi używając git reset
.
Aby zmienić commit lokalnej gałęzi:
git reset origin/master --hard
Bądź jednak ostrożny, jak to określa dokumentacja:
Resetuje indeks i drzewo robocze. Wszelkie zmiany śledzonych plików w drzewie roboczym od
są odrzucane.
Jeśli chcesz zachować wszystkie zmiany lokalnie-wykonaj --soft
reset zamiast tego. Które zaktualizują historię zatwierdzeń dla gałęzi, ale nie zmienią żadnych plików w katalogu roboczym(i możesz je zatwierdzić).
Rebase
Możesz odtworzyć swoje lokalne commity na dowolnym innym commicie / gałęzi używając git rebase
:
git rebase -i origin/master
Spowoduje to wywołanie rebase w trybie interaktywnym, gdzie możesz wybrać, jak zastosować każdy commit, którego nie ma w historii, na której zmieniasz dane.
Jeśli commity, które usunąłeś (z git push -f
) mają już zostały wciągnięte do lokalnej historii, zostaną wymienione jako commity, które zostaną ponownie zastosowane - będą musiały zostać usunięte jako część rebase lub po prostu zostaną ponownie włączone do historii dla gałęzi-i ponownie pojawią się w zdalnej historii przy następnym push.
Użyj pomocy git command --help
aby uzyskać więcej szczegółów i przykładów na którąkolwiek z powyższych (lub innych) poleceń.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 17:17:53
To nie naprawi gałęzi, które mają już kod, którego nie chcesz w nich (zobacz poniżej, jak to zrobić), ale jeśli wyciągnęli jakąś-gałąź i teraz chcą, aby była czysta (a nie "przed" origin/some-branch), to po prostu:
git checkout some-branch # where some-branch can be replaced by any other branch
git branch base-branch -D # where base-branch is the one with the squashed commits
git checkout -b base-branch origin/base-branch # recreating branch with correct commits
Uwaga: możesz je połączyć, umieszczając & & pomiędzy nimi
Note2: Florian wspomniał o tym w komentarzu, ale kto czyta komentarze, szukając odpowiedzi?
Note3: jeśli masz skażone gałęzie, możesz tworzyć nowe na podstawie z nowej "głupiej gałęzi" i po prostu cherry-pick commits over.
Ex:
git checkout feature-old # some branch with the extra commits
git log # gives commits (write down the id of the ones you want)
git checkout base-branch # after you have already cleaned your local copy of it as above
git checkout -b feature-new # make a new branch for your feature
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want
# repeat previous step for each commit id
git branch feature-old -D # delete the old branch
Now feature - nowa jest twoja gałąź bez dodatkowych (prawdopodobnie złych) commitów!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 23:33:05