Muszę wyskoczyć i wyrzucić" środkowy " commit w mojej gałęzi master. Jak mogę to zrobić?
Na przykład, w następującej gałęzi master, muszę wyrzucić tylko commit af5c7bf16e6f04321f966b4231371b21475bc4da, który jest drugim ze względu na poprzedni rebase:
commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <[email protected]>
Date: Tue Apr 12 23:50:15 2011 +0200
add generic config/initializers/omniauth.example.rb
commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <[email protected]>
Date: Fri Apr 22 00:15:50 2011 +0200
show github user info if logged
commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <[email protected]>
Date: Fri Apr 22 17:20:48 2011 +0200
add multiple .container at blueprint layout
commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <[email protected]>
Date: Thu Apr 21 19:55:57 2011 +0200
add %h1 Fantastic Logo + .right for 'Sign in with Github'
I need to mantain
- pierwszy commit 60b413512e616997c8b929012cf9ca56bf5c9113,
- trzeci commit e6523efada4d75084e81971c4dc2aec621d45530 i
- Ostatni commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
"wyrzucanie" tylko drugiego commita af5c7bf16e6f04321f966b4231371b21475bc4da
Jak mogę to zrobić? Z góry dzięki Luca3 answers
Opcje to Rebase lub revert . Rebase usunie commit z historii, tak aby wyglądał jakby ten drugi commit nigdy nie istniał. Będzie to problem, jeśli wypchnąłeś gałąź master do innych transakcji repo. Jeśli spróbujesz przeforsować rebase w tym przypadku, git wyświetli błąd reject non fast-forward merges.
Revert jest poprawnym rozwiązaniem, gdy gałąź została udostępniona innym repozytoriom. git revert af5c7bf16
zrobi nowy commit, który po prostu odwraca zmiany wprowadzone przez af5c7bf16. W ten sposób historia nie jest przepisywana, utrzymujesz jasny zapis błędu, a inne transakcje repo zaakceptują push.
git rebase -i <commit>^
To zabierze cię do commita tuż przed tym, który chcesz usunąć. Interaktywny edytor pokaże Ci listę wszystkich commitów z powrotem do tego punktu. Możesz wybrać, squash, itp. W tym przypadku Usuń linię zatwierdzania, którą chcesz usunąć i zapisać plik. Rebase dokończy swoją pracę.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
2011-04-22 17:21:02
Jeśli rebase jest opcją, możesz rebase i po prostu ją upuścić:
$ git rebase -i 414ceffc^
Jeśli rebase nie jest opcją, możesz ją przywrócić:
$ git revert af5c7bf16
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
2011-04-22 16:39:01
Pomimo wszystkich podziękowań za oryginalne odpowiedzi, które tu otrzymałem, nie znalazłem ich, aby zadowalająco odpowiedzieć na pytanie. Jeśli znajdziesz się w sytuacji, w której musisz usunąć commit lub kolekcję commitów ze środka historii, oto co proponuję:
- Utwórz nową gałąź z nagłówka tej, która zawiera wszystkie commity i przełącz się na nią.
- Przywróć nową gałąź do punktu, od którego chcesz rozpocząć nową bazę.
- wtedy, (oto kluczowy punkt) Cherry wybierz kolejne commity, które chcesz zastosować z oryginalnej gałęzi do nowej, i pomiń commity, których już nie chcesz (tzn. te, które usuwasz).
- Jeśli chcesz, zmień nazwę oryginalnej gałęzi na coś wskazującego, że jest to stary kod, a następnie zmień nazwę nowej gałęzi tak, jak oryginalna została nazwana.
- na koniec wypchnij zmiany do zdalnego repo (jeśli go używasz). Prawdopodobnie będziesz musiał użyć " wymuszonego push". Jeśli twoi współpracownicy mają problemy z pobieraniem wersji, łatwiej będzie im po prostu sklonować repo ponownie ze zdalnego źródła. Tak czy inaczej, prawdopodobnie będziesz chciał z nimi porozmawiać, jeśli i tak zgrywasz commity ze środka swojej historii!
Oto info o zbieraniu wiśni: co oznacza cherry-picking commit z Gitem?
Oto trochę o robieniu tego z Żółwowym Gitem(tak jak właśnie zrobiłem). Zdecydowanie łatwiej jest korzystać z narzędzia gui do tego rodzaju operacji! Cherry pick using TortoiseGit
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
2017-08-03 23:16:06