Используя GIT, как я могу выборочно объединить изменения из одной фиксации на другой "вилке"?
возьмем такой сценарий:
- Я решаю "раскошелиться" на кодовую базу github.com, и начните делать мою рутину: Edit-Commit-Push; aka hack hack hack.
- после того, как я сделал некоторые изменения, я вижу некоторые изменения другой человек сделал на том же проекте, и мне они нравятся!
- Я решаю, что хочу объединить их в свой. Проблема в том, что я хочу только "часть" одного конкретного коммита, из нескольких коммитов, которые он сделал.
Что бы самый эффективный метод получения этих выбранных изменений, объединенных в мою "вилку"?
4 ответа:
после троллинга волны IRC мира, кто-то дал отличное решение:
git cherry-pick SHA1 --no-commit git add --patch
надеюсь, что это поможет кому-нибудь еще с тем же вопросом!
EDIT: хорошо, может быть, это не совсем так просто. Вот полные шаги:
сначала вы должны быть в репозитории, сделать необходимые
cd
- ing, чтобы добраться до вашего рабочего каталога.теперь вам нужно добавить удаленную ветку, а затем извлечь ее. Сделайте это с помощью:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
теперь вы можете запускать такие команды, как
git log someUser/master
чтобы найти фиксацию SHA1, которую вы хотите объединить в "частично".после того, как у вас есть SHA, теперь вы можете запустить:
git cherry-pick -n SHA1
здесь
SHA1
- это совершить ша, ух!там вполне возможно будут конфликты, в зависимости от того, сколько фиксация, и как часто конкретная область проекта меняется. Извините, но вы должны вручную решить их с помощью вашего надежного редактора. Поэтому вытащите VIM или что-то еще, что вы используете, и рубите конфликты, пока не дойдете до стадии, когда вам нравятся изменения.
теперь вам нужно сбросить индекс в редакцию HEAD, затем вы можете использовать надежный GIT
add --patch
команда, чтобы выбрать, какие изменения вы хотите:
git reset HEAD
git add --patch
илиgit add -p
Ура! Время фиксации:
git commit -m "I merged a select amount of changes"
чтобы убрать беспорядок (то, что вы сказали нет в
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 не будет автоматически включать сообщение слияния для вы.
Если вам нужен только порт фиксации, вам, вероятно, лучше всего выбрать фиксацию, которую вы хотите, и сбросить файлы, которые вы не хотите трогать.
git cherry-pick SHA1 git checkout HEAD file1 file2 ... fileN
конечно, если у вас есть несколько измененных частей в файле и вы хотите сохранить только некоторые из них, у вас нет выбора, кроме как редактировать файл вручную, вырезая их изменения.