Commit выбрать изменения в другой ветке, а затем возобновить работу над текущей ветвью?

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

Я хочу вернуться к основной ветке разработки и зафиксировать изменения в выбранных файлах, а затем вернуться к ветки функции и переустановить, чтобы я мог продолжить работу с несвязанными настройками/исправлениями.

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

Есть ли другой способ избежать конфликтов или каким-то образом сохранить текущее состояние, и только вытащить выбранные рабочие изменения дерева в другую ветку для совершения? (вроде как git -stash-cherry-pick; -))

Ответы

Ответ 1

  • Зафиксируйте изменения, которые вы хотите в master в вашей текущей ветке.
  • Сохраняйте оставшиеся изменения.
  • Перейдите в ветвь master и используйте git cherry-pick, чтобы переместить изменения на master
  • Вернитесь к своей ветке пера и rebase (необязательно)
  • Разблокировать исходные изменения функций

Ответ 2

Обычно я делаю это наоборот. Я продолжаю работать в своей ветке функций, пока не готов совершить сделку. Как только я это сделаю, я добавлю все изменения, которые относятся к новому фиксации для ветки, к индексу, но не к тем, которые принадлежат мастеру. git add -p et.al сделать это очень просто. После всех соответствующих изменений в индексе я передаю ветку. Все остальные оставшиеся грязные изменения принадлежат мастеру и будут переноситься только отлично, как только я переключусь на это, чтобы я мог зафиксировать его там.

Ответ 3

Попробуйте вернуться к ветки master с помощью параметра --merge. Он попытается выполнить трехстороннее слияние между двумя ветвями. Хороший пример имеет документация git:

2. After working in the wrong branch, switching to the correct
   branch would be done using:

      $ git checkout mytopic

   However, your "wrong" branch and correct "mytopic" branch
   may differ in files that you have modified locally, in which 
   case the above checkout would fail like this:

      $ git checkout mytopic
      error: You have local changes to 'frotz'; not switching branches.

   You can give the -m flag to the command, which would try a
   three-way merge:

      $ git checkout -m mytopic
      Auto-merging frotz

   After this three-way merge, the local modifications are not
   registered in your index file, so git diff would show you what
   changes you made since the tip of the new branch.

Ответ 4

В MacOS GitX очень легко сделать вид выборочной фиксации rafl, так что хороший способ приблизиться к ней если это среда, в которой вы находитесь.

Также возможно/практично совершать изменения ветвления-y и изменения master-y в отдельных коммитах, а затем использовать git format-patch для экспорта фиксирует из ветки как файлы и git am, чтобы втянуть их в мастер.

Опасность здесь заключается в том, что файлы вокруг изменений слишком разные, и в этом случае могут возникнуть конфликты при потяневании коммитов в мастер.

Ответ 5

Как создать временную ветвь?

Что-то вроде:

- oh crap need to do somethning else now
- git checkout -b ResumeLater
- git add .
- git commit
- git checkout ImportantStuff
- ....
- git checkout ResumeLater