Предполагая, что я уже добавил новый удаленный «foo» и вытащил сжатое поддерево с мастером ветки.
$ git remote add -f foo some-repo.git
$ git subtree add --prefix=foo --squash foo master
Из статей, которые я прочитал (здесь и здесь и т. д.), это, по-видимому, распространенный способ переключения ветвей. В этом случае на ветку «бар»:
$ git rm -r foo
rm 'foo/file'.
...
$ git commit -m "Delete foo on branch 'master' to switch to branch 'bar'."
1350 files changed, 144703 deletions(-)
delete mode 100644 foo/file
...
$ git subtree add --prefix=foo --squash foo bar
git fetch foo master
From some-repo.git
* branch master -> FETCH_HEAD
Added dir 'foo'
Но это кажется грязным. Почему бы просто не использовать «git subtree pull», у которого уже есть аргумент ветки (без rm/commit/add)?
$ git subtree pull --prefix=foo --squash foo bar
From some-repo.git
* branch master -> FETCH_HEAD
Merge made by the 'recursive' strategy.
foo/file | 2 ++
... smaller changeset output ...
3 files changed, 41 insertions(+)
...
Когда я протестировал оба локально, я не вижу различий между директориями поддерева (./foo). Почему все рекомендуют способ добавления более сложных наборов изменений и коммитов (удаление и повторное добавление)? Что мне не хватает, может быть, какие-то крайние случаи?