С помощью Git, как я могу зафиксировать некоторые изменения в рабочей копии в другой ветке? - PullRequest
3 голосов
/ 03 декабря 2009

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

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

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

Ответы [ 6 ]

5 голосов
/ 03 декабря 2009

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

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

3 голосов
/ 03 декабря 2009

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

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

2 голосов
/ 03 декабря 2009

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

1 голос
/ 04 декабря 2009

Исходя из предыдущих предложений, это решение, которое я придумал:

Раствор 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

Затем переключитесь на 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, сделать клон текущей ветки master

Если вы не против иметь несколько рабочих копий (я всегда делал это с 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.

1 голос
/ 03 декабря 2009

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

0 голосов
/ 03 декабря 2009

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

...