Подтвердить выбор изменений в другой ветви, а затем возобновить работу в текущей ветви? - PullRequest
13 голосов
/ 06 октября 2010

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 07 октября 2010
  1. Подтвердите изменения, которые вы хотите в master в вашей текущей ветке.
  2. Храните оставшиеся изменения
  3. Переключитесь на ветку master и используйте git cherry-pick, чтобы переместить изменения в master
  4. Вернитесь к своей перьевой ветви и rebase (необязательно)
  5. Снятие изменений оригинальной функции
2 голосов
/ 07 октября 2010

Попробуйте вернуться к ветви 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.
2 голосов
/ 06 октября 2010

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

1 голос
/ 06 октября 2010

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

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

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

0 голосов
/ 06 октября 2010

А как насчет создания временной ветки?

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

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