Вы не можете зафиксировать ветку, отличную от текущей; или, другими словами, новый узел, созданный git commit
, всегда является дочерним элементом текущего HEAD.
Иногда я использовал отдельное «промежуточное» репо, чтобы избежать накладных расходов на переключение веток в моей среде разработки:
# Currently working on branch 'foo' in $SOME_DIR/main-repo
# main-repo is a local clone of shared-repo
# Create the staging repo alongside the existing main-repo
cd $SOME_DIR
git clone shared-repo staging-repo
cd staging-repo
git remote add local ../main-repo
# Switch back to main-repo and continue working
cd main-repo
# (Make changes and commit to branch foo ...)
# Switch to the staging repo
cd $SOME_DIR/staging-repo
# Make sure we are up to date with shared repo (*)
git pull
# Merge changes from main-repo
git fetch local
git merge local/foo
# Push changes up to the shared repo
git push
Потенциальная проблема этого подхода заключается в том, что он не позволяет вам проверить результат объединения изменений, внесенных в ветку 'foo', с изменениями, внесенными в shared-repo / master (*)
. В зависимости от характера изменений, это может быть нормально, но в большинстве случаев вы захотите, по крайней мере, сделать быструю проверку работоспособности (например, проверить, что код все еще компилируется, возможно, запустить тесты дыма) перед отправкой в общий репозиторий. 1008 *
Чтобы сделать это, вам нужно:
- build staging-repo - но в этом случае слияние могло бы быть сделано непосредственно в main-repo
- иметь промежуточное репо в отдельной среде сборки из основного репо, т.е.
$SOME_OTHER_DIR/staging-repo
. Это позволило бы построить и / или протестировать промежуточное репо без ущерба для среды основного репо.