Mam dwie gałęzie (A i B) i chcę scalić pojedynczy plik z gałęzi A z odpowiednim pojedynczym plikiem z gałęzi B.
git
merge
git-branch
Isuru
źródło
źródło
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853Odpowiedzi:
Natknąłem się na ten sam problem. Mówiąc ściślej, mam dwie gałęzie
A
iB
te same pliki, ale w niektórych plikach inny interfejs programowania. Teraz metody plikuf
, które są niezależne od różnic interfejsu między dwiema gałęziami, zostały zmienione w gałęziB
, ale zmiana jest ważna dla obu gałęzi. Dlatego muszę połączyć tylko plikf
gałęziB
z plikiemf
gałęziA
.Proste polecenie już dla mnie rozwiązało problem, jeśli założę, że wszystkie zmiany zostały zatwierdzone w obu gałęziach
A
iB
:Pierwsze polecenie zmienia się w gałąź
A
, w której chcę scalićB
wersję plikuf
. Drugie polecenie patch plikf
zf
oHEAD
oB
. Możesz nawet zaakceptować / odrzucić pojedyncze części łaty. Zamiast tegoB
możesz tutaj podać dowolny zatwierdzenie, nie musi to byćHEAD
.Edycja społeczności : jeśli plik
f
na jeszczeB
nie istniejeA
, pomiń--patch
opcję. W przeciwnym razie otrzymasz komunikat „Bez zmian”. wiadomość.źródło
git checkout --patch B -- f
żeby to zadziałało.a
w fazie interaktywnej, zamiast naciskać zay
każdym razem. Lubgit checkout B -- f
zamiast tego użyj polecenia.Oto, co robię w tych sytuacjach. To kludge, ale dla mnie działa dobrze.
Próbowałem łatać i moja sytuacja była na to zbyt brzydka. Krótko mówiąc, wyglądałoby to tak:
Działająca gałąź: A Eksperymentalna gałąź: B (zawiera plik.txt, który zawiera zmiany, które chcę złożyć.)
Utwórz nowy oddział na podstawie A:
Scal B w tempAB
Skopiuj skrót sha1 scalenia:
Sprawdź działający oddział:
Sprawdź swój naprawiony plik:
I powinieneś to mieć. Zaakceptuj swój wynik.
źródło
A
zmienił odB
początku na inne sposoby. Kopiowanie zastąpi te różnice.Wykorzystuje wewnętrzny difftool gita. Może trochę pracy do zrobienia, ale od razu.
źródło
--
(pustej etykiety argumentu), git checkout docs: ARGUMENT DISAMBIGUATION powiedz: „użyj,git checkout -- <pathspec>
jeśli chcesz wyewidencjonować te ścieżki z indeksu”. Jest tak, ponieważ możesz mieć zarówno gałąź, jak i plik / ścieżkę o tej samej nazwie. W takich przypadkach, zamiast prosić o jednoznaczne ustalenie, czy gałąź lub ścieżka powinna zostać wypisana, gdy oba istnieją, git zdecyduje się na domyślną wypłatę gałęzi. Jednak jeśli--
poprzedza, git zamiast tego pobierze plik / ścieżkę.Uznałem to podejście za proste i przydatne: jak „scalić” określone pliki z innej gałęzi
Przeczytaj cały artykuł, aby uzyskać więcej zrozumienia
źródło
-p
opcji w tym poleceniu. Które następnie nadpisują wszystkie części pliku roboczego, które wcześniej przekierowały z gałęzi, z której się wyewidencjonowałeś, przed zmianami łatki, niestety.Możesz użyć:
Wskazówka: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
źródło
git merge-file
Następujące polecenie (1) porówna plik prawidłowej gałęzi, aby master (2) interaktywnie zapytał, jakie modyfikacje zastosować.
git checkout --patch master
źródło
Moja edycja została odrzucona, więc tutaj dołączam, jak obsługiwać scalanie zmian ze zdalnego oddziału.
Jeśli musisz to zrobić po niepoprawnym scaleniu, możesz zrobić coś takiego:
źródło
Zakładając, że B jest bieżącą gałęzią:
Pamiętaj, że dotyczy to tylko zmian w pliku lokalnym. Musisz później dokonać zobowiązania.
źródło
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Możesz pobrać starą wersję pliku do scalenia, zapisując go pod inną nazwą, a następnie uruchomić dowolne narzędzie do scalania na dwóch plikach.
na przykład.
git show B:src/common/store.ts > /tmp/store.ts
(gdzie B jest nazwą oddziału / zatwierdzenia / znacznika)meld src/common/store.ts /tmp/store.ts
źródło
Zrobię to jak
git format-patch branch_old..branch_new file
spowoduje to utworzenie poprawki do pliku.
Zastosuj łatkę w miejscu docelowym branch_old
git am blahblah.patch
źródło