合并Rugged中的两个分支

时间:2015-07-06 16:22:34

标签: ruby git libgit2 rugged

使用Rugged,我从master创建一个新分支(让我们称之为new_branch),修改文件并为其创建提交。现在我想将此分支合并到master,将master推送到远程并删除new_branch

在运行下面的代码时,没有修改过的文件,也没有任何分段文件,因为修改后的文件被提交到new_branch

这是我使用的代码:

        from_branch = @repo.head.name
        their_commit = @repo.branches[into_branch].target_id
        our_commit = @repo.branches[from_branch].target_id

        index = @repo.merge_commits(our_commit, their_commit)

        if index.conflicts?
            # conflicts. deal with them
        else
            # no conflicts
            commit_tree = index.write_tree(@repo)
            @repo.checkout(into_branch)

            commit_author = { email: GIT_EMAIL, name: GIT_NAME, time: Time.now }
            Rugged::Commit.create(@repo,
                committer: commit_author,
                message: "Merge #{from_branch} into #{into_branch}",
                parents: [@repo.head.target, our_commit], 
                tree: commit_tree,
                update_ref: @repo.branches[into_branch].canonical_name)

            @repo.push('origin', [@repo.head.name], { credentials: @cred })
            @repo.branches.delete(from_branch)
        end

这可以按预期工作(修改后的文件合并到master,它被推送到远程,新分支被删除),但是一旦完成,我就会在{{1}下显示修改后的文件修改和暂存,准备好提交,而工作目录中不应该有任何修改过的文件,没有任何阶段。一切都应该是最新的。

1 个答案:

答案 0 :(得分:2)

在您的代码中,您正在更新任意分支,因此在一般情况下,索引和工作树不应该受到关注。

如果要合并到当前分支,然后(并且那么),您将缺少使用合并结果更新索引和工作树的步骤。你可以使用

@repo.checkout_tree(commit_tree)

检查生成的提交中的文件。这还将更新存储库的索引文件以获取该树的内容。然后,您可以更新当前分支以指向合并提交。

您接到@repo.checkout(into_branch)的电话,但由于您的情况似乎已经在 into_branch,所以最多什么都不做。您需要签出合并的结果@repo.merge_commits()电话不会触及分支,索引或工作日。