git-пропуск определенных коммитов при слиянии
Я использую Git уже около года и думаю, что это фантастика, но я только что начал вторую версию проекта и начал новую ветку для него. Я немного борюсь с лучшим способом справиться с вещами, идущими вперед.
у меня есть две ветви под названием say master10 (для v1) и master20 (для v2). Я делал исправления ошибок в v1 на ветке master10 и разрабатывал новые материалы master20. Всякий раз, когда я делаю исправление ошибки, я объединяю его в v2, проверяя master20 и делать git merge master10. Пока все хорошо.
теперь, однако, я внес изменения в v1, которые я не хочу в v2, но я хочу продолжить слияние других исправлений ошибок. Как я могу сказать Git, чтобы пропустить этот конкретный коммит (или ряд коммитов), но в будущем я все еще хочу объединить другие исправления ошибок.
Я думал git rebase может быть, это то, что мне нужно, но прочитайте документ, и моя голова почти взорвалась.
Я думаю, что я хочу что-то вроде команды "git sync", которая говорит git, что два ветви теперь синхронизированы и в будущем только объединяют фиксации с этой точки синхронизации.
любая помощь ценится.
6 ответов:
Если вы хотите объединить большинство, но не все коммиты на ветке "maint" в "master", например, вы можете сделать это. Это требует некоторой работы-как упоминалось выше, обычный вариант использования-объединить все из ветки-но иногда случается, что вы внесли изменения в версию выпуска, которая не должна быть интегрирована обратно (возможно, этот код уже был заменен в master), так как вы это представляете? Вот так...
Итак, предположим, что в maint было применено 5 изменений, и один из них (maint~3) не должен быть объединен обратно в master, хотя все остальные должны быть. Вы делаете это в три этапа: фактически объединяете все до этого, говорите git, чтобы отметить maint~3 как объединенный, даже если это не так, а затем объедините остальные. Магия такова:
bash <master>$ git merge maint~4 bash <master>$ git merge -s ours maint~3 bash <master>$ git merge maintпервая команда объединяет все до ваш хлопотный maint совершить на мастера. Сообщение журнала слияния по умолчанию объяснит, что вы объединяете "ветвь" maint "(рано часть.")
вторая команда объединяет проблемный maint~3 commit, но опция "-s ours" говорит git использовать специальную "стратегию слияния", которая, по сути, работает, просто сохраняя дерево, в которое вы сливаетесь, и игнорируя коммит(ы), которые вы полностью сливаете. Но он все еще делает новую фиксацию слияния с HEAD и maint~3 в качестве родителей, поэтому график пересмотра теперь говорит, что maint~3 объединен. Так что на самом деле вы, вероятно, хотите использовать опцию-m для "git merge", чтобы объяснить что этот maint~3 commit фактически игнорируется!
последняя команда просто объединяет остальную часть maint (maint~2..maint) в мастер, так что вы все синхронизированы снова.
ИМХО, самое логичное, что нужно сделать, - это объединить все, а затем использовать git revert (commit_you_dont_want), чтобы удалить его.
пример:
git merge master git revert 12345678если у вас есть несколько коммитов "to-ignore" или вы хотите отредактировать сообщение revert:
git merge master git revert -n 123456 git revert -n abcdef git commit -m "... Except commits 123456 and abcdef"тогда твоя история может выглядеть так:
| ... Except 123456 and abcdef |\ Merge branch 'master' into 'your_branch'если у вас есть конфликты, связанные только с этими коммитами "to-ignore", вы можете использовать:
git merge master -X oursтак что ваша версия будет упорствуйте над другим. Даже без сообщений об ошибках вы все равно можете" вернуть " эти нежелательные коммиты, потому что у них могут быть другие изменения, которые не конфликтуют, и вы все равно не хотите их.
если у вас есть конфликты, связанные не только с коммитами "to-ignore", вы должны разрешить их вручную, и вам, вероятно, придется разрешить их снова во время возврата.
коммиты включают в себя родословную. Вы не можете объединить коммит без слияния предыдущих коммитов.
вы можете подбирать, конечно. Это прекрасный поток, когда у вас есть ветка, которая находится в режиме обслуживания.
звучит как классический случай для "git cherry-pick" https://git-scm.com/docs/git-cherry-pick это именно то, что это звучит как
своего рода реклама для моего проект который в основном обертывает процесс, описанный @araqnid.
Это своего рода помощник, который вводит следующий поток GIT:
- есть ежедневное / еженедельное уведомление о ожидающих слияниях из ветвей обслуживания в ветвь dev/master
- сопровождающий филиала проверяет статус и решает сам, требуются ли все коммиты и либо блокирует некоторые из них, либо просит разработчиков заблокировать сами себя. В конце концов ветка сопровождения объединяются в вверх по течению.
цитата со страницы проекта:
в зависимости от рабочего процесса возможен ремонт или клиент-специфические ветви вместе с главной ветвью. Эти ветви также называются ветвями LTS.
часто горячие исправления идут в ветви, где была ошибка сообщается, а затем фиксация объединяется обратно в главную ветвь.
общая практика состоит в том, чтобы все ветви были идеально синхронизированы с мастер, т. е. вы хотите увидеть четкую разницу между определенной ветвь и мастер, чтобы понять, содержит ли мастер все особенности и исправления ошибок.
однако иногда вы не хотите конкретных коммитов, потому что они есть заказчика и не должны быть видимы другим пользователям. Или главная ветка разошлась настолько, что требует совершенно другого подход к устранению проблемы, или даже лучше, проблема уже не в этом присутствовать там.
также в случае вишни-выберите от мастера в ветвь обслуживания полученная фиксация должна быть заблокирована в master.
создайте третью ветвь для изменений, которые вы хотите в master10, но не в master20. Всегда считайте master10 своим "мастером", самой стабильной ветвью из всех. Ветка все другие филиалы хотите сохранить в синхронизации с во все времена.
Comments