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

时间:2015-01-09 03:41:01

标签: git

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

enter image description here

我认为在将password_rest_and_activation_support分支合并到master之后,我可以创建一个新的" dev"分支,称为" dev-new"或者"开发",但我似乎应该能够以某种方式重用" dev"名字,但我不知道该怎么做。我想删除现有的dev分支并创建一个新的分支?考虑到dev分支也在遥控器上,这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:7)

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

您可以完全删除标签:

git branch -d foo

这会找到带有" foo"在它上面(这个标签贴在一个特定的提交上)并将标签剥离并将其(标签,再次)扔掉。 1

或者,您可以删除标签上的名称并在其上写下新名称:

git branch -m old new

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

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

git branch -f moved 1f0c9447

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

"删除和重新创建","重命名"和"移动"之间的一些重要差异,因为这些标签也是保留历史记录,这些历史记录是在上一次移动之前命名的。如果您完全删除标签,则历史记录也会消失。如果重命名标签,它会保留其历史记录,如果移动标签,它会获取新的历史记录条目,因为您将其从一个提交移动到另一个提交。

当您进行新的提交时,无论您使用何种分支,该分支标签都会自动移动,指向新的提交。此标签移动记录在其历史记录中。

使用哪个选项最有意义(您希望保留或扩充历史记录,还是仅仅希望将其丢弃?)。

(请注意,当您创建新分支时:

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


作为旁注,标签与分支几乎完全相同,除了单词"标记"之外还有两个很大的区别:它们永远不会假设到移动(并且不会自动移动),并且他们不会记录历史记录(因为他们不应该需要一个)。 "远程分支",又名远程跟踪分支,在这些分支之间有点交叉。 移动它们,甚至不通过提交,但它们移动:当你的git联系遥控器并获取新的提交时,它也会启动branch-label移动,并更新远程跟踪分支及其reflog。


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

2 与git一样,它实际上要复杂得多:有两个不同的reflog到期值,一个用于"可达"对象和一个用于"无法到达"对象。 90天默认值是可达对象;无法到达的对象默认为30天;并且可以配置这两个值。

此外,特殊stash引用(由git stash使用)的默认到期时间设置为"从不",以便存储不会过期。

答案 1 :(得分:4)

git checkout master 
git branch -D dev

(强行删除本地dev

git push origin :dev

(删除远程dev

git checkout -b dev

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

git push origin dev

(将新dev推送到原点)

对于某些非破坏性选项,包括分支重命名,请参阅torek's answer