Git основан на хэшах.Это означает, что целостность сохраняется вместе с каждым коммитом.
Коммит связан с его родителем, поэтому вы часто видите графики журнала Git со стрелками, указывающими на предыдущий коммит (что не кажется интуитивно понятным).В вашем случае у вас может быть такая история:
$ git log --graph --oneline
* f329c58 Fix (HEAD -> master)
* 9d13dc2 Another fix
* 5641ac5 Spelling
* 978e43c Remove private documentation
* 4837aab Fix code
...
* 1bcd23a Initial commit
То, что вы хотите вставить в удаленный репозиторий, это только от 978e43c
.К сожалению, этот коммит имеет родителя 4837aab
.Вы не можете это скрыть и сказать Git, что не надо пихать всю историю раньше.
Решение 1: Перебазировать ветку-сироту
Одно из решений - сделать коммит 978e43c
сиротой, иначе говоря: без родителя.
git checkout --orphan public
git rm -rf . # Clear the working directory
git commit --allow-empty -m "Initial commit"
git rebase master..978e43c
Тогда у вас будет совершенно новая ветка, которая не включает вашу личную документацию.
Это решение работает, но имеет несколько недостатков:
Решение 2. Изменение истории с помощью git filter-branch
Вы можете просто удалить конфиденциальную документацию из всей истории с помощью:
export PRIVATE ./documentation/private-api
git filter-branch -f \
--prune-empty \
--tag-name-filter cat \
--tree-filter 'rm -rf $PRIVATE' \
-- --all