Kiedy jesteś trochę nowy w Git (i ogólnie DVCS) i zaczynasz badać zmiany przepisujące historię, jesteś bezpieczny, jeśli repozytorium jest tylko lokalne, ale możesz napotkać problemy, jeśli pracujesz z pilotami i próbujesz popchnij takie zmiany.
Oczekiwaną funkcją jest możliwość włączenia „trybu bezpiecznego”, który zasadniczo powstrzyma mnie od robienia tego, czego nie powinienem robić… A co mam przez to na myśli? Mam na myśli zmiany przepisujące historię dla rzeczy, które już zostały przekazane do źródła. Nie potrafię tego precyzyjnie zdefiniować, ale obejmuje to takie przypadki, jak:
commit --amend
kiedy HEAD został już wypchniętyrebase
oddziału nielokalnegoreset
odepchniętej gałęzi
Są to przykłady sytuacji, które prawdopodobnie spowodują kolejny push
błąd (ponieważ nie będzie to szybkie przewijanie do przodu, IIRC). Zrobiłem to przez przypadek i musiałem odtworzyć gałąź na pilocie. I nadal miałem szczęście zrobić to wystarczająco szybko, aby nikt nie wyciągnął historii, którą przepisałem.
Uważam, że można zidentyfikować tego rodzaju zmiany i, na żądanie, uniemożliwić użytkownikowi ich wprowadzenie. Czy jest na to jakaś opcja?
Jeśli nie, czy uważasz, że warto spróbować go stworzyć? Czy próbowałbyś precyzyjnie zdefiniować, jak rozpoznać taką „niebezpieczną zmianę”?
--force
.Odpowiedzi:
To wygląda bardzo blisko, jeśli nie to samo pytanie, jak Strategia Zapobiegania lub Łapanie historii Git Przepisz
Podsumowując, możesz włączyć
git config --system receive.denyNonFastforwards true
i
git config --system receive.denyDeletes true
Lub napisz post otrzymujący hak, aby odrzucić wszystko, co uważasz za przepisanie.
źródło
denyNonFastforwards
jest domyślna (?), Podczas gdydenyDeletes
nie jest. Te dwa są przydatne, ale wyobrażam sobie rozwiązanie po stronie klienta, które powstrzymałoby mnie przed zrobieniem „a”,commit --amend
gdybym nie był w stanie go przepchnąć (ponieważ HEAD został już wciśnięty).denyNonFastfowards
opcjętrue
tylko w gałęzi master? Chciałbym, aby moje gałęzie tematyczne mogły być ponownie bazowane i zmuszane.Nie, ponieważ jest to częścią filozofii git, która daje ci pełną moc i pozwala ci zarządzać tą mocą tak, jak chcesz.
Jeśli nie zastosujesz się do tej filozofii, być może warto przejść na Mercurial, ponieważ pozwalają one na przepisywanie historii, ale w sposób ograniczony lub, mówiąc jasno, niechętnie, co sprawia, że czujesz, że nie jest to dobry pomysł.
źródło
AFAIK, sposób, w jaki git rozwiązuje te problemy, polega na tym, że za każdym razem, gdy poprosisz o takie działanie, wykona je lokalnie, ale poinformuje cię, że to, co robisz, może mieć niepożądane konsekwencje. W tym momencie nic jeszcze nie wypchnąłeś, więc możesz przejrzeć swoje lokalne repozytorium i być może cofnąć niebezpieczną zmianę przed wypchnięciem. Musisz jednak zwracać uwagę na to, co mówi ci git i lepiej bądź ostrożny, gdy naprawisz takie błędy.
źródło