使用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}下显示修改后的文件修改和暂存,准备好提交,而工作目录中不应该有任何修改过的文件,没有任何阶段。一切都应该是最新的。
答案 0 :(得分:2)
在您的代码中,您正在更新任意分支,因此在一般情况下,索引和工作树不应该受到关注。
如果要合并到当前分支,然后(并且仅那么),您将缺少使用合并结果更新索引和工作树的步骤。你可以使用
@repo.checkout_tree(commit_tree)
检查生成的提交中的文件。这还将更新存储库的索引文件以获取该树的内容。然后,您可以更新当前分支以指向合并提交。
您接到@repo.checkout(into_branch)
的电话,但由于您的情况似乎已经在 into_branch
中,所以最多什么都不做。您需要签出合并的结果,@repo.merge_commits()
电话不会触及分支,索引或工作日。