Git - 将已推送的提交移动到另一个分支

65

我的老板决定最近尝试外包团队“增加产能”,因为我们正在修改一个现有的应用程序以添加新功能。尽管我担心他选择的团队似乎沟通不畅,也没有问足够的问题来真正理解和有效地工作,但我们还是选择了他们。

我们让他们在我们的Git存储库(托管在GitHub上)上协作。我们专门为他们创建了一个分支(称之为TheOutsourcedBranch),并要求他们在此分支中完成所有工作。

此外,我们要求他们每天结束时推送他们的提交,以便我们可以对他们的工作速度(更重要的是)和代码质量有一个合理的了解。

今天他们第一次推送。五个提交,全部在主分支(master)上。我正在努力想办法将他们的提交从主分支(master)移动到TheOutsourcedBranch分支中,而不会丢失他们所做的工作(尽管看起来我们无论如何都需要放弃它)。

Visual Reference -- Orange dots are their commits, gray are mine.

橙色圆点是他们的提交,灰色圆点是我的提交。

我知道关于变基的问题有很多(可能是我需要做的),但我很难弄清哪些适用于我的特定情况。如果有影响的话,现在外包团队和我自己是唯一真正使用存储库的人。

提前致谢!


编辑: 我可能已经找到了我要找的内容:将最近的提交移动到新分支中

但我想确认我的理解。在本地,我从主分支(master)创建一个分支(TheOutsourcedBranch),其中将包含所有 A-H 的提交。然后,我将主分支(master)重置为 C。主分支(master)现在将包含 A-C。

假设这是正确的,对我来说(在本地)就没问题了。但那么我需要做什么才能“强制”远程存储库(GitHub)接受我本地的查看方式,并且放弃它自己的历史版本呢?

一旦这个问题解决了,我认为我可以重新制定这个问题,使它更加通用/信息量大,并删去一些废话--否则,我猜可能会被删除。

2个回答

71

获取分支很容易:

git branch their-branch master
git reset --hard master $SHA1_OF_C
git push --force $SHARED_REPO_REMOTE

这将重写历史记录。它创建了一个名为their-branch的新分支,该分支与当前主分支等效,然后将您本地的主分支重置为指向一个随机SHA1(...或分支、标签或任何其他内容),最后强制更新远程存储库分支以匹配您的本地分支。

这正是您想要的情况。

需要注意的是:这将重写历史记录,并可能会破坏那些基于旧主分支构建的人的工作。请注意在之后的合并中可能出现的问题。

不需要或不必进行变基。

(顺便说一句,我建议您给他们一个暂存仓库,或让他们使用git send-email,或使用GitHub拉取请求,或以其他方式防止他们在做好之前推送到主分支。根据您的总结,这可能需要一些时间。)


18
我想分享一下,这个方法也解决了我遇到的同样的问题 - 但是第二步我必须改为 git reset --hard $SHA1_OF_C (删除对主分支的引用);在此之前我一直收到“fatal: Cannot do hard reset with paths.”的错误信息。可能这是Git新版本的一个变化? - Chris O'Kelly
1
当我执行 git reset --hard 命令后,我的本地代码库变得落后了,因此 git push 失败了。 - vanowm
1
永远不要使用 push --force,这是一个坏主意。它会严重破坏已经拉取的其他用户的历史记录。更糟糕的是,如果您将Git日志集成到其他系统中,例如Redmine、Jira等,则可能会严重破坏数据库,并且清理起来可能相当困难。 - Adam
@Adam所说的内容在http://stackoverflow.com/questions/40054992/git-move-pushed-commits-to-a-new-branch-rename-branch-instead-of-force-pushin上有解释。 - Jorjon
1
在这个上下文中,$SHARED_REPO_REMOTE是什么? - Tyrel Kostyk

-1
让他们从同一起点为每个工作分支出一个分支,然后将工作合并到RC分支。您可以将自己的工作合并到RC分支。这将允许您经常进行测试。请参阅我们在此处的工作流程:

https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

如果你对此有任何问题,请告诉我。它对我们很有效。


这基本上就是我们已经在使用的确切工作流程。但问题在于他们已经提交并推送了更改--但我需要它们在不同的分支上,而不是在主分支上。 - Anthony Compton
不强制推送,你可以让他们使用不同的分支名称。 分支只是指向提交的指针。 - Adam Dymitruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接