【问题标题】:Send a pull request on GitHub for only latest commit仅在 GitHub 上发送拉取请求以获取最新提交
【发布时间】:2011-07-12 11:28:35
【问题描述】:

我在 github 上创建了一个项目,并成功地对我的本地 master 进行了更改并推送到 github 上的源。我想发送一个拉取请求,但只想包含最后一次提交。 github.com 上的拉取请求 UI 显示了最后 9 次提交,我不知道如何过滤。

我试图了解是否应该创建一个新的本地分支,检查它并以某种方式重置或重新定位到上游?然后通过 id 将我的最后一次提交从我的 master 应用到新的本地分支并将其用于拉取请求?

我正在尝试正确理解概念并找出正确的命令行来做我需要的事情。

【问题讨论】:

  • 如果你对所有其他提交进行拉取请求会发生什么?我认为 git 足够聪明,可以忽略(或传递)它已经引入的提交?
  • 推测上游尚未接受或不想要介入的提交。
  • @jayarjo 例如,我做了其他我不想发送到上游的更改。例如,对 git 的更改会忽略主存储库。使用 git 没有什么简单的。
  • 相关:Git(软件)和 GitHub(Web 服务)中 how the pull requests are different 的一些详细信息

标签: git github pull-request


【解决方案1】:

从最新的提交开始创建一个新分支,该分支也在原始存储库中:

git branch new-branch origin/master
git checkout new-branch

然后使用git cherry-pick 获取您想要拉取请求的单个提交。如果这个提交的分支被称为feature 并且你想要的提交是这个分支中的最新提交,这将是

git cherry-pick feature

假设此补丁应用时没有冲突,您现在有一个分支,您可以为其执行拉取请求。

在第二步中,您现在需要决定如何处理您的 feature 分支。如果您尚未在此分支上发布您的更改,最好的过程可能是将此分支重新基于 new-branch (并删除最后一次提交,如果这不是由 git rebase 自动完成的)。

【讨论】:

  • 我在挑选樱桃后收到此消息。没有添加到提交但存在未跟踪的文件(使用“git add”进行跟踪)。一切都在我的主人身上,但我需要从上游建立我的分支。
  • 如果feature 已经在origin/master 中提交,在cherry-pick 期间不会发生任何事情。新分支应该来自upstream/master(即Kevin Hakanson 的回答)
【解决方案2】:

您基本上需要创建一个新分支并 cherry-pick 您要添加到其中的提交。

注意:在 checkout/cherry-pick 命令之前您可能需要这些

git remote add upstream <git repository>

git remote update

git checkout -b <new-branch-name> upstream/master

git cherry-pick <SHA hash of commit>

git push origin <new-branch-name>

之后,您将在 github 上看到 &lt;new-branch-name&gt; 分支,切换到它并可以提交包含您想要的更改的拉取请求。

【讨论】:

  • 在运行 git checkout -b upstream upstream/master 之前,我还需要 git remote add upstream &lt;git repository&gt;git remote update
  • 这行得通,但不是你应该做的,因为现在你的上游分支和上游/主是不同的,如果合并你的拉取请求不是上游做的第一件事,那么总是不同的.出于这个原因,你应该更喜欢stackoverflow.com/a/5256304/1904815
  • 详细说明:这不是技术问题,而是逻辑问题。当你想对上游做任何事情时(比如从那里合并),你需要添加一个“真正的上游”分支或重置你的上游(为你的拉取请求留下任何本地分支以进行额外的更改)。
  • 为什么我需要一个额外的分支,只是为了为单个更改的代码行创建一个 PR?! github上有人考虑过吗?
  • @JonHanna 不......你为什么要合并一个分支?为什么不能只合并一个提交?
【解决方案3】:

我最终遇到了一种情况,我已经分叉了一个分支,并想向原始项目提交一个拉取请求。

我有:

  • 原始项目
  • forked_project(从 SHA 的原始项目创建:9685770)
  • my_fork(从 SHA 的分叉项目创建:207e29b)
  • 我想提交回原始项目的 fork (SHA: b67627b) 中的提交

为此,我:

  1. 从原始项目分叉的 SHA 创建了一个新分支
  2. 全部从原始项目中提取
  3. cherry 选择了我想作为拉取请求提交的提交
  4. 全部推送到 github

git 命令类似于:

  1. git branch my-feature-request 9685770
  2. git checkout my-feature-request
  3. git 拉https://github.com/original_project/original_project.git
  4. git cherry-pick b67627b
  5. git push origin my-feature-request

然后我选择了 my-feature-request 作为我对原始项目的拉取请求的分支。

【讨论】:

    【解决方案4】:

    这几乎对我有用:

    git checkout -b upstream upstream/master
    
    git cherry-pick <SHA hash of commit>
    
    git push origin upstream
    

    唯一的区别是:

    git push origin upstream:upstream
    

    我需要更改最后一行,以便 git push 在我的 GitHub 存储库中创建上游分支,以便我可以从中进行 PR。

    【讨论】:

      【解决方案5】:

      创建新(临时)分支、cherry-pick 并为该分支创建拉取请求的解决方案并不让我满意。我不想更改我的存储库以提供一组提交,因此我想出了以下替代方案:

      首先为所有感兴趣的提交创建补丁文件:

      git format-patch -1 <sha>
      

      如果感兴趣的提交恰好是最后一个,您可以使用HEAD 而不是&lt;sha&gt;

      现在,您可以将补丁发送给源存储库的维护者,他们可以应用它们:

      git branch new-branch <master or some older commit where the fork diverged>
      git checkout new-branch
      
      git am < <the patch>
      ...
      
      git checkout master
      git merge new-branch
      

      最后,这应该看起来就像一个临时分支被拉取请求合并,但在 fork-repository 中没有那个额外的分支。

      【讨论】:

        【解决方案6】:

        我已经提交了我希望能够作为拉取请求隔离回当前分支的提交。

        所以我检查了一个新分支

        git checkout -b isolated-pull
        

        这就是我的解决方案与@Kevin Hakanson 的不同之处,因为我需要将此分支重置为历史记录中我想与之区别的地方

        git reset --hard [sha-to-diff-by]
        

        然后挑选我要从中创建独立拉取请求的提交

        git cherry-pick [my-isolated-commit-sha]
        

        最后推到遥控器上

        git push origin isolated-pull
        

        并拉取请求 dat shi。

        【讨论】:

        • 谢谢,我真的很讨厌 Git,所有其他答案都在抛出错误,我懒得修复,但你的答案马上就奏效了。非常感谢
        【解决方案7】:

        根据@kevin-hakanson 的回答,我编写了这个小 bash 脚本来简化此过程。如果上游 repo 尚不存在(提示您输入 URL),它将添加上游 repo,然后提示输入要创建的新分支的名称和提交的 tag / SHA,以将其添加到该分支上。它检查您当前所在的分支或提交,然后存储任何更改,以便您可以签出新分支。合并策略保留来自精心挑选的提交的更改。将新分支推送到origin(假定为远程仓库的名称)后,您之前所在的分支或提交将再次签出,并且您之前的更改从存储中弹出。

        if ! git remote | grep -q upstream; then
            read -p "Upstream git repo URL: " upstream
            git remote add upstream $upstream
            git remote update
        fi
        
        read -p "Feature branch name: " feature_branch
        # note: giving "master" is the same as giving the SHA it points to
        read -p "SHA of commit to put on branch: " sha
        
        current_branch=$(git rev-parse --abbrev-ref HEAD)
        if [ "$current_branch" == "HEAD" ]; then
            # detached HEAD; just get the commit SHA
            current_branch=$(git rev-parse --short HEAD)
        fi
        git stash
        git checkout -b $feature_branch upstream/master
        git cherry-pick --strategy=recursive -X theirs $sha
        git push origin $feature_branch
        git checkout $current_branch
        git stash pop
        

        (这在几个简单的测试中对我有用,但我不是 bash 程序员或 git 专家,所以如果我错过了可以更好地自动化的案例,请告诉我!)

        【讨论】:

          猜你喜欢
          • 2011-05-05
          • 1970-01-01
          • 2017-08-30
          • 2019-05-07
          • 1970-01-01
          • 2014-04-15
          • 1970-01-01
          • 2014-05-26
          • 1970-01-01
          相关资源
          最近更新 更多