如果我推送到已删除的分支会发生什么?

Myk*_*iuk 3 git branch git-branch

我有一个 git 分支。被gitlab合并删除了。现在,发现了一个错误,我想继续在这个分支上工作。我重命名了它,但它仍然跟踪已删除的分支(它不知道 gitlab 删除了该分支)。现在我很好奇,在这种情况下我该怎么办?

  • 如果我按原样推进会发生什么?
  • 我怎样才能将分支与原点分离?
  • 也许创建一个新分支更简单?

TTT*_*TTT 5

在回答您的具体问题之前,我想指出您的问题措辞方式的一个小细节:

我有一个 git 分支。它已被 GitLab 合并并删除。现在,发现一个错误,我想继续在这个分支上工作

从概念上讲,我认为这样说更有意义:

现在,发现一个错误,我想修复它

由于错误已经合并到主代码库中,因此您开发该代码的分支不再相关,这就是为什么典型的操作是在合并后将其删除。假设您想修复一年前引入的错误;您不会尝试找到一年前的分支并从那里开始修复,而是从最新的分支main(或任何默认分支的名称)创建一个分支,然后修复错误。从概念上讲,这也是您应该针对这种情况执行的操作。话虽这么说,如果您创建的新分支碰巧与您以前使用的分支同名,通常是可以的。无论分支名称最后一次使用是在一年前还是几分钟前,情况都是如此。如果您确实重复使用相同的命名分支,您可能希望将其重置为最新版本,例如main首先。有多种方法可以做到这一点:

# Get the latest code before any of these
git fetch

# Delete the branch and re-create it:
git switch any-other-branch-name
git branch -d my-fav-branch-name-i-want-to-reuse # delete it
git switch -c my-fav-branch-name-i-want-to-reuse origin/main --no-track # create it again from main

# OR faster

# Just force switch to the same branch name:
git switch -C my-fav-branch-name-i-want-to-reuse origin/main --no-track

# OR faster if already checked out

# Just reset if branch is already checked out
git reset origin/main
Run Code Online (Sandbox Code Playgroud)

这里的要点是分支名称并不神圣,如果您愿意,您可以重复使用分支,或使用其他名称。如果我正在修复错误,我可能更倾向于将我的分支命名为user/ttt/fix-blah-blah-blah.

因此,根据这些信息,现在让我们回答您的问题。您的设置场景是远程分支已被合并和删除,并且您已重命名本地分支,但它仍在跟踪旧的上游分支名称。

如果我按原样推进会发生什么?

如果您这样做git push,它只会在远程设备上重新创建旧的分支名称。如果您没有重命名分支,假设您打算重复使用相同的分支名称,那么这可能没问题,但由于您重命名了分支,所以这是不可取的。将上游设置为新名称会更容易混淆。

我怎样才能将分支与原点分离?

git branch --unset-upstream

也许创建一个新分支更简单?

请注意,在我上面使用的示例命令中,当从该switch命令创建新分支时,我使用了该--no-track选项来阻止它跟踪origin/main. 我不会说创建一个新分支“更简单”,但它使您能够删除旧分支,这很好,因为远程跟踪信息也消失了。在我每天工作的存储库中,我通常在任何时间都有 5-50 个本地分支,所以我喜欢以这样的方式命名我的分支,这样我只需通过阅读就可以很确定它们上面有哪些未合并的提交分支名称。最终,是否再次使用同一个分支,实际上取决于个人喜好。在我使用 Git Flow 的常规存储库之一中,我总是创建一个名为的分支user/ttt/merge-master-into-develop,并在每次执行合并时重复使用相同的名称。但对于常规工作,我的分支名称通常是唯一的并且能够描述我正在执行的任务。

  • 在某些情况下,追踪原始提交并解决那里的问题*确实*有意义(通常您会为此目的创建一个分支)。然后,您可以将该修复合并到每个下游版本中。请参阅 https://devblogs.microsoft.com/oldnewthing/20180323-01/?p=98325 (2认同)