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)
你想要的在这里是。如果没有命名现有分支,则会创建新分支,指向当前提交,就像常规的.git checkout -B namenamegit checkout -b
如果确实命名了现有分支,则发生的情况是 Git 强制将分支名称重新指向当前提交。这很像一个. 分支名称实际上只是某些 Git 哈希 ID 的人类可读名称,软重置会更改附加到分支名称的哈希 ID,而不会触及索引或工作树。以同样的方式,将更改附加到该名称的 ID,而不触及索引或工作树。name git reset --softgit checkout -B
(主要答案到此结束,剩下的只是所有各种成功与失败模式的旁白。)
\n\n-B和之间有很大的区别--force这里有几个重要的区别需要说明。
\n\n这种特殊结账的一般形式是:
\n\ngit checkout [-b | -B] name [target-commit-specifier]
例如,例如git checkout -b newbr a234567。
-b在这一点上和之间的区别-B是显而易见的:如果该name部分指定一个已经存在的分支,git checkout -b则立即失败。Git 不必尝试结帐:名称已存在;错误。但是,如果该名称不存在,或者您使用了-B,则还可以尝试更多操作。
如果您省略目标说明符,就像我们在上面和原始问题中所做的那样,那么一整类问题就会消失。这种没有目标提交的形式意味着: 将当前提交保留在原处。根本不要碰索引或工作树。 什么都不做是容易的,而且永远不会失败,所以这部分永远不会失败。
\n\n但是,当您使用表单时,该命令会尝试目标提交。此步骤需要更新索引和/或工作树,这可能会失败,例如:git checkout -B name target-commit-specifiergit checkouta234567
error: The following ... files would be overwritten ...\nRun Code Online (Sandbox Code Playgroud)\n\n在这种情况下,git checkout -b或git checkout -B将中止,并且不会创建或重置任何分支。(另请参阅当当前分支上有未提交的更改时签出另一个分支。)
该--force选项告诉 Git,如果此签出步骤即将失败,Git 应该继续执行签出,覆盖或删除未安全保存在存储库中的文件。这可能会对索引和/或工作树进行各种更改,并且任何未永久、安全地存储在提交中的文件数据都可能会丢失。因此--force仍然很危险(因为它可能会丢失文件数据),但与-bvs无关-B:它只影响从当前提交(无论它是什么)移动到另一个目标提交的这一步。
如果 Git 达到此目的\xe2\x80\x94,则目标提交现在将安装为当前提交,并且索引和工作树已更改;或者目标提交是当前提交,因此索引和工作树保持不变\xe2\x80\x94那么此时整个事情注定会成功。我们已经检查了 . 的分支名称是否存在-b。Git 现在要做的就是将当前提交的哈希 ID 写入分支名称(例如,name指向a234567)并写入,这样您现在就位于分支。ref: refs/heads/name.git/HEADname
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |