Czy można scalić tylko zmiany w podkatalogu z lokalnego oddziału Git do zdalnej gałęzi Git, czy jest to „wszystko albo nic”?
Na przykład mam:
branch-a
- content-1
- dir-1
- content-2
i
branch-b
- content-1
- dir-1
- `content-2
Chcę tylko połączyć zawartość branch-a dir-1 z zawartością branch-b dir-1.
Odpowiedzi:
Jako alternatywa dla pytania SO „ Jak połączyć wybrane pliki z git-merge? ”, Właśnie znalazłem ten wątek GitHub, który mógłby być bardziej przystosowany do scalania całego podkatalogu, opartego na drzewie odczytu git :
(to wykonuje scalanie przy użyciu strategii „nasza” (
-s ours
), która odrzuca zmiany z gałęzi źródłowej. Zapisuje faktinfochimps/master
scalenia, bez faktycznej modyfikacji żadnego pliku w gałęzi docelowej)Powoduje to odczytanie drzewa tylko dla wymaganego podkatalogu źródłowego, tj.
cookbooks/cassandra
W górnej gałęzi repozytorium źródłowego .Zwróć uwagę, że nazwa podkatalogu docelowego również powinna być
cookbooks/cassandra
, lub zobaczysz:Uzupełnienie
To dziwne, [edytuj mnie] - ale
read-tree
krok może się nie udać w ten sposób:... nawet jeśli oba pliki są identyczne . To może pomóc:
Ale oczywiście sprawdź ręcznie, czy robi to, co chcesz.
źródło
<rev>:<path>
npHEAD:README
,:README
,master:./README
git read-tree
Krok nie dla mnie:error: Entry 'foo/bar/baz.php' overlaps with 'bar/baz.php'. Cannot bind.
overlaps with
błąd też wyskakuje na identycznych plikach . Jakie to dziwne?infochimps/master
został scalony, ale bez faktycznej modyfikacji żadnego pliku w gałęzi docelowej. Ponieważ następny krokgit read-tree --prefix=cassandra
dokona modyfikacji. Ostateczne zatwierdzenie zapisze rzeczywistą zawartość „scalania”.Na przykład załóżmy, że masz gałąź „source” i gałąź „destination”, które odzwierciedlają własne wersje (lub nie, jeśli są tylko lokalne) i są ściągane do najnowszego kodu. Powiedzmy, że chcę podkatalogu w repozytorium o nazwie newFeature, który istnieje tylko w gałęzi „source”.
Jest znacznie mniej zagmatwany niż wszystko inne, co widziałem i to działało idealnie dla mnie, znalezione tutaj .
Zwróć uwagę, że nie jest to „prawdziwe scalanie”, więc nie będziesz mieć informacji o zatwierdzeniu nowej funkcji w gałęzi docelowej, a jedynie modyfikacje plików w tym podkatalogu. Ale ponieważ prawdopodobnie zamierzasz później scalić całą gałąź z powrotem lub ją odrzucić, może to nie stanowić problemu.
źródło
Dostałem to z wątku na forum w Eclipse i działało to jak marzenie:
źródło
checkout
sprawia, że foldery są takie same => różnica jest tylko unfolderscheckout
=>merge
różnica. To ważna strategia.Biorąc pod uwagę scenariusz OP, w którym mają dwie gałęzie, ale chcą scalić tylko historię dir-1 z gałęzi-a do gałęzi-b :
źródło
Utwórz repozytorium Git, aby zawierało zarówno gałąź-a, jak i gałąź-b:
źródło
Użyj,
git cherry-pick
aby wybrać żądane zatwierdzenia i połączyć tylko te zatwierdzenia. Kluczowa sztuczka polega na tym, aby uzyskać te zatwierdzenia w łatwy sposób (aby nie trzeba było ich rozgryzać ręcznie, sprawdzając dziennik Gita i wprowadzając je ręcznie). Oto jak: użyj,git log
aby wydrukować identyfikator SHA-1 zatwierdzenia , na przykład:„commit-a” to zatwierdzenie bezpośrednio przed punktem początkowym gałęzi do scalenia, a „commit-b” to ostatnie zatwierdzenie w gałęzi do scalenia. '--reverse' drukuje te zatwierdzenia w odwrotnej kolejności do późniejszego wybrania.
Następnie zrób to tak:
To dwa kroki, proste i stabilne!
źródło
Two steps, simple and stable!
wcale nie proste :)git
, który ma okropny interfejs i okropny model mentalny pełen tajemnic i przypadkowych nazw i znaczeń.