Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何将现有分支名称重新用作新分支?_Git - Fatal编程技术网

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

Git 如何将现有分支名称重新用作新分支?,git,Git,我的目的是要有一个开发分支,我将创建功能分支。那些被分支的特性将被合并到dev分支中,然后dev分支将被合并回master。我是如何把事情搞砸的,我把我的开发分支留下了,下面是我现在拥有的 我认为,在将password\u rest\u和\u activation\u support分支合并到master之后,我可以创建一个新的“dev”分支,称为“dev new”或“development”,但我似乎应该能够以某种方式重用“dev”名称,但我不确定如何做到这一点。我正在考虑删除现有的dev分

我的目的是要有一个开发分支,我将创建功能分支。那些被分支的特性将被合并到dev分支中,然后dev分支将被合并回master。我是如何把事情搞砸的,我把我的开发分支留下了,下面是我现在拥有的

我认为,在将password\u rest\u和\u activation\u support分支合并到master之后,我可以创建一个新的“dev”分支,称为“dev new”或“development”,但我似乎应该能够以某种方式重用“dev”名称,但我不确定如何做到这一点。我正在考虑删除现有的dev分支并创建一个新分支?考虑到dev分支也位于远程服务器上,正确的方法是什么

git checkout master 
git branch -D dev
(强制删除本地
dev

(删除远程
dev

(创建新的本地
dev
分支)

(将新的
dev
推送到原点)


有关一些非破坏性选项(包括分支重命名),请参见

从根本上讲,分支名称就像小便笺标签一样工作

您可以完全删除标签:

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
相同的提交


分支历史记录保存在每个分支的数据库中。
HEAD也有一个ref日志,
git reflog
向您显示该日志,但是
git reflog show foo
显示历史记录以供参考(通常是分支)
foo

此历史记录通常保存90天。2此外,它完全是本地的:不会在
git clone
git fetch
上复制,也不会使用
git push
推送


作为旁注,标记几乎与分支完全相同,除了“标记”这个词外,还有两个很大的区别:它们不应该移动(也不会自动移动),它们不记录历史(因为它们不应该需要历史记录)。“远程分支”,也称为远程跟踪分支,是这些分支之间的交叉点。您不会移动它们,即使是通过提交也不会,但它们确实会移动:当您的git联系远程服务器并接收新的提交时,它还会接收分支标签移动,并更新远程跟踪分支及其重登录


1您可以在任何时间使用任何标签(大写为
-D
)执行此操作,但如果删除最后一个发现某些提交的标签,这些提交将不可见,您将无法在
gitk中看到它们,例如,所有的
将不再显示,最终(大约一个月后)它们将被垃圾回收

2与git一样,它实际上要复杂得多:有两个不同的reflog到期值,一个用于“可访问”对象,另一个用于“不可访问”对象。90天的默认值适用于可访问对象;无法访问的对象默认为30天;这两个值都可以配置


此外,特殊的
stash
ref(由使用)将其默认过期设置为“从不”,这样stash就不会过期。

“因为这些标签还保留历史记录,在上次移动标签之前提交它们命名的历史记录。如果完全删除标签,历史记录也会消失”--嗯,你能解释一下吗?元数据更改是否有一个单独的图表?“此标签移动记录在其历史记录中。”---请在此图表上。我从来没见过你在说什么。git reflog仅为本地版本2。在gc过程中对其进行清理。记住这一点-保留历史记录(只要它是本地的并且无论如何都会丢失)有那么重要吗?@nPn:not with
git branch
,它只会移动一个分支;而且,
git update ref
没有“移动”选项,因此要使其正常工作,必须复制reflog。不过,一般来说,远程reflogs只在
git remote update
git fetch
上更新。
git branch -m old new
git branch -f moved 1f0c9447
git branch new