Mam 2 gałęzie git branch1 i branch2 i chcę scalić plik.py w gałęzi2 do pliku.py w gałęzi1 i tylko ten plik.
Zasadniczo chcę po prostu popracować nad plikiem file.py w branch1, ale chcę skorzystać z polecenia merge. Jaki jest najlepszy sposób, aby to zrobić?
Odpowiedzi:
Gdy treść pochodzi
file.py
z gałęzi 2, która nie ma już zastosowania do gałęzi 1 , wymaga wybrania niektórych zmian i pozostawienia innych. Aby uzyskać pełną kontrolę, wykonaj interaktywne scalanie za pomocą--patch
przełącznika:Sekcja trybu interaktywnego na stronie podręcznika zawiera
git-add(1)
wyjaśnienia klawiszy, które mają być używane:Polecenie Split jest szczególnie przydatne.
źródło
git init <dir>
) i ostatecznie go wyrzucić (rm -r <dir>
).Chociaż samo w sobie nie jest to scalanie , czasami potrzebna jest cała zawartość innego pliku w innej gałęzi. Post na blogu Jasona Rudolpha zapewnia prosty sposób kopiowania plików z jednej gałęzi do drugiej. Zastosuj technikę w następujący sposób:
Teraz
file.py
jest teraz w branch1 .źródło
file.py
to, co jest w gałęzi 2.Żadna z innych bieżących odpowiedzi nie „scali” plików, tak jakbyś używał polecenia scalania. (W najlepszym przypadku będą wymagały ręcznego wybierania różnic). Jeśli faktycznie chcesz skorzystać z połączenia przy użyciu informacji od wspólnego przodka, możesz wykonać procedurę opartą na procedurze znajdującej się w sekcji „Zaawansowane scalanie” gita Instrukcja obsługi.
W przypadku tego protokołu zakładam, że chcesz scalić plik „ścieżka / do / plik.txt” od źródła / wzorca do pliku HEAD - odpowiednio zmodyfikuj. (Nie musisz znajdować się w głównym katalogu repozytorium, ale to pomaga.)
git merge-file powinien używać wszystkich domyślnych ustawień scalania do formatowania i tym podobnych.
Pamiętaj również, że jeśli Twoja „nasza” jest wersją roboczą i nie chcesz być zbyt ostrożny, możesz operować bezpośrednio na pliku:
źródło
Czy wszystkie modyfikacje
file.py
wbranch2
swoich własnych zatwierdzeń, niezależnie od zmian do innych plików? Jeśli tak, możesz po prostucherry-pick
zmienić:W przeciwnym razie,
merge
nie działa na poszczególne ścieżki ... równie dobrze można po prostu stworzyćgit diff
skrawekfile.py
zmian odbranch2
igit apply
imbranch1
:źródło
Możesz
stash
istash pop
plik:źródło
Aby scalić tylko zmiany z branch2, usuń
file.py
pozostałe zmiany.Funkcja Merge nigdy nie obejrzy żadnego innego pliku. Być może będziesz musiał '-f' przy kasach, jeśli drzewa są wystarczająco różne.
Zauważ, że to spowoduje, że gałąź1 będzie wyglądać tak, jakby wszystko w historii branch2 do tego momentu zostało scalone, co może nie być tym, czego chcesz. Prawdopodobnie jest lepsza wersja pierwszej kasy powyżej
w takim przypadku komunikat o zatwierdzeniu powinien również być
źródło
Jestem w tej samej sytuacji, chcę scalić plik z gałęzi, która ma wiele zatwierdzeń na gałęzi 2. Wypróbowałem wiele sposobów powyżej i innych, które znalazłem w Internecie i wszystkie zawiodły (ponieważ historia zatwierdzania jest złożona), więc postanawiam zrobić wszystko po swojemu (szalony sposób).
źródło
To, co zrobiłem, jest trochę ręczne, ale:
revert
;HEAD~1
, to znaczy ich stan w zatwierdzeniu scalenia;Brzydki? Tak. Łatwe do zapamiętania? Też tak.
źródło