Bezpieczne (prawie zawsze) nadpisywanie zmian – git push –force-with-lease

Opublikowane przez Tomasz Prasołek w dniu

Ostatnio w pracy miałem sytuację, że w commit message wpisałem zły numer taska z Azure DevOps (dawne Visual Studio Team Services). Przez to mój commit został połączony z nieprawidłowym zadaniem. Wiedziałem, że wszystko da się odkręcić przepinając w portalu na inny task. Jednak nie chciałem zostawić tego commit message ze złym numerem taska. Zauważyłem to od razu, więc również szybko zacząłem szukać czy mogę to poprawić na branchu zdalnym.

Zdawałem sobie sprawę, że mogę użyć git push --force i to na pewno zadziała, ale dodatkowo chciałem być pewien, że nic nie zepsuję. Wtedy przypomniało mi się, że w PDFie od Macieja Aniserowicza “10 Sekretnych Komend Gita, O Których Nie Masz Pojęcia” było chyba coś takiego opisanego.

No i jest:

git push --force-with-lease

Zmieniłem commit message mojego taska i wrzuciłem go ponownie do zdalnego repozytorium używając powyższego polecenia. Wszystko zadziałało tak jak chciałem 🙂

Jak naprawdę działa –force-with-lease

Ogólnie mówiąc gdy robisz push z opcją --force-with-lease to git sprawdza czy nikt zdalnie już czegoś nie dodał. Jeśli zdalny branch się już zmienił, to git nie pozwoli Ci wysłać zmian na serwer. Wyświetli Ci błąd.

git push error

Wchodząc w szczegóły to git sprawdza czy lokalna kopia twojego zdalnego brancha jest taka sama jak aktualny branch zdalny. Jeśli wszystko się zgadza pozwala nadpisać te zmiany.

Czy to jest naprawdę bezpieczne?

Nie do końca.

Jedyna sytuacja, kiedy można nadpisać komuś zmiany używając --force-with-lease, to wcześniejsze pobranie zmian przez polecenie git fetch. Wtedy sytuacja wygląda tak:

  1. Nasz branch lokalny (master) jest inny niż ta kopia brancha zdalnego (remotes/origin/master).
  2. Kopia brancha zdalnego jest taka sama jak branch zdalny, ponieważ nie zrobiliśmy jeszcze merge’a do lokalnego brancha.
  3. Wykonując polecenie git push --force-with-lease, git zobaczy, że te branche (kopia origin/master i zdalny master) są takie same i zezwoli na push, nadpisując czyjeś zmiany.

Podsumowanie

Rozwiązaniem na to jest zawsze stosować git pull. Wtedy kopia brancha zdalnego zostanie zmieniona i nikomu przypadkiem nie popsujemy pracy 🙂

Źródła:
https://developer.atlassian.com/blog/2015/04/force-with-lease/
http://movingfast.io/articles/git-force-pushing/


2 Komentarze

Arek · 8 grudnia 2021 o 11 h 27 min

Dzięki za wpis, miałem dziś analogiczny problem.

dotnetomaniak.pl · 11 października 2018 o 20 h 30 min

Bezpieczne (prawie zawsze) nadpisywanie zmian – git push -force-with-lease – Tomasz Prasołek

Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *