2012-06-06 21 views
72

Jestem ciekawy, jak usunąć pierwsze zatwierdzenie w git.Jak usunąć pierwsze zatwierdzenie w git?

Co to jest zmiana przed popełnieniem czegokolwiek? Czy ta wersja ma nazwę lub tag?

+2

Na początek z git, to powinien wiedzieć, że zmiany jest bez znaczenia. Możesz mówić o zatwierdzeniach lub ich względnych SHA. Ponadto, dlaczego chcesz to zrobić? Pierwsze zatwierdzenie jest tym, na czym wszystko jest zbudowane. Możesz zmiażdżyć kilka zatwierdzeń razem, w tym pierwsze zatwierdzenie, które staje się nowym pierwszym zatwierdzeniem, ale co to znaczy nawet usunąć pierwsze zatwierdzenie (lub usunąć ostatnie, ale ostatnie zatwierdzenie)? – Shahbaz

+0

@Shahbaz tak, to jest najlepszy sposób, spójrz na przykład: http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one – timaschew

+4

Możesz użyć 'git rebase - i --root'. Aby uzyskać szczegółowe informacje, patrz następująca odpowiedź: http://stackoverflow.com/questions/2246208/change-first-commit-of-project-with-git – MKroehnert

Odpowiedz

122

Dla mnie najbardziej bezpiecznym sposobem jest użycie polecenia update-ref:

git update-ref -d HEAD 

usunie podany odniesienie HEAD, więc to będzie resetu (cicho, nie będzie tracić swoją pracę) Wszyscy twoi zatwierdzenia obecnego oddziału.

Jeśli to, co chcesz, aby połączyć pierwszą popełnić z drugiej, można użyć polecenia rebase:

git rebase -i --root 

Ostatnim sposobem mogłoby być utworzenie oddziału sierocy, oddział o tej samej treści ale bez popełnienia historii, i zobowiązać się nowe treści na niej:

git checkout --orphan <new-branch-name> 
+2

Szkoda, że ​​nie jest to zaakceptowana odpowiedź. Jest również zbyt złe, że większość trafień w google mówi mniej więcej "nie można cofnąć pierwszego zatwierdzenia". To mi się udało. Dzięki! – danielpops

+1

Dzięki @danielpops za wsparcie! Dobrze jest zauważyć, że odpowiedziałem na to pytanie 3 lata później. Git ewoluował w międzyczasie. – tzi

+0

Oddział Sierocińscy załatwił sprawę. Dziękuję Ci! – fanaugen

36

Nie ma nic przed pierwszym zatwierdzeniem, ponieważ każde zatwierdzenie odnosi się do zatwierdzenia przez rodzica. To sprawia, że ​​pierwsze zatwierdzenie jest specjalne (sierocym zatwierdzeniem), więc nie ma możliwości odwołania się do poprzedniego "stanu".

Jeśli więc chcesz naprawić zatwierdzenie, możesz po prostu git commit --amend: zmodyfikuje to zatwierdzenie bez tworzenia kolejnego.

Jeśli chcesz po prostu zacząć wszystko od nowa, należy usunąć repozytorium .git, i uczynić jeszcze jeden z git init

+1

Ta odpowiedź jest niepoprawna: istnieje sposób, aby powrócić do stanu sprzed pierwszy commit. Zobacz poniżej odpowiedź [tzi's] (http://stackoverflow.com/a/32765827/46783). –

2

Jeśli chcesz zachować inne branże, ale na przykład sprawić, że oddział mistrz zacząć od nowa bez wspólnej historii do drugiej oddziały, jeden bezpieczny sposób na osiągnięcie tego celu jest stworzenie nowego repozytorium i popchnąć zawartość że w stary:

cd .. 
git init newrepo 
cd newrepo 
# make some initial commits 
git push ../oldrepo master:newmaster 

stwarza „newmaster” oddział w starym repozytorium, z historii, że nie ma wspólnego z dowolne inne gałęzie. Oczywiście, możesz również nadpisać samego mistrza, używając `git push -f '.

Jeśli chcesz zniszczyć wszystkie gałęzie i całą istniejącą zawartość, po prostu uruchom rm -rf .git/.

5

Możesz po prostu chcieć edytować swoje pierwsze zatwierdzenie (ponieważ zawsze istnieje pierwsze zatwierdzenie w repozytorium git). Rozważ użycie git commit --amend --reset-author zamiast zwykłego git commit --amend.

2

Innym sposobem można zrobić to:

  1. Zamówienie do oddziału chcesz zachować (powiedzmy dev) git checkout dev
  2. Teraz usunąć gałąź chcesz zresetować git branch -D master
  3. Teraz utworzyć pusty oddział o tej samej nazwie git checkout --orphan master

Oczywiście, wszystko to zależy od Twojego przypadku użycia, ale jeśli masz więcej niż jeden oddział, usunięcie t he .git katalog nie ma sensu.

+1

Po wykonaniu tej czynności należy usunąć gałąź w pilocie przed jej naciśnięciem. W przeciwnym razie, gdy spróbujesz nacisnąć, otrzymasz ten błąd:! [odrzucone] master -> master (non-fast-forward) - błąd: nie udało się przesłać niektórych odwołań do "[email protected]: r1/r2.git" - wskazówka: aktualizacje zostały odrzucone, ponieważ wskazówka w bieżącym oddziale jest behind - podpowiedź: jego zdalny odpowiednik. Zintegruj zdalne zmiany (np. Podpowiedź: "git pull ...") przed ponownym naciśnięciem ... - Jeśli wykonasz polecenie git, wszystkie zatwierdzenia wrócą. – dxvargas

2

Check out do tymczasowego oddziału:

git checkout --orphan TEMP_BRANCH

Dodaj wszystkie pliki:

git dodać -A

zatwierdzić zmiany:

git commit -am "Initial popełnić"

Usuń starą Branża:

git branch -D master

Zmień nazwę tymczasowy oddział do opanowania:

git branch -m mistrz

Wreszcie zmiana siły do ​​naszego repozytorium:

git naciśnięciem -f mistrza pochodzenia

Powiązane problemy