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 Luca
Author: sehe, 2011-04-22

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

Oto dobry sposób na wymazanie: 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ę.
 104
Author: JCotton,
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
 36
Author: mipadi,
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

 30
Author: BuvinJ,
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