Mam repo1
i repo2
na komputerze lokalnym. Są bardzo podobne, ale ta ostatnia jest jakąś inną gałęzią ( repo1
nie jest już utrzymywana).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Jak zastosować zmiany dokonane przez zobowiązać <some_sha>
się repo1
do repo2
?
Czy muszę przygotować jakąś łatkę, czy można zrobić kilka cherry-pick
między repozytoriami?
Co powiesz na to samo, ale dla zakresu zatwierdzeń?
Odpowiedzi:
Jako hack możesz spróbować zmodyfikować przepis na porównywanie zatwierdzeń w dwóch różnych repozytoriach na stronie GitTips , tj .:
gdzie
../repo
jest ścieżka do innego repozytorium.Dzięki nowoczesnemu Gitowi możesz używać wielu wersji i zakresów wersji za pomocą najlepszego wyboru .
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
Jest tutaj, aby przetłumaczyć<commit>
(na przykładHEAD
, albov0.2
, lubmaster~2
, które są wartościami w drugim repozytorium) do skopiowania z SHA-1 Identyfikator popełnić. Jeśli znasz SHA-1 zmiany, którą chcesz wybrać, nie jest to konieczne.UWAGA jednak, że Git może pominąć kopiowanie obiektów z repozytorium źródłowego, ponieważ nie wie, że alternatywne repozytorium obiektów jest tylko tymczasowe, dla jednej operacji. Może być konieczne skopiowanie obiektów z drugiego repozytorium za pomocą:
Spowoduje to umieszczenie tych obiektów pożyczonych z drugiego repozytorium w oryginalnym repozytorium
Nie testowany.
Nie tak zręcznym rozwiązaniem jest podążanie za odpowiedzią Knittla :
git format-patch
git am --3way
do nakładania łatźródło
fatal: unable to read tree ...
ale pogit reset HEAD^
wszystkim działa dobrze<commit>
alerev-parse --verify
polecenie nie lubi tego, ponieważ akceptuje tylko pojedyncze wartości zatwierdzeń. Ale ponieważcherry-pick
akceptuje zarówno wartości zatwierdzenia pojedynczego, jak i zakresu, pytam: dlaczego jestrev-parse
potrzebny?git rev-parse
jest potrzebna, jeśli chcesz zapoznać się zatwierdzeniem przez jego nazwę ref oparte na innej repozytorium, na przykładmaster
,HEAD^^
czy coś takiego; rev-parse zamienia go w uniwersalny identyfikator SHA-1.Prawdopodobnie będziesz chciał użyć,
git format-patch
a następniegit am
zastosować tę poprawkę do swojego repozytorium.Lub w jednej linii:
źródło
GIT_ALTERNATE_OBJECT_DIRECTORIES
(to mogłoby uszkodzić moje repozytorium).--ignore-whitespace
dogit am
polecenia może rozwiązać wszelkie konflikty i uniknąć konieczności wykonywania trójstronnego scaleniaMożesz to zrobić,
cherry-pick
jeśli dodasz drugie repozytorium jako pilot do pierwszego (a potemfetch
).źródło
git fetch [remote-name]
w drugim repozytorium, a potemgit cherry-pick [sha1]
.cherry-pick
. Więc nawet jeśli wydaje się to „właściwą” drogą, nie zawsze jest to najbardziej praktyczne.Napisałem mały skrypt do zastosowania wyjścia diff z repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
źródło