我想收回dev
分支,但它充满了我们不想保留的东西。我可以让它不再是现在的样子,而是基于分期而不删除其中的历史记录吗?我想这样设置:
staging __________________________________
dev _________ \______/ \____/
我想收回dev
分支,但它充满了我们不想保留的东西。我可以让它不再是现在的样子,而是基于分期而不删除其中的历史记录吗?我想这样设置:
staging __________________________________
dev _________ \______/ \____/
取决于“基于暂存”和“不删除历史记录”的含义。
如果您的意思是您想表现得像合并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
这就是用分支的确切内容覆盖合并结果的原因。
您的问题有点令人困惑,因为它说的是“我们不想保留的东西”,然后是“不删除历史记录”。为了谨慎起见,我建议:
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
替换适当的 SHA1 或分支名称即可。staging
如果你想dev
成为一个没有父母的全新分支,你需要--orphan
选择git checkout
.
dev
完成此操作后,请参阅有关将新内容推送到上游存储库的 kostix 说明。
分支只是对提交的引用。如果您想摆脱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
在这种情况下,强制推动新的“开发”的观点显然仍然成立。
请注意,强制替换远程存储库中的分支对那些在替换之前克隆存储库并将其本地分支基于现在替换分支的原始内容的人产生重大影响。这在文献中被广泛报道。例如参见git-rebase
手册。