Варианты есть. Я придумал вот такой, довольно экстравагантный:
$ git checkout F1
$ git reset --hard HEAD^ (первые две команды можно заменить на git checkout -B F1 C3)
$ git commit –am “C10”
$ git checkout F3
$ git rebase F1
$ git cherry-pick C4
$ git checkout -B F1 C4
И все ветки будут на своих местах.
Скажете, что я на втором шаге удалил C4... ну да, удалил! ;) Только это ничего не меняет, все будет работать.
Просто нужно помнить что удаляя коммиты и двигая ветки вы в реальности ничего не удаляете (если, конечно, не запустите сборку мусора). Т.е. мы, например, легко можем восстановить утерянные коммиты C8 и C9 если выполним
$ git checkout -b test C9
Ну а если вы уже забыли что именно удалили, то
git reflog
вам в помощь.