如何重用现有分支名称作为新分支?

How do I reuse an existing branch name as a new branch?

我的意图是有一个开发分支,我将创建功能分支。那些分支的功能将被合并到 dev 分支,然后 dev 分支将被合并回 master。一些我如何设法搞砸了,我留下了我的开发分支,所以这就是我现在拥有的。

我认为在将 password_rest_and_activation_support 分支合并到 master 后,我可以创建一个新的 "dev" 分支,称为 "dev-new" 或 "development",但我似乎应该能够以某种方式重用 "dev" 名称,但我不确定该怎么做。我在考虑删除现有的开发分支并创建一个新分支?鉴于 dev 分支也在远程上,正确的方法是什么?

git checkout master 
git branch -D dev

(强行删除本地dev)

git push origin :dev

(删除远程dev)

git checkout -b dev

(创建一个新的本地 dev 分支)

git push origin dev

(将新的 dev 推送到原点)

对于一些非破坏性选项,包括分支重命名,请参阅

从根本上说,分支名称就像小便签标签一样。

您可以完全删除标签:

git branch -d foo

这会找到上面带有单词 "foo" 的标签(这个标签贴在一个特定的提交上)并撕下该标签并将其扔掉(再次是标签)。 1

或者,您可以擦掉标签上的名字并在上面写一个新名字:

git branch -m old new

标签仍然停留在同一个提交上,但现在有了不同的名称。

或者,您可以将标签从一个提交移动到另一个:

git branch -f moved 1f0c9447

此处的最后一个参数是原始提交 SHA-1,但您可以使用任何可以定位某个提交的内容,例如另一个分支名称。

"delete and recreate"、"rename" 和 "move" 之间存在一些重要差异,因为这些标签还保留历史记录,其中提交他们在上次搬家之前命名。如果您完全删除标签,历史记录也会消失。如果你重命名一个标签,它会保留它的历史,如果你移动一个标签,它会获得一个新的历史条目,因为你将它从一个提交移到了另一个。

当您进行新提交时,无论您在哪个分支上,该分支标签都会自动移动以指向新提交。此标签移动已记录在其历史记录中。

使用最有意义的选项(您是要保留还是扩充历史记录,还是只想将其丢弃?)。

(注意新建分支时:

git branch new

您可以提供原始提交 SHA-1,或任何可以找到提交的东西。因此 git branch new existing 将使新分支 new 指向与 existing 相同的提交。)


分支历史保存在每个分支的 "reflog" 中。 HEAD 也有一个参考日志,git reflog 显示了那个,但是 git reflog show foo 显示了参考历史(通常是分支)foo.

此历史记录通常保留 90 天。2 此外,它纯粹是本地的:它不会在 git clonegit fetch 上被复制,也不会用 git push.

推送

作为旁注,标签几乎与分支完全相同,除了单词 "tag" 之外还有两个很大的区别:它们永远不会 应该 移动(并且不会自动移动),并且它们不记录历史(因为它们不应该需要)。 "Remote branches",又名远程跟踪分支,是它们之间的交叉点。 不移动它们,即使提交也不行,但它们确实移动:当你的git联系遥控器并选择时新的提交,它也会选择分支标签移动,并更新你的远程跟踪分支和他们的 reflogs。


1您可以随时使用任何标签(使用 -D,大写)执行此操作,但是如果您删除 last 找到一些提交的标签,这些提交变得不可见——例如,你不会再在 gitk --all 显示中看到它们——最终(大约一个月后)它们将被垃圾收集.

2 与 git 一样,它实际上比这复杂得多:有两种不同的 reflog 过期值,一种用于 "reachable" 对象一个用于 "unreachable" 个对象。 90 天默认值适用于可达对象;无法访问的对象默认为 30 天;并且两个值都可以配置。

此外,特殊的 stash ref(由 git stash 使用)的默认过期设置为 "never",因此存储不会过期。