我想收回dev
分支,但它充满了我们不想保留的东西。我可以让它停止成为现在的任何东西,而不是删除其中的历史记录而是基于分段吗?我想这样设置:
staging __________________________________
dev _________ \______/ \____/
答案 0 :(得分:1)
取决于“基于分期”和“不删除历史”的含义。
如果您的意思是想要将dev
和staging
合并在一起,但实际上最终结果与目前的分段完全相同,那很容易。从存储库的根目录:
git checkout origin/dev -b dev
git merge --no-commit origin/staging
git checkout --theirs .
git commit -m "Revert back to the contents of staging"
git push origin dev
这里的关键是第三个。这是用origin/staging
分支的确切内容覆盖合并的结果。
答案 1 :(得分:0)
分支只是对提交的引用。如果您想摆脱dev
分支,那么在本地存储库中执行
$ git branch -D dev
$ git branch dev staging
第一个命令删除分支“dev”,第二个命令再次创建它,将其分离为“staging”,以便“dev”分支最终指向同一个“staging”提交。
如果您与远程仓库同步,则需要执行强制推送新的“dev”分支:
$ git push --force origin dev
如果您仍然需要保留“dev”包含的历史记录,请将其重命名,而不是删除:
$ git branch -m dev ex-dev
在这种情况下,关于强行推动新“开发”的观点显然仍然存在。
请注意,强制替换远程存储库中的分支会对在此类替换之前克隆repo的人产生重大影响,并将其本地分支基于他现在替换的分支的原始内容。这在文献中被广泛涵盖。例如,请参阅git-rebase
手册。
答案 2 :(得分:0)
你的问题有点令人困惑,因为它说的是“我们不想保留的东西”,但随后“却没有删除历史记录”。为了谨慎起见,我建议:
git checkout staging #switch away from dev branch
git branch -m dev olddev #rename old dev branch so we don't delete history
git checkout -b dev staging # start a new dev branch where staging is currently
如果要在不同的点启动新的dev
分支,只需在最后一个命令中用staging
替换相应的SHA1或分支名称。如果您希望dev
成为没有父母的全新分支,则需要--orphan
选项git checkout
。
完成后,请参阅有关将新dev
推送到上游存储库的kostix说明。