Используя GIT, как я могу выборочно объединить изменения из одной фиксации на другой "вилке"?


возьмем такой сценарий:

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

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

4 76

4 ответа:

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

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

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

EDIT: хорошо, может быть, это не совсем так просто. Вот полные шаги:

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

  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 - это совершить ша, ух!

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

  6. теперь вам нужно сбросить индекс в редакцию HEAD, затем вы можете использовать надежный 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 это еще один вариант.

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

мне очень нравится решение Тима, однако иногда мне нравится возиться в 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

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

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

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