Częściowo cherry-picking a commit with Git

Pracuję nad 2 różnymi gałęziami: release i development .

Zauważyłem, że nadal muszę zintegrować kilka zmian, które zostały wprowadzone do gałęzi releasez powrotem do gałęzi development.

Problem polega na tym, że nie potrzebuję wszystkich commitów, tylko niektórych plików, więc prosty

git cherry-pick bc66559
Nie działa.

Kiedy robię

git show bc66559

Widzę diff ale nie znam dobrego sposobu na zastosowałem to częściowo do mojego obecnego drzewa roboczego.

Author: Mateusz Piotrowski, 2009-10-06

5 answers

Główną rzeczą, którą będziesz chciał tutaj jest git add -p (-p jest synonimem --patch). Zapewnia to interaktywny sposób sprawdzania zawartości, pozwalając Ci zdecydować, czy każdy kawałek powinien wejść do gry, a nawet pozwolić ci ręcznie edytować poprawkę, jeśli to konieczne.

Aby używać 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, i podziękowania dla Felixa Rabe za wskazanie, że musisz zresetować! If you only jeśli chcesz zostawić kilka rzeczy poza zatwierdzeniem, możesz użyć git reset <path>..., aby usunąć tylko te pliki.)

W razie potrzeby możesz oczywiście podać konkretne ścieżki do add -p. Jeśli zaczynasz od plastra, możesz zastąpić cherry-pick apply.


Jeśli naprawdę chcesz git cherry-pick -p <commit> (ta opcja nie istnieje), możesz użyć

git checkout -p <commit>

Spowoduje to rozróżnienie aktualnego commita od podanego commita i pozwoli na indywidualne zastosowanie fragmentów z tego commita. Opcja ta może być bardziej przydatne, jeśli commit, który ściągasz, zawiera konflikty scalające w części commitu, który cię nie interesuje. (Zauważ jednak, że checkout różni się od cherry-pick: checkout próbuje zastosować zawartość <commit> w całości, cherry-pick stosuje diff określonego commita z jego rodzica. Oznacza to, że checkout może zastosować więcej niż tylko ten commit, który może być więcej niż chcesz.)

 690
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 21:27:38

Wiem, że odpowiadam na Stare pytanie, ale wygląda na to, że jest nowy sposób, aby to zrobić z interaktywnym sprawdzaniem:

git checkout -p bc66559

Kredyt na Czy Mogę interaktywnie wybrać hunks z innego commita git?

 63
Author: Mike Monkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

Zakładając, że zmiany, które chcesz wprowadzić, są na czele gałęzi, z której chcesz je wprowadzić, użyj git checkout

Dla pojedynczego pliku:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

Dla wielu plików po prostu daisy chain:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
 35
Author: Jay Swain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-01 06:06:38

Bazując na Mike Monkiewicz answer możesz również określić jeden lub więcej plików do kasy z dostarczonego sha1/branch.

git checkout -p bc66559 -- path/to/file.java 

Pozwoli Ci to interaktywnie wybrać zmiany, które chcesz zastosować do bieżącej wersji pliku.

 12
Author: Christian.D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:17

Jeśli "częściowo cherry picking "oznacza" w plikach, wybierając niektóre zmiany, ale odrzucając inne", można to zrobić wprowadzając git stash:

    Zrób pełny wybór wiśni.
  1. git reset HEAD^ Aby przekonwertować cały commit wybrany przez cherry na nieakceptowane zmiany robocze.
  2. Teraz git stash save --patch: interaktywnie wybierz niechciany materiał do ukrycia.
  3. Git wycofuje Ukryte zmiany z twojej kopii roboczej.
  4. git commit
  5. wyrzuć zapas niechcianych zmian: git stash drop.

Wskazówka: jeśli nadasz skrytce niechcianych zmian nazwę: git stash save --patch junk wtedy jeśli zapomnisz zrobić (7) teraz, później rozpoznasz skrytkę, jaka jest.

 1
Author: Kaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-02 17:28:45