Частично вишневый коммит с Git

Я не знаю о команде, но просто нажмите «ctrl + h» диалоговое окно, которое появляется, когда у вас есть то, что вам нужно

475
задан Mateusz Piotrowski 12 December 2017 в 21:03
поделиться

3 ответа

Главное, что вам нужно здесь, это git add -p ( -p является синонимом - patch ). Это обеспечивает интерактивный способ проверки содержимого, позволяя вам решать, следует ли вводить каждый блок, и даже позволяя вам вручную редактировать патч, если необходимо.

Чтобы использовать его в сочетании с вишневым выбором:

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!

(Благодаря Тим Хениган за то, что напомнил мне, что git-cherry-pick имеет параметр --no-commit, и спасибо Феликсу Рэбу за то, что он указал, что вам нужно выполнить сброс! Если вы хотите убрать несколько вещей из фиксации, вы можете используйте git reset ... , чтобы деактивировать только эти файлы.)

Вы, конечно, можете указать конкретные пути к add -p , если необходимо. Если ты' при запуске патча вы можете заменить cherry-pick на apply .


Если вам действительно нужен git cherry-pick -p (такой опции не существует), вы можете использовать

git checkout -p <commit>

, который будет сравнивать текущую фиксацию с указанной вами фиксацией и позволит вам применять блоки из этой разницы индивидуально. Эта опция может быть более полезной, если коммит, который вы втягиваете, имеет конфликты слияния в части коммита, который вас не интересует. (Однако обратите внимание, что checkout отличается от cherry-pick : checkout пытается полностью применить содержимое , cherry-pick применяет различие указанного коммита от его родителя.

760
ответ дан 22 November 2019 в 22:45
поделиться

Если Вы хотите указать список файлов на командной строке и сделать все это в единственной атомарной команде, попробуйте:

git apply --3way <(git show -- list-of-files)

--3way: Если патч не будет применяться чисто, то Мерзавец создаст конфликт слияния, таким образом, можно будет работать git mergetool. Исключение --3way заставит Мерзавца разочароваться в патчах, которые не применяются чисто.

1
ответ дан 22 November 2019 в 22:45
поделиться

Предполагая, что нужные изменения находятся в начале ветки, из которой вы хотите внести изменения, используйте git checkout

для одного файла:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

для нескольких файлов просто шлейфовое соединение:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
37
ответ дан 22 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: