Как с помощью Git перенести некоторые изменения в рабочую копию в другую ветку?

StackOverflow https://stackoverflow.com/questions/1840898

  •  12-09-2019
  •  | 
  •  

Вопрос

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

В этом случае, используя git stash на самом деле это не помогает, потому что в моей рабочей копии есть много других изменений, которые еще не объединены с мастером.

Есть ли более эффективный способ исправить эту ситуацию?(например.сделать коммит и переместить его родителя?)

Это было полезно?

Решение 5

Основываясь на предыдущих предложениях, я придумал следующее решение:

Решение 1 с выбором вишни

Просто зафиксируйте единственное изменение в самой ветке:

git add --patch <files>      # record every change to move to master
git commit

Перейдите к мастеру и выберите вишню

git stash
git checkout master
git cherry-pick <commitid>

Вернувшись в ветку, его можно перебазировать.

git checkout <branch>
git rebase master

Для каждого дублирующегося коммита вам будет предложено ввести:

git rebase --skip

Дубликаты коммитов отфильтровываются из набора патчей в ветке, и история очищается.Финал git merge в конце концов, все еще можно перемотать вперед.

Решение 2, без необходимости предварительной фиксации в ветке

Сначала извлеките все, чтобы перейти к мастеру:

git add --patch <files>      # record every change to move to master

Затем переключитесь на мастер для фиксации:

git stash --keep-index       # clear the working copy only
git checkout master -m       # merge the index.
git commit

А вернувшись в ветку, его можно напрямую перенести на подсказку мастера:

git checkout <branchname>
git rebase master            # move to branch start to the tip of master.
git stash apply              # restore working copy, auto merges the changes

Решение 3. Создайте клон текущей основной ветки.

Если вы не против иметь несколько рабочих копий (на самом деле я всегда так делал с SVN), есть третье решение:

mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master  # fetch remote master to local remotes/origin/master
git checkout -t origin/master           # make new "master" branch, link to remote, checkout.

git commit
git push origin master                  # inject the change in the original repository.

Настройка клонирования здесь выполняется вручную, потому что git clone всегда клонирует текущую активную ветку.


Для более сложных ситуаций всегда имеется дополнительная защитная защита с git diff > to-master.patch и git apply to-master.patch.Это дает вам больше свободы сбрасывать все и пытаться снова, пока все не получится правильно.

В этой ситуации мы имеем дело с однострочным исправлением в файле, который существует в обеих ветвях.Это не приведет к конфликтам слияния и позволит использовать некоторые ярлыки, например checkout -m.

Другие советы

Вы можете использовать git add -i использовать интерактивный режим.Там вы можете указать, что зафиксировать, а что пропустить.

Таким образом, вы можете зафиксировать свои однострочники как отдельные коммиты.Используя git cherry-pick вы можете объединить их со своим мастером позже.

Использовать git add -i выберите, что вы хотите закоммитить в эту ветку, затем измените на master и зафиксируйте остальное.

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

git add -p переведет вас прямо в режим исправления, чтобы следовать процессу, который правильно рекомендует @arkaitz-jimenez.

Я не знаю, хотите ли вы этого, но я бы просто проверил другую ветку (которая не теряет незафиксированные изменения), а затем выборочно проверил бы те изменения, которые вы хотите зафиксировать.

Вместо использования git add -i / git add -p вы также можете использовать интерактивный режим добавления git gui
(вероятно, другие графические интерфейсы git, которые включают в себя инструмент фиксации, например,QGit, есть такая возможность)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top