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.

 222
Author: Peter Mortensen, 2012-03-22

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ń.

 367
Author: AD7six,
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!

 12
Author: Tom Prats,
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