【问题标题】:Sending pull request for different issues-Github发送不同问题的拉取请求-Github
【发布时间】:2014-04-20 11:43:13
【问题描述】:

我已经分叉了一个存储库,将其克隆以获取本地副本以处理两个问题。我们称它们为问题 1 和问题 2。首先,我应用了三个提交来解决问题 1 中面临的问题。然后我做了git push origin master 将更改从我的本地 master 分支推送到 origin/master。在此之后,我发送了一个拉取请求来修复问题 1。因此,问题 1 的拉取请求附加了三个提交。

之后为了解决问题 2,我通过 git checkout -b upstream upstream/master 创建了另一个名为 upstream 的分支(我相信这会添加一个远程上游(与原始 URL 相同)并给我一个本地分支 upstreamupstream/master开始)。

现在我做了两个提交来解决问题 2,用 git cherry-pick <SHA> 挑选两个提交(这只是给了我“没有什么可提交”的消息)。在此之后,我做了git push origin upstream 以使用原始内容填充我本地上游分支中的更改。当我向问题 2 发送新的拉取请求时,问题 1 的三个提交与我为解决问题 2 所做的两个提交附加在一起。把所有事情都搞砸了。

(后来我还向origin/master 进行了第 4 次提交,以解决第 1 期中的一个问题,这意味着对第 1 期的拉取请求,现在附加了 4 次提交。)

然后我在本地提交了上游分支地址问题 2。我现在想要什么?我希望能够单独推送此提交并将此提交更新为问题 2 的拉取请求,并且我想将问题 1 中涉及的 4 次提交与问题 2 中涉及的 3 次提交分开。

到目前为止,一切都有些混乱。我是 git 和 github 的新手,有人可以帮我吗?

【问题讨论】:

    标签: git version-control github


    【解决方案1】:

    到目前为止,一切都有些混乱。

    那是因为从你的 fork 发出拉取请求的想法是总是从一个专用分支发出它们,从不来自master(或任何其他分支可以在上游原始 repo 上演进)

    另外,您不需要创建一个 branch 名称 upstream,而是添加一个名为 upstream 的远程,引用您分叉的第一个 repo,以便跟踪 upstream/master(来自原始仓库的master)。

    参见“Pull new updates from original Github repository into forked Github repository”。

    你可以在任何时候做:

    git checkout master
    git pull upstream master
    
    git checkout issue1
    git rebase master
    git push -f origin
    
    git checkout issue2
    git rebase master
    git push -f origin
    

    如果您为 issue1issue2 完成了拉取请求,push -f(重写这些分支的提交)将触发拉取请求的自动更新,而您无需执行任何操作。

    在“Couple tips on pull-requests”查看更多信息。


    我怀疑你的情况是这样的

         (master)
    --o--o--o--x--x--x (issue1)
                      \
                       y--y--y  (upstream)
    

    第一:rename your "upstream" branch

     git branch -m upstream issue2
    

    删除名为“upstream”的远程上游分支(即cancel the associated pull request,一旦我们在本地修复了分支,您将针对该问题重新提出拉取请求)

     git push :upstream
    

    现在,确保您的 master 与来自 upstreammaster 同步(即来自您分叉的原始存储库)。
    确保您没有正在进行的工作(reset --hard 部分会删除它)

    # url of the original repo
    git remote add upstream https://github.com/user/repo
    
    git fetch upstream
    git checkout master
    git reset --hard upstream/master
    

    这将使您的回购看起来像:

              O--O (master, upstream/master)
             /
    --o--o--o--x--x--x (issue1)
                      \
                       y--y--y  (issue2)
    

    现在您需要在master 之上rebase您的两个问题分支,从issue2 开始,以便将其与issue1 分开:

     git checkout issue2
     git rebase --onto master issue1 issue2
    

    然后issue1:

    git issue1
    git rebase master
    

    你得到:

                    x--x--x (issue1)
                   /
    --o--o--o--O--O  (master, upstream/master)
                   \
                    y--y--y  (issue2)
    

    现在,你可以推送这两个分支了:

    git push -f -u origin issue1
    git push -f -u origin issue2
    

    然后从那里发出拉取请求。

    【讨论】:

    • 到目前为止,我还没有一个名为 issue1 或 issue2 的分支。我在 master 本身中处理了 issue1(我现在意识到这不是正确的做法),但我已经完成了。 Issue2 位于名为 upstream 的分支上(我不知道为什么我将分支命名为上游)。当我发送拉取请求时,我不希望 master 上的 issue1 的提交干扰上游的 issue2 的提交。但不知何故,当我从上游分支发送对 issue2 的拉取请求时,它还包括我为 issue1 所做的 4 次提交——这是我不想要的。我该怎么办?
    • @user1955184 没问题:您可以按照应该设置的方式重置所有内容。请参阅我编辑的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 2013-03-09
    • 2014-05-26
    • 2016-12-12
    相关资源
    最近更新 更多