git 强制签出重复分支?

Vic*_*Vic 3 git version-control branch github

如果我想创建一个新分支,我会这样做:

git checkout -b new-branch
Run Code Online (Sandbox Code Playgroud)

然而,有时这个分支已经存在,例如:

fatal: A branch named 'new-branch' already exists.
Run Code Online (Sandbox Code Playgroud)

有比执行以下操作更简单的方法吗?

git branch -D new-branch
git checkout -b new-branch
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,但它不起作用:

git checkout -b new-branch --force
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 5

你想要的在这里是。如果没有命名现有分支,则会创建新分支,指向当前提交,就像常规的.git checkout -B namenamegit checkout -b

\n\n

如果确实命名了现有分支,则发生的情况是 Git 强制将分支名称重新指向当前提交。这很像一个. 分支名称实际上只是某些 Git 哈希 ID 的人类可读名称,软重置会更改附加到分支名称的哈希 ID,而不会触及索引或工作树。以同样的方式,将更改附加到该名称的 ID,而不触及索引或工作树。name git reset --softgit checkout -B

\n\n

(主要答案到此结束,剩下的只是所有各种成功与失败模式的旁白。)

\n\n

-B和之间有很大的区别--force

\n\n

这里有几个重要的区别需要说明。

\n\n

这种特殊结账的一般形式是:

\n\n

git checkout [-b | -B] name [target-commit-specifier]

\n\n

例如,例如git checkout -b newbr a234567

\n\n

-b在这一点上和之间的区别-B是显而易见的:如果该name部分指定一个已经存在的分支,git checkout -b则立即失败。Git 不必尝试结帐:名称已存在;错误。但是,如果该名称不存在,或者您使用了-B,则还可以尝试更多操作。

\n\n

如果您省略目标说明符,就像我们在上面和原始问题中所做的那样,那么一整类问题就会消失。这种没有目标提交的形式意味着: 将当前提交保留在原处。根本不要碰索引或工作树。 什么都不做是容易的,而且永远不会失败,所以这部分永远不会失败。

\n\n

但是,当您使用表单时,该命令会尝试目标提交。此步骤需要更新索引和/或工作树,这可能会失败,例如:git checkout -B name target-commit-specifiergit checkouta234567

\n\n
error: The following ... files would be overwritten ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,git checkout -bgit checkout -B将中止,并且不会创建或重置任何分支。(另请参阅当当前分支上有未提交的更改时签出另一个分支。)

\n\n

--force选项告诉 Git,如果此签出步骤即将失败,Git 应该继续执行签出,覆盖或删除未安全保存在存储库中的文件。这可能会对索引和/或工作树进行各种更改,并且任何未永久、安全地存储在提交中的文件数据都可能会丢失。因此--force仍然很危险(因为它可能会丢失文件数据),但与-bvs无关-B:它只影响从当前提交(无论它是什么)移动到另一个目标提交的这一步

\n\n

如果 Git 达到此目的\xe2\x80\x94,则目标提交现在将安装为当前提交,并且索引和工作树已更改;或者目标提交当前提交,因此索引和工作树保持不变\xe2\x80\x94那么此时整个事情注定会成功。我们已经检查了 . 的分支名称是否存在-b。Git 现在要做的就是将当前提交的哈希 ID 写入分支名称(例如,name指向a234567)并写入,这样您现在就位于分支。ref: refs/heads/name.git/HEADname

\n


归档时间:

查看次数:

2579 次

最近记录:

8 年,3 月 前