分支/变更没有合并,虽然格里特声称,它是

时间:2013-12-16 09:22:54

标签: git version-control gerrit

每次,我在Gerrit的更改中看到merged状态,我git pull origin,我可以清楚地看到,我的更改/分支实际上并未合并为主。

请查看我的Gerrit的工作流程并告诉我,我做错了什么或我错过了什么:

  1. 创建&结账分支在当地。

    git checkout -b 77-blah

  2. 魔术并评论所有更改。

    git commit -am "changes to 77-blah"

  3. 使用用户界面创建相同的分支,并将其修订版设置为HEAD(此should be automated soon)。

  4. 将更改(特定分支)推送到Gerrit,并使用正确的引用refs:

    git checkout 77-blah

    git push origin HEAD:refs/for/77-blah

  5. 访问网址,Gerrit给了我,审核了我的更改或等待其他人审核。

  6. 再次访问更改的网址,确保Status = Merged

  7. 从Gerrit获取最新更改:

    git checkout master

    git pull origin

  8. 最后一个命令的结果以Already up-to-date结束,如果我不是傻瓜,则意味着我的主人是最新的。在正常的Git的回购中,在这一点上,这将是真的。我的master分支将变为最新,我的最新(77-blah)分支已经合并到它。

    关于Gerrit我正在刷新我的网页,我正在工作(当我在master时)只是发现,该特定分支中引入的所有更改都已消失,整个网站在创建最新分支之前处于状态。 Gerrit 仅声明,我的master是最新的。

    我可以通过执行git branch -d 77-blah并获得结果来确认:

    error: The branch '77-blah' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D 77-blah'.
    

    实际上,我必须在本地手动合并我的最新分支。我错过了什么?

    在Gerrit术语中,改变是合并是什么意思,而实际根本没有合并

2 个答案:

答案 0 :(得分:3)

您几个类似问题中的一个共同主题似乎是您认为应该将您的本地主题分支推送到Gerrit中具有相同名称的分支,并提交更改(即将更改显示为合并)表示Gerrit应将更改合并到master。这是不正确的。

当您推送到refs/for/whatever并稍后提交更改时,提交将在分支whatever上结束。不是master。如果您希望更改以master结尾,则应推送至refs/for/master。因此,Git声称master是最新的是正确的(该分支不受您对77-blah的更改提交的影响)并且Gerrit声称您的更改已合并也是正确的(更改是合并到77-blah)。

本地主题分支与服务器上维护的分支无关。在他们之间建立1:1的关系是不寻常的,也很少需要。实际上,在Gerrit服务器上创建分支(即具有refs/heads/*的推送权限)通常是大多数用户无法执行的特权操作。他们可以做的是推送到refs/for/*上传他们的更改以供审核。在当地,他们可以创建他们想要的任何分支。

答案 1 :(得分:1)

  • 创建一个本地分支:git checkout -b 77-blah origin/master
  • 同时创建远程分支:git push origin 77-blah或通过Gerrit UI。
  • 做出魔法,提交它。
  • 确保本地分支是最新的 - git pull(我推荐git pull --rebase
  • 推送更改 - git push origin 77-blah:refs/for77-blah
  • 将更改提交给远程分支
  • 如果需要,
  • 将更改合并为77-blah的主分支,并且在您的工作流程中该步骤不正确 - git checkout master并使用git pull更新所有本地分支而不是{{1}因为这将由git解决为git pull origin,其中还没有新的变化。所以将77-blah合并到主人 - git pull origin/master
  • 将更改直接推送到远程主控git merge origin/77-blah