Najważniejsze, czego tu chcesz, to git add -p
( -p
to synonim --patch
). Zapewnia to interaktywny sposób sprawdzania zawartości, pozwalając ci zdecydować, czy każdy przystojniak powinien wejść, a nawet umożliwiając ręczną edycję łatki, jeśli to konieczne.
Aby użyć go w połączeniu z cherry-pick:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Podziękowania dla Tima Henigana za przypomnienie mi, że git-cherry-pick ma opcję - no-commit, oraz podziękowania dla Felixa Rabe'a za wskazanie, że musisz zresetować! Jeśli chcesz tylko pozostawić kilka rzeczy poza zatwierdzeniem , możesz użyć git reset <path>...
do rozpakowania tylko tych plików).
W add -p
razie potrzeby możesz oczywiście podać konkretne ścieżki . Jeśli zaczynasz z plaster można wymienić cherry-pick
z apply
.
Jeśli naprawdę chcesz git cherry-pick -p <commit>
(ta opcja nie istnieje), możesz użyć
git checkout -p <commit>
Spowoduje to różnicowanie bieżącego zatwierdzenia w stosunku do określonego przez Ciebie zatwierdzenia i pozwoli na indywidualne zastosowanie fragmentów z tego pliku różnic. Ta opcja może być bardziej przydatna, jeśli zatwierdzenie, które pobierasz, powoduje konflikty scalania w części zatwierdzenia, którego nie jesteś zainteresowany. (Pamiętaj jednak, że checkout
różni się od cherry-pick
: checkout
stara się <commit>
całkowicie cherry-pick
zastosować zawartość, stosuje różnicę określony zatwierdzenie od jego rodzica. Oznacza to, że checkout
może zastosować więcej niż tylko to zatwierdzenie, które może być więcej niż chcesz.)
cherry-pick -n
najwyraźniej nie zostawiłem zmian wprowadzonych etapami - konwencja jest na pewno taka, że--no-commit
opcje zatrzymują się tuż przed zatwierdzeniem, tj. Ze wszystkimi wprowadzonymi zmianami. Dodam reset do odpowiedzi.git checkout -p <F>
ma nie tylko ci zmiany z F, to dostaje ABCDEF wszystko puree razem i pozwala uporządkować jaka część, którą chcesz . Sprowadzenie tego do niektórych zmian z F jest uciążliwe. Z drugiej strony,git cherry-pick -n <F>
dostajesz tylko zmiany z F - a jeśli niektóre z tych konfliktów są sprzeczne, to pomaga ci powiedzieć, abyś mógł dowiedzieć się, jak poprawnie połączyć.git reset
Usunie wystawił pliki iadd -p
po prostu powiedzieć „nic do dodania”.Wiem, że odpowiadam na stare pytanie, ale wygląda na to, że istnieje nowy sposób na to z interaktywnym sprawdzaniem:
Kredyt dla Czy mogę interaktywnie wybierać kawałki z innego git commit?
źródło
Zakładając, że zmiany, które chcesz, znajdują się na czele gałęzi, od której chcesz zmiany, użyj polecenia git checkout
dla jednego pliku:
dla wielu plików po prostu łańcuch:
źródło
Opierając się na odpowiedzi Mike'a Monkiewicza , możesz również określić jeden lub więcej plików do kasy z dostarczonego sha1 / branch.
Umożliwi to interaktywne wybieranie zmian, które chcesz zastosować do bieżącej wersji pliku.
źródło
Jeśli chcesz podać listę plików w wierszu poleceń i załatwić całą sprawę za pomocą pojedynczego polecenia atomowego, spróbuj:
git apply --3way <(git show -- list-of-files)
--3way
: Jeśli łatka nie zostanie zastosowana w sposób czysty, Git utworzy konflikt scalania, abyś mógł uruchomićgit mergetool
. Pominięcie--3way
spowoduje, że Git zrezygnuje z łatek, które nie mają czystego zastosowania.źródło
Jeśli „częściowe wybieranie” oznacza „w plikach, wybieranie niektórych zmian, ale odrzucanie innych”, można tego dokonać, wprowadzając
git stash
:git reset HEAD^
aby przekonwertować całe wybrane przez siebie zatwierdzenie na nieskalowane zmiany robocze.git stash save --patch
: interaktywnie wybierz niechciany materiał do schowania.git commit
git stash drop
.Wskazówka: jeśli nadasz skrytce niechcianych zmian nazwę:
git stash save --patch junk
to jeśli teraz zapomnisz zrobić (6), później rozpoznasz skrytkę taką, jaka jest.źródło
Służy
git format-patch
do wycinania części zatwierdzenia, na których Ci zależy, igit am
do zastosowania w innej gałęziźródło