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

3

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

  • 如果我按照现在的方式推送,会发生什么?
  • 如何将分支从 origin 上分离?
  • 也许更简单的方法是创建一个新的分支?
2个回答

5
在回答你的具体问题之前,我想指出你问题中措辞的一个细节:
“我有一个git分支。它被合并并被GitLab删除了。现在发现错误,我想继续在这个分支上工作。”
从概念上讲,更合理的说法应该是:
“现在发现错误,我想修复它。”
由于bug已经合并到主要的代码库中,你开发该代码的那个分支不再相关,这就是为什么通常在合并后删除它的原因。假设你想修复一年前引入的一个bug,你不会试图找到一年前的分支并从那里开始修复,而是从最新的main(或者默认分支)创建一个新的分支,然后去修复bug。从概念上讲,这也是你应该处理这种情况的方式。话虽如此,如果你创建的新分支恰好与以前使用的分支同名,这通常也是可以的。无论该分支名称是一年前还是几分钟前使用的,这都是正确的。如果你确实重新使用同名分支,你可能需要先将它重置为最新的分支,例如 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这样的名称。
鉴于这些信息,现在让我们回答你的问题。您的设置方案是远程分支已经合并并删除,并且您已经重命名了本地分支,但它仍然跟踪旧的上游分支名称。

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

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

如何将该分支与远程分离?

git branch --unset-upstream

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

请注意,在上面的示例命令中,当从switch命令创建新分支时,我使用了--no-track选项,以防止其跟踪origin/main。我不会说创建一个新分支更“简单”,但它可以使您删除旧分支,这很好,因为远程跟踪信息也会消失。在我每天使用的repo中,我通常随时有5-50个本地分支,因此我喜欢以这样的方式命名我的分支,以便通过读取分支名称就可以相当确定哪些未合并的提交位于它们上面。最终,重新使用相同的分支或否取决于个人喜好。在我经常使用Git Flow的常规repo中,我总是创建一个名为user/ttt/merge-master-into-develop的分支,并每次重复使用相同的名称。但对于正常工作,我的分支名称通常是独特和描述性的,与我正在处理的任务相关。

2
在某些情况下,追踪原始提交并在那里修复问题确实是有意义的(通常您会为此创建一个分支)。然后,您可以将该修复合并到每个下游发布版本中。请参见https://devblogs.microsoft.com/oldnewthing/20180323-01/?p=98325。 - torek
如果您正在打补丁到旧版本上,那么@torek说的是正确的。 - TTT

2
如果您愿意,可以继续使用旧分支,但根据我的经验,使用新分支可以使事情更加清晰。请确保在本地更新远程目标分支(可能是主分支),然后将其合并到您的本地分支中。如果压缩提交和/或取决于您的合并策略,事情可能会有点混乱。操作步骤如下:
1. 将一个分支推送到gitlab。 2. 在GitLab中创建并合并MR(删除源分支)到master分支。 3. 在本地分支中执行 git pull origin master 以拉取最新更改并将其合并到您的分支中。 4. 执行 git push -u <branch-name>将此分支推送到GitLab。(有关此语法的详细信息,请参见 https://dev59.com/W3E85IYBdhLWcg3wdDSz#6232535) - 这一步非常重要,因为您将无法再将此分支推送到GitLab。由于它已被删除,它实际上是一个新分支,您必须将其推送到GitLab上游。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接