Weź ten scenariusz:
- Decyduję się na „rozwidlenie” bazy kodu na github.com i zaczynam wykonywać swoją procedurę: Edycja - Zatwierdź - Wypchnij; aka hack hack hack.
- Po wprowadzeniu kilku zmian widzę zmiany, które inna osoba wprowadziła w tym samym projekcie i lubię je!
- Postanawiam, że chcę je połączyć w moje. Problem w tym, że chcę tylko „część” jednego konkretnego zatwierdzenia spośród kilku wykonanych przez niego zatwierdzeń.
Jaka byłaby najskuteczniejsza metoda połączenia tych wybranych ilości zmian w moim „forku”?
Odpowiedzi:
Po trollowaniu na falach świata IRC, ktoś podał świetne rozwiązanie:
Miejmy nadzieję, że to pomoże komukolwiek z tym samym pytaniem!
EDYCJA: OK, może to nie jest takie proste. Oto pełne kroki:
Najpierw musisz być w swoim repozytorium, wykonać niezbędne czynności,
cd
aby dostać się do katalogu roboczego.Musisz teraz dodać zdalną gałąź, a następnie ją pobrać. Zrób to przez:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
Możesz teraz uruchamiać polecenia, takie jak
git log someUser/master
znalezienie SHA1 zatwierdzenia, które chcesz scalić „częściowo”.Gdy masz już SHA, możesz teraz uruchomić:
git cherry-pick -n SHA1
gdzie
SHA1
jest zatwierdzenie SHA, duh!Prawdopodobnie wystąpią konflikty, w zależności od tego, ile lat ma zatwierdzenie i jak często zmienia się ten konkretny obszar projektu. Przepraszamy, ale musisz ręcznie rozwiązać te problemy za pomocą zaufanego edytora. Wyciągnij więc VIM lub cokolwiek innego, z którego korzystasz, i zrywaj konflikty, aż dojdziesz do etapu, na którym lubisz zmiany.
Musisz teraz zresetować indeks do wersji HEAD, a następnie możesz użyć sprawdzonego
add --patch
polecenia GIT, aby wybrać i wybrać żądane zmiany:git reset HEAD
git add --patch
lubgit add -p
Yay! Czas realizacji:
git commit -m "I merged a select amount of changes"
Aby posprzątać bałagan (rzeczy, którym odmówiłeś
git add --patch
) i zachować tylko wybrane zmiany w repozytorium roboczym, uruchom:git reset --hard HEAD
Najwyraźniej
git checkout -f
jest to również inna opcja.źródło
git add -p
; jest niezwykle potężny. Jeśli masz już dane zatwierdzenie (np. Nie zostało użyte--no-commit
na pick-upie lub jest to jedno z twoich zatwierdzeń), możesz użyćgit reset HEAD^
do przewinięcia indeksu do zatwierdzenia z powrotem, a następnie dodać zmiany z powrotem za pomocągit add -p
, zatwierdzając krokami . Jeśli zatwierdzenia nie ma w końcówce gałęzi, możesz użyćgit rebase -i
i wybrać edycję danego zatwierdzenia.-n
git cherry-pick SHA1
git remote add <user> <fork-url>
- wtedy możeszgit cherry-pick
normalnie.Nie wiem, czego chcesz. Jeśli chcesz sprowadzić tylko niektóre zatwierdzenia z innych forków, możesz użyć
git cherry-pick SHA
. Pełne wyjaśnienie na temat gitready .źródło
Naprawdę podoba mi się rozwiązanie Tima, jednak czasami lubię majsterkować w vimdiff. Moje rozwiązanie tego problemu jest prymitywne, ale działa dla mnie, ponieważ lubię vim.
Mam ustawionego vimdiffa jako moje difftool, a następnie, aby selektywnie scalić, odróżniam gałąź:
Następnie przechodzę do okienka z wersją bieżącej gałęzi i edytuję oryginał w vimie (czasami nie jest to konieczne, ale czasami vimdiff otwiera wersję w / tmp) i wyłączam tryb tylko do odczytu:
Teraz mogę używać narzędzi łatek Vima, takich jak
do
i,dp
aby zastosować to, co chcę, i wprowadzać inne drobne zmiany w trakcie. Kiedy skończę, zapisuję plik, wychodzę z vima, a następnie umieszczam i zatwierdzam plik w git jak zwykła edycja.Jak powiedziałem, nie jest to szczególnie wyrafinowane, ale jest bardzo potężne i nadal działa wyłącznie w wierszu poleceń. Po prostu upewnij się, że dodałeś wyraźną wiadomość o zatwierdzeniu, ponieważ git nie dołączy automatycznie wiadomości o scaleniu.
przykład vimdiff http://j.mp/1dZVllt
źródło
Jeśli chcesz tylko portu zatwierdzenia, prawdopodobnie najlepiej będzie, wybierając odpowiedni commit i resetując pliki, których nie chcesz zmieniać.
Oczywiście, jeśli masz kilka zmodyfikowanych części w pliku i chcesz zachować tylko niektóre z nich, nie masz innego wyjścia, jak edytować plik ręcznie, wycinając ich zmiany.
źródło