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 diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
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 diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Odpowiedzi:
Natknąłem się na ten sam problem. Mówiąc ściślej, mam dwie gałęzie A
i B
te same pliki, ale w niektórych plikach inny interfejs programowania. Teraz metody pliku f
, które są niezależne od różnic interfejsu między dwiema gałęziami, zostały zmienione w gałęzi B
, ale zmiana jest ważna dla obu gałęzi. Dlatego muszę połączyć tylko plik f
gałęzi B
z plikiem f
gałęzi A
.
Proste polecenie już dla mnie rozwiązało problem, jeśli założę, że wszystkie zmiany zostały zatwierdzone w obu gałęziach A
i B
:
git checkout A
git checkout --patch B f
Pierwsze polecenie zmienia się w gałąź A
, w której chcę scalić B
wersję pliku f
. Drugie polecenie patch plik f
z f
o HEAD
o B
. Możesz nawet zaakceptować / odrzucić pojedyncze części łaty. Zamiast tego B
możesz tutaj podać dowolny zatwierdzenie, nie musi to być HEAD
.
Edycja społeczności : jeśli plik f
na jeszcze B
nie istnieje A
, pomiń --patch
opcję. W przeciwnym razie otrzymasz komunikat „Bez zmian”. wiadomość.
git checkout --patch B -- f
żeby to zadziałało.
a
w fazie interaktywnej, zamiast naciskać za y
każdym razem. Lub git 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ć.)
git checkout A
Utwórz nowy oddział na podstawie A:
git checkout -b tempAB
Scal B w tempAB
git merge B
Skopiuj skrót sha1 scalenia:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Sprawdź działający oddział:
git checkout A
Sprawdź swój naprawiony plik:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
I powinieneś to mieć. Zaakceptuj swój wynik.
A
zmienił od B
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.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(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
Jak się okazuje, staramy się zbyt mocno. Nasz dobry przyjaciel git Checkout jest właściwym narzędziem do pracy.
git checkout source_branch <paths>...
Możemy po prostu podać git checkout nazwę gałęzi funkcji A i ścieżki do określonych plików, które chcemy dodać do naszej gałęzi master.
Przeczytaj cały artykuł, aby uzyskać więcej zrozumienia
-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ć:
git merge-file
Wskazówka: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
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
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:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Zakładając, że B jest bieżącą gałęzią:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Pamiętaj, że dotyczy to tylko zmian w pliku lokalnym. Musisz później dokonać zobowiązania.
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
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