如果我推送到已删除的分支会怎样?

What happens if I push to a deleted branch?

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

如果你愿意,你可以继续使用那个旧分支,但根据我的经验,使用新分支会使事情变得更干净。

确保在本地更新远程目标分支(我猜可能 master/main),然后将其合并到本地分支。如果根据合并策略压缩提交 and/or,事情会变得有点混乱。它看起来像这样:

  1. 你推一个分支到gitlab
  2. 您在 GitLab 中创建一个 MR(删除源分支)并将其合并到 master
  3. 在您本地的分支中,git pull origin master 拉取最新的更改并将它们合并到您的分支中
  4. git push -u <branch-name> 会将这个分支推送到 GitLab。 (有关此语法的详细信息,请参阅 )
    • 这一步非常重要,因为您将无法再将此分支 git push 添加到 GitLab。由于它被删除了,它实际上是一个新分支,你必须将它向上游推送到 GitLab。

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

I had a git branch. It was merged and deleted by GitLab. Now, an error was found and I want to continue working on this branch.

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

Now, an error was found and I want to fix it.

由于错误已经合并到主代码库中,您开发该代码的分支不再相关,这就是为什么典型的操作是删除它一旦合并。假设您想修复一年前引入的错误;你不会试图找到一个有一年历史的分支并从那里开始修复,而是你会从最新的 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

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

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

What happens if I push the way it is?

如果您git push,它只会在远程重新创建旧的分支名称。如果您没有重命名您的分支,假设您打算重新使用相同的分支名称,这可能会很好,但由于您重命名了您的分支,这是不可取的。将上游设置为新名称会减少混淆。

How can I detach the branch from that origin?

git branch --unset-upstream

Maybe it's just simpler to make a new branch?

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