Как с помощью Git перенести некоторые изменения в рабочую копию в другую ветку?
Вопрос
Я работаю в ветке и получил рабочую копию, правда нечистую.Просматривая изменения, которые нужно зафиксировать, я хотел, чтобы несколько исправлений одной строки были зафиксированы в 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, есть такая возможность)