GIT: добавление локальных изменений в не текущую ветку - PullRequest
14 голосов
/ 07 января 2011

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

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

Ответы [ 3 ]

16 голосов
/ 07 января 2011

Вы можете переключать ветви, когда у вас есть локальные изменения, если ваши локальные изменения не конфликтуют с разницей между двумя ветвями.В этом случае вы можете использовать опцию -m или --merge для checkout, чтобы все равно оформить заказ и выполнить слияние между изменениями и изменениями, вызванными переключением ветвей.

git checkout -m other-branch
9 голосов
/ 07 января 2011

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

2 голосов
/ 07 января 2011

Как сказал другой, вы можете использовать stash или checkout --merge.Однако эта опция приведет к изменению временной метки некоторого файла.Если вы работаете над большим проектом, где компиляция может занять много времени (наш текущий проект компилируется с распределенными сборками за полчаса), это может быть неоптимальным.

В этой ситуации вы можете использоватьдругой репозиторий для перемещения коммита в правильную ветку.Сначала вам нужно клонировать ваш текущий репозиторий (это нужно сделать только один раз):

$ git clone /path/to/repository repository.clone
$ cd repository.clone
$ git remote add origin repository.clone
$ git fetch origin

Затем в вашем текущем репозитории вы фиксируете свои изменения:

$ cd /path/to/repository
$ git add path/to/modified/files
$ git commit -m 'Commit message'

В другом репозитории вы извлекаете новый коммит и перемещаете его в правильную ветку:

$ cd ../repository.clone
$ git fetch origin
$ git checkout correct-branch
$ git reset --hard origin/correct-branch
$ git cherry-pick origin/current-branch
$ # resolve conflicts if any, commit with -c option in this case
$ git push origin correct-branch:correct-branch

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

$ cd /path/to/repository
$ git reset HEAD^
$ # edit file and remove modifications moved to other branch

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...