重命名本地和远程 Git 存储库的 master 分支

我有分支master追踪远程分支origin/master

我想将它们重命名为本地和远程master-old 。那可能吗?对于跟踪origin/master节点的其他用户(并且总是通过git pull来更新其本地master git pull分支),在重命名远程分支后会发生什么?他们的git pull仍然可以工作还是会抛出错误,导致找不到origin/master了?

然后,进一步,我想创建一个新的master分支(本地和远程)。同样,在我完成此操作之后,如果其他用户执行git pull会发生什么呢?

我想所有这些都会带来很多麻烦。有没有一种干净的方法来得到我想要的东西?还是我应该只保留master并创建一个新的master-new分支,然后继续工作?

答案

与重命名最接近的是删除,然后在远程上重新创建。例如:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

但是,这有很多警告。首先,没有现成的检出会了解重命名 - Git 并不试图跟踪分支重命名。如果新的master还不存在,则 git pull 将出错。是否创建了新的master 。拉将尝试合并mastermaster-old 。因此,除非您与先前签出了存储库的所有人进行合作,否则通常这是一个坏主意。

注意:默认情况下,较新版本的 git 不允许您远程删除 master 分支。您可以通过将receive.denyDeleteCurrent配置值设置为warnignore 远程存储库来覆盖此设置。否则,如果您准备立即创建新的 master,则跳过git push remote :master步骤,并将--force传递给git push remote master步骤。请注意,如果您无法更改遥控器的配置,则将无法完全删除 master 分支!

此警告仅适用于当前分支(通常是master分支);可以删除其他任何分支,然后如上所述重新创建。

假设您当前是master

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. 首先,根据本地存储库中的master提交,在origin存储库中创建一个master-old分支。
  2. 为此新的origin/master-old分支创建一个新的本地分支(它将自动正确地设置为跟踪分支)。
  3. 现在,将您的本地master指向您希望其指向的任何提交。
  4. 最后,在origin存储库中强制更改master以反映新的本地master

(如果您以任何其他方式做到这一点,你需要至少一个步骤,以确保master-old已正确设置跟踪origin/master-old ,张贴在写这篇文章的时候其他的解决方案没有包括。 )

对于 Git v1.7,我认为这已经发生了一些变化。现在,将本地分支机构的跟踪参考更新为新的遥控器非常容易。

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

在删除old-branch-name之前,您可能必须手动切换到new-branch-name old-branch-name

重命名分支有很多方法,但我将着重解决更大的问题: “如何让客户快速前进,而不必在本地弄乱分支”

首先快速看一下: 重命名主分支并允许客户快速前进

这实际上很容易做到;但不要滥用它。整个想法取决于合并提交。因为它们允许快速前进,并将分支的历史链接到另一个。

重命名分支:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

创建新的 “master” 分支:

# create master from new starting point
git branch master <new-master-start-point>

创建合并提交以具有父子历史记录:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

和瞧。

git push origin master

之所以可行,是因为创建merge提交可以将分支快速转发到新修订版。

使用明智的合并提交消息:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

我假设您仍在询问与上一个问题相同的情况。也就是说,“master-new” 将在其历史记录中不包含 “master-old”。* 如果您将 master-new 称为 “master”,则将有效地重写了历史记录。不要紧,你如何进入,其中主不主的前面位置的后裔,只是它是在该州的状态。

其他尝试在主服务器不存在的情况下进行拉取的用户只会使其拉取失败(在远程上没有此类引用),一旦再次存在于新位置,他们的拉取将不得不尝试将其主服务器与新的远程主服务器合并,就像您在存储库中合并了 master-new 和 master-new 一样。鉴于您要在此处执行的操作,合并将产生冲突。 (如果解决了这些问题,并且将结果推回到了存储库中,那么您将处于更糟糕的状态 - 那里的两个版本的历史记录。)

简单地回答您的问题:您应该接受历史上有时会出现错误的信息。没关系它发生在每个人身上。 git.git 存储库中有还原的提交。重要的是,一旦我们发布历史,每个人都可以信任它。

* 如果这样做,则等同于将一些更改推送到 master 上,然后在以前的位置创建一个新分支。没问题。

尝试时选择的答案失败。它引发一个错误: refusing to delete the current branch: refs/heads/master 。我想我会发布对我有用的东西:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

诀窍是在将其推送到远程存储库之前,先签出到占位符。其余内容不言自明,删除 master 分支并将其推送到远程存储库现在应该可以工作。从这里摘录。

好。我的 2 美分。如何在服务器上登录,转到 git 目录并在裸存储库中重命名分支,该如何做?这并不具有与重新上载相同分支相关的所有问题。实际上,“客户端” 将自动识别修改后的名称并更改其远程引用。之后(或之前),您也可以修改分支的本地名称。

关于什么:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

这是我所知道的最简单,最 “可读” 的方式:

使用 - m'移动' 本地分支

git branch -m my_old_branch_name my_new_branch_name

将 “移动” 分支推送到远程,使用 - u 设置 “上游”

git push origin -u my_new_branch_name

(设置 “上游” 实际上是将您的本地分支 “连接” 到远程,以便诸如提取,拉入和推入之类的工作有效)

从远程删除旧分支

git push origin -D <old_name>

(您的本地分支已经消失,因为您在第一步中 “移动” 了它)