【问题标题】:Git - Moving Pushed Commits to a Different BranchGit - 将推送的提交移动到不同的分支
【发布时间】:2012-01-31 21:01:12
【问题描述】:

我的老板最近决定在我们修改现有应用程序以添加新功能时尝试一个“增加容量”的外包小组。尽管我担心他选择的小组似乎没有很好地沟通,也没有提出足够的问题来真正理解和有效,但我们还是和他们一起去了。

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

此外,我们要求他们在每天下班时推送他们的提交,以便我们可以大致了解他们的工作速度以及(更重要的是)他们的代码有多好。

今天他们第一次推送。五个提交,都在 master 中。我正在尝试弄清楚如何将他们的提交从 master 转移到 TheOutsourcedBranch,而不会丢失他们已经完成的工作(尽管从它的外观来看,无论如何我们都必须把它扔掉)。

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

我知道有很多关于变基的问题(这可能是我需要在这里做的),但我很难弄清楚其中哪些适用于我的具体情况。以防万一,外包团队和我自己是目前唯一真正使用回购的人。

提前致谢!


编辑: 我可能找到了我要找的东西:Move the most recent commit(s) to a new branch with Git

不过,我想检查一下我的理解。在本地,我从 master (TheOutsourcedBranch) 创建了一个分支,其中包含 A-H 的所有内容。然后我将 master 重置回 C。Master 现在将包含 A-C。

假设这是正确的,那对我(本地)来说没问题。但是,我需要做些什么来“强制”远程存储库 (GitHub) 接受我对事情如何发展的本地视图并丢弃其历史版本?

一旦出现这种情况,我想我可以重新处理这个问题,使其更加通用/信息丰富,并去掉一些绒毛——否则我猜它可能是一个很好的删除候选者。

【问题讨论】:

    标签: git github rebase git-rebase


    【解决方案1】:

    获取分支很容易:

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

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

    正是你想要的情况。

    警告:这将改写历史,并且可能会搞砸任何建立在旧主人之上的人。注意以下合并问题。

    不需要或不需要变基。

    (顺便说一句,我建议您要么给他们一个临时存储库,要么让他们使用git send-email,或者使用 GitHub 拉取请求,或者以其他方式阻止他们推送到 master,直到他们做对了。哪个,基于您的摘要,可能需要一段时间。)

    【讨论】:

    • 只是想分享一下这为我解决了同样的问题-但我不得不将第二步更改为git reset --hard $SHA1_OF_C(删除对master的引用);在此之前,我得到了 fatal: Cannot do hard reset with paths. 。可能这是最近版本的 git 的变化?
    • 在我执行 git reset --hard 之后,我的本地存储库落后,因此 git push 失败。
    • 永远不要使用push --force,这是个坏主意。它将严重破坏任何其他已拉取用户的历史记录。更糟糕的是,如果您将 Git 日志集成到其他系统(例如 Redmine、Jira 等)中,那么它可能会严重损坏数据库并且很难清理。
    • @Adam 所说的澄清在stackoverflow.com/questions/40054992/… 上提供
    • 在这种情况下 $SHARED_REPO_REMOTE 是什么?
    【解决方案2】:

    让他们为他们处理的每张工单从同一起点出发,从每一项工作中分出一个分支。让他们将工作合并到 RC 分支。您可以将您的工作合并到 RC 分支。这将允许您经常进行测试。在此处查看我们的工作流程:

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

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

    【讨论】:

    • 这几乎就是我们已经使用的确切工作流程。但这里的问题是他们已经提交并推送了它们——但我需要它们在不同的分支上,而不是在 master 中。
    • 无需强制推送,您可以让他们使用不同的分支名称。分支只是提交的指针。
    猜你喜欢
    • 2015-01-11
    • 2017-02-24
    • 2011-12-24
    • 2013-04-10
    • 2015-10-16
    • 2014-07-17
    • 2013-08-01
    • 2016-01-04
    • 2020-10-08
    相关资源
    最近更新 更多