当origin / dev已经存在时,我可以创建origin / dev分支吗?

时间:2012-06-12 08:01:33

标签: git

我想收回dev分支,但它充满了我们不想保留的东西。我可以让它停止成为现在的任何东西,而不是删除其中的历史记录而是基于分段吗?我想这样设置:

staging __________________________________
dev     _________  \______/    \____/

3 个答案:

答案 0 :(得分:1)

取决于“基于分期”和“不删除历史”的含义。

如果您的意思是想要将devstaging合并在一起,但实际上最终结果与目前的分段完全相同,那很容易。从存储库的根目录:

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说明。