Используя GIT, как я могу выборочно объединять изменения из одного коммита в другой «форк»? - PullRequest
79 голосов
/ 10 сентября 2009

Взять этот сценарий:

  1. Я решил «разветвлять» кодовую базу на github.com и начать выполнять свою процедуру: Edit - Commit - Push; иначе взломать взломать взломать.
  2. После того, как я внес некоторые изменения, я вижу некоторые изменения, сделанные другим человеком в том же проекте, и они мне нравятся!
  3. Я решил, что хочу объединить их с моим. Проблема в том, что мне нужна только «часть» одного конкретного коммита из нескольких коммитов, которые он сделал.

Каким будет самый эффективный способ получения этих избранных изменений, объединенных в мою «вилку»?

Ответы [ 4 ]

117 голосов
/ 10 сентября 2009

После троллинга волн в мире IRC кто-то дал отличное решение:

git cherry-pick SHA1 --no-commit
git add --patch

Надеюсь, это поможет кому-то еще с тем же вопросом!

РЕДАКТИРОВАТЬ: ОК, может быть, это не так просто. Вот полные шаги:

  1. Сначала вы должны быть в своем хранилище, выполните все необходимые действия cd, чтобы попасть в ваш рабочий каталог.

  2. Теперь вам нужно добавить удаленную ветку и затем извлечь ее. Сделайте это:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. Теперь вы можете запускать такие команды, как git log someUser/master, чтобы найти коммит SHA1, который вы хотите объединить в 'частично'.

  4. Когда у вас есть SHA, вы можете запустить:

    git cherry-pick -n SHA1

    где SHA1 - коммит SHA, да!

  5. Вполне возможно, что возникнут конфликты, в зависимости от того, сколько лет выполнено коммиту и как часто меняется эта конкретная область проекта. Извините, но вы должны вручную разрешить их с помощью вашего верного редактора. Так что извлекайте VIM или что-то еще, что вы используете, и взламывайте конфликты, пока не дойдете до стадии, на которой вам нравятся изменения.

  6. Теперь вам нужно сбросить индекс до версии HEAD, затем вы можете использовать команду trusty GIT add --patch, чтобы выбрать и выбрать, какие изменения вы хотите:

    git reset HEAD

    git add --patch или git add -p

  7. Ура! Время коммита:

    git commit -m "I merged a select amount of changes"

  8. Чтобы убрать беспорядок (то, что вы сказали нет в git add --patch) и сохранить только выбранные изменения в вашем рабочем хранилище, запустите:

    git reset --hard HEAD

    Очевидно, git checkout -f - это еще один вариант.

2 голосов
/ 18 января 2014

Мне действительно нравится решение Тима, однако иногда мне нравится возиться с vimdiff. Мое решение этой проблемы грубое, но оно работает для меня, потому что мне нравится vim.

Я установил vimdiff в качестве моего difftool, а затем для выборочного слияния я изменил ветку:

git difftool <branch> <file>

Затем я перехожу на панель с версией текущей ветви и редактирую оригинал в vim (иногда это не нужно, но иногда vimdiff открывает версию в / tmp) и отключаю режим только для чтения:

:e <file>
:set readonly!

Теперь я могу использовать инструменты исправлений vim, такие как do и dp, чтобы применять то, что я хочу, и вносить другие небольшие изменения по ходу работы. Когда я закончу, я сохраняю файл, выхожу из vim, а затем ставлю и фиксирую файл в git, как при обычном редактировании.

Как я уже сказал, это не особенно сложно, но очень мощно и все еще чисто в командной строке. Просто убедитесь, что вы добавили четкое сообщение о фиксации, поскольку git не будет автоматически включать в себя сообщение о слиянии.

пример vimdiff http://j.mp/1dZVllt

2 голосов
/ 10 сентября 2009

Мне не ясно, что вы хотите. Если вы хотите внести только определенные коммиты с других форков, вы можете использовать git cherry-pick SHA. Полное объяснение на gitready .

1 голос
/ 10 сентября 2009

Если вам нужен только порт коммита, вам, вероятно, лучше всего выбрать вишню для коммита, который вы хотите, и сбросить файлы, к которым вы не хотели прикасаться.

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

Конечно, если у вас есть несколько измененных частей в файле и вы хотите сохранить только некоторые из них, у вас нет выбора, кроме как редактировать файл вручную, вырезая их изменения.

...