如何在新的请求请求中排除旧提交?

时间:2019-03-13 13:08:20

标签: git github

我为GitHub上的一个开源项目做出了贡献,PR被维护者拒绝。几个月后,我提出了一个PR来解决其他问题,但是这个新的PR也包括了较旧的commits。如何排除旧提交?

以下是旧的PR供参考:https://github.com/spring-projects/spring-boot/pull/15006

新的PR链接:https://github.com/spring-projects/spring-boot/pull/15933

Pull request还包括我从upstream/mastermaster

所做的更改。

我还从维护者那里得到了git条命令:

git checkout master
git fetch upstream
git reset upstream/master --hard

但是我不确定我们在做什么。

2 个答案:

答案 0 :(得分:2)

假设12次提交的历史记录并不重要,我基本上会这样做:

  1. git reset HEAD~12
  2. git stash
  3. git pull upstream master --rebase与上游同步
  4. git stash pop弹出更改并应用到最新版本上
  5. 修复冲突(如有),并摆脱旧的提交
  6. git commit -m "some message"
  7. git push -f origin YOUR_BRANCH

如果您关心提交历史,则可以按照@Tim Biegeleisen的建议进行操作

  1. 从上游获取最新版本
  2. 创建一个新分支
  3. 樱桃按正确的顺序逐一选择要包含的提交
  4. 发送新的PR

答案 1 :(得分:1)

Git基于directed acyclic graph,这意味着您不能在不损害存储库完整性的情况下排除或忽略部分历史记录。

但是,您可以rebase在本地建立PR分支机构,并且可以:

  • 强制推动PR分支(仅在您知道自己在做什么的情况下)
  • 关闭您的PR并使用重新记录的历史记录创建一个新的PR。

要从提交请求分支中排除提交,您可以在本地执行交互式变基:

git checkout -b feature/failure-analyzer
git rebase -i HEAD~10 # Where 10 is the number of commits you want to rebase
git push --set-upstream origin feature/feature-analyzer

让我们根据您的情况进行审查:

  1. 叉库

    您在本地分叉了项目

    * a (HEAD, master, origin/master)
    ...
    
  2. 实现您的新功能

    在您的开发流程中,您犯了一些错误,并且提交时嘈杂。不幸的是,您已经将更改推送到了派生的存储库上。

     * e implementation done (HEAD, master, origin/master)
     * d again oops
     * c oops 
     * b implement feature foo
     * a 
    
  3. 清理工作

    是时候用

    清除提交了
     $ git checkout -b feature/foo
     $ git rebase -i HEAD~5
    

    最终您得到以下历史记录:

     * f implement feature foo (HEAD, feature/foo)
     | * e implementation done (master, origin/master)
     | * d again oops
     | * c oops 
     | * b implement feature foo
     |/
     * a 
    
  4. 执行拉取请求

    现在,您可以进行工作并创建新的拉取请求:

      $ git push --set-upstream origin feature/foo