git branch重命名是否会影响分支层次结构?

时间:2014-07-25 09:28:17

标签: git github version-control merge

我正在研究由GIT管理的多分支项目。

我们的工作流程目前正是这个:

master
 |-> v1/master
     |-> v1/dev

注意:每个开发人员都会创建v1 / dev的“分支”来实现任务。我们可能会从v1 / dev

中删除多个分支

我们需要添加一个名为v1 / debug的v1 / master的分支。 当前的v1 / dev分支必须支持v1 / debug。

我们的目标是这个新的工作流程:

master
 |-> v1/master
     |-> v1/debug
         |-> v1/dev

注意:每个人都必须继续使用v1 / dev的“fork”来实现单元任务。


我正在寻找添加中间分支v1 / debug的解决方案。

经过一番研究,我会使用git rename branch命令(How do I rename a local Git branch?)。

此命令是否保留分支层次结构?

我可以将v1 / dev重命名为v1 / debug,之后使新的v1 / dev分支whitout在当前v1 / dev分支的当前开发分支结果中出错吗?

开发人员是否能够在v1 / debug中合并重命名的v1 / dev的单元分支结果?

1 个答案:

答案 0 :(得分:12)

首先,不要重命名分支。您可以重命名本地分支,但这仅适用于您。请记住,git是一个分布式系统。人们有权使用与关联的远程跟踪分支不同的名称来命名其本地分支。

例如,v2/debug可能是跟踪远程跟踪分支origin/v1/master的本地分支的名称(我知道,这没有意义,但因为git是一个分布式系统,人们可以将他们想要的东西命名为本地

不要远程重命名分支。这会搞砸一切,因为它不会改变同事的本地存储库。他们的本地分支机构将继续指向相同的远程跟踪分支机构(同名)。

您只需创建一个新分支,并从当前的v1/master点开始。 要创建它并直接切换到它:

git checkout -b v1/debug v1/master

或者只创建它但保留在当前分支上:

git branch v1/debug v1/master

分支是在本地创建的,仍然需要推送给其他人以便能够看到它。

稍后,您唯一需要的是更改合并工作流程。从现在开始,停止将v1/dev直接合并到v1/master,并仅将其合并到v1/debug。 每当代码库准备就绪时,将v1/debug合并到v1/master

您在谈论分支层次结构。实际上,git的分支层次结构是“未知”。它只是你合并的方式(哪个分支到哪一个)最终形成层次结构。

带图片的工作流程示例

  1. 初始状态(仅v1/masterv1/dev)。这里,假设v1/devv1/master之前提交1次。还假设我们目前在分支v1/master上。 Initial state

  2. 运行git branch v1/debug v1/master。这只会创建一个指向v1/master当前指向的同一提交的标签 Create the new branch v1/debug starting from v1/master

  3. 分支v1/dev准备好后,将其合并到v1/debug。运行git checkout v1/debug && git merge v1/dev
    Merge v1/dev into v1/debug

  4. 分支v1/debug准备好后,将其合并到v1/master。运行git checkout v1/master && git merge v1/debug。 从现在开始,你所谓的“层级”开始显得清晰 Merge v1/debug into v1/master

  5. 在分支v1/dev上做一些工作。运行git checkout v1/dev并进行多次提交 Do some work on v1/dev (commits)

  6. 将其合并到v1/debug。运行git checkout v1/debug && git merge v1/dev
    Merge v1/dev into v1/debug

  7. 将其合并到v1/master。运行git checkout v1/master && git merge v1/debug
    Merge v1/debug into v1/master

  8. 现在你有3个明确的分支机构,想要的工作流程!

    请注意,如果您使用git merge --no-ff,图表将只显示为此内容。它使图片中的内容更清晰,所以我假设合并是非快进,这样我们总能看到发生了什么,即使这些合并提交实际上没用。