如何从 fork 的仓库中,只针对特定文件创建 Pull Request(PR),但包括所有提交记录?

3

简述

  • 我fork了一个repo,并在master分支上对许多文件进行了许多提交。
  • 现在我想为“选择”的文件中的所有提交创建一个pull request,以发送回原始repo的作者。例如,我想发送一些改进,但不包括我添加的文件。
  • 如果所有提交都被压缩成一个新的提交,我并不在意。

尝试过的方法...

我大部分时间都使用Perforce,现在还在适应git,所以我认为我要么没有意识到我的场景与以下帖子中的场景不匹配,要么我错过了一些对常规git用户很明显但对我不明显的隐含步骤。

遇到的问题...

似乎每次我都要挑选,最后得到的是没有任何更改的分支(这很有道理,因为它们已经提交到主分支了,对吧?那么我怎么才能创建一个被提到的“话题分支”呢?)然后我运行了几个我不完全理解的命令(例如git remote add ...),同时也可能在原始作者的repo和我的forked repo之间交叉使用它们,所以很难确定事情是否无法工作是因为我弄乱了自己的环境。

清理

@Omer的答案非常好。然后我进行了清理

git reset --hard HEAD

进行清理。原作者合并了 PR,我进行了同步:

git remote add upstream git://github.com/<author>/<repo>.git
git pull upstream master

对于一个特定的选择文件,您想要全部更改还是部分更改? - ElpieKay
对于我的情况,获取所有更改是有效的。(如果我对原始存储库文件进行更改,则值得发送回来。我的自定义将始终在单独的新文件中。) - Andrew Cheong
1个回答

5
在您的存储库中,使用git log来查找最新提交的提交哈希值,该提交不属于您(在您分叉时是主分支上最新的提交)。从现在开始,我将把这个哈希值称为abcd
通过以下方式检出并在您最新的提交上创建一个新的分支(而不是abcd):
git checkout -b andrew_pr

现在执行混合重置,这样andrew_pr分支将从abcd分支出,但您仍将保留先前提交的更改作为本地更改。
# Remember to replace "abcd" with the commit hash from the beginning!
git reset --mixed abcd # <---- Replace abcd

现在所有的修改都只是本地修改,你可以使用以下命令进行交互式 git add:

git add -p

这将指导您通过提示进行每项更改,并且您可以撤销一些更改并保留其他更改。当然,您希望保留所有想在PR中看到的更改。
完成后,请提交(commit)。
git commit -m "Andrew's changes"

并推送

git push --set-upstream origin andrew_pr

推送日志应该会给你一个方便的链接,用来创建拉取请求。跟着那个链接并提交你的 PR。

嗯,上次我做这个的时候,最后一步给了我一个链接,在我的 forked repo 中创建 PR,而不是原始 repo。你有什么想法可能发生了什么? - Andrew Cheong
不确定,链接来自于你的 Git 主机 - 无论是 Github、BitBucket 还是 GitLab 等。这通常是这些服务实现的一个方便函数。你可以访问 Git 主机网站上的原始仓库,并从用户界面创建一个新的 PR。它应该允许你选择从你 fork 的仓库作为源分支。 - Omer Tuchfeld

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