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