2013-02-14 19 views
7

Załóżmy, że mam główną gałąź, którą nazwiemy "master". Zrobiłem oddział o nazwie "nowa funkcja". W tej branży wykonałem mnóstwo zatwierdzeń, więc mogę cofnąć się w czasie, ale wykonałem sporo operacji podczas tworzenia tej funkcji, więc dziennik zatwierdzeń jest dość brudny.Odgałęzienie Git do jednego nowego zatwierdzenia

Gdybym miał na przykład obejrzeć git diff master..new-feature .

Gdybym chciał stworzyć tylko jeden nowy świeży commit na "master", który zawiera wszystkie zmiany pomiędzy dwoma oddziałami, jaki jest najskuteczniejszy sposób na zrobienie tego?

Odpowiedz

17
git checkout master 
git merge --squash new-feature 
git commit 

Komunikat popełnić rozpocznie się pokazując całą listę zatwierdzeń będących połączyły/zgnieciony, ale można z edycji kursu, który będzie cokolwiek chcesz.

+0

Pyszne proste :) – hhh

1

Można użyć do tego celu obsługi interaktywnej: git rebase --interactive. Następnie użyj opcji squasha. Używa tylko aktualizacji z zatwierdzenia, ale nie tworzy zatwierdzenia.

+0

To wydaje się jak tona poszukiwaniu zastępującego podnieść do squasha czy coś mi brakuje? – hhh

0

Możesz zatwierdzić wszystko w swojej gałęzi z funkcjami, a następnie połączyć się z mistrzem, przyjmując "swoje" dla wszystkich zmian.

Oto pytanie przepełnienie stosu z wielką odpowiedzi, w jaki sposób to zrobić: Is there a "theirs" version of "git merge -s ours"?

+0

Hmm, czy spowoduje to tylko jedno zatwierdzenie reprezentujące gałąź funkcji? – hhh

+0

Byłoby, gdyby najpierw dokonać ponownego wyboru w gałęzi elementów (tak jak William mówi powyżej), chociaż może to być niewskazane. Jedną z największych zalet kontroli źródła jest historia, w jaki sposób dotarłeś do miejsca, w którym się znajdujesz. Przypuszczam, że to kwestia preferencji! Więcej na temat interaktywnego rebase [tutaj] (http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html). –

+0

Tak, chciałbym również mieć historie, ale inni ludzie :) – hhh

1

Zastosowanie git rebase --interactive HEAD ~ (jednak wiele zobowiązuje chciał zgnieść). np. git rebase --interactive HEAD ~ 5. Spowoduje to załadowanie ostatnich 5 zatwierdzeń i wyświetlenie okna edytora wiadomości. Każda wiadomość będzie miała "pick" na początku. Przejdź do ostatniej wiadomości, zmień "pick" na "squash" i wyjdź. Otworzy się nowe okno z prośbą o komunikat zatwierdzenia. To będzie nowy komunikat zatwierdzenia gry squasha. Wyjdź i zmiażdży wszystkie commity na jeden nowy.

Jest to przykład tutaj: https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one

+0

Wygląda na to, że może to powodować problemy z widzeniem, że jestem w zespole i regularnie muszę wprowadzać zmiany od innych członków zespołu. To, i wolałbym nie liczyć :) – hhh

+0

Jeśli pracujesz w branży nowych funkcji, założyłem, że pracujesz w tej gałęzi samodzielnie. Jeśli nie, ty/inne osoby, z którymi pracujesz, prawdopodobnie mają swoje własne oddziały.Używanie rebase jest zazwyczaj złym pomysłem, jeśli inni już wyciągnęli twój kod, ponieważ może to powodować problemy z powodu przepisywania historii –

+0

Tak więc ~ 5 nie zliczałoby zatwierdzeń od wzorca, który został zrobiony Pociągnąłem w, o ile jestem jedynym, który angażuje się w branżę? Czy "5" oznacza ostatnie pięć unikatowych dla tego oddziału, czy ostatnie pięć zatwierdzeń w sumie? – hhh

2

Innym rozwiązaniem, które może działać lepiej dla Ciebie byłoby, aby wygenerować plik poprawki z git diff --patch > "patch filename" a potem łatać je do głównego oddziału użyciu git apply "patch file name".

Man strona dla git-diff (zwłaszcza "Generowanie łaty z -p"): http://www.kernel.org/pub/software/scm/git/docs/git-diff.html

Man aktualizacja git ubiegać: http://www.kernel.org/pub/software/scm/git/docs/git-apply.html

+0

git apply ... ciekawe :) Dobrze wiedzieć! – hhh

Powiązane problemy