如何从分叉的存储库中仅针对某些文件创建 PR,但对它们进行所有提交?

And*_*ong 3 git pull-request git-cherry-pick git-fork

太长了;博士

\n
    \n
  • 我已经分叉了一个存储库,并对许多文件进行了多次提交,所有这些都在主分支上。
  • \n
  • 现在我想为所选文件的所有提交创建拉取请求,以发送回原始存储库的作者。例如,我想发回一些改进,但不发回我添加的文件。
  • \n
  • 我不在乎所有的提交是否都会被压缩成一个全新的提交。
  • \n
\n

我尝试过的...

\n

我职业生涯的大部分时间都在使用 Perforce,并且仍在习惯 git,所以我想我要么没有意识到我的场景与以下帖子中的场景不匹配,要么我错过了一些隐式步骤对于普通 git 用户来说是显而易见的,但对我来说却不是。

\n\n

我所看到的...

\n

似乎每当我精挑细选时,我最终都会得到一个没有任何更改的分支(不过这是有道理的,因为它们已经致力于掌握,对吗?\xe2\x80\x94那么我如何创建这个“主题分支”我看到有人提到了?)现在我运行了几个我不完全理解的命令(例如git remote add ...),并且还可能将原作者的存储库与我的分叉存储库互换,所以它变得很难说是否因为我弄乱了我的环境而无法正常工作。

\n

打扫干净

\n

@Omer 的回答效果很好。然后我做了一个

\n
git reset --hard HEAD\n
Run Code Online (Sandbox Code Playgroud)\n

清理。原作者合并了 PR,我同步到它:

\n
git remote add upstream git://github.com/<author>/<repo>.git\ngit pull upstream master\n
Run Code Online (Sandbox Code Playgroud)\n

Ome*_*mer 5

在您的存储库中,用于git log找出不属于您的最新提交的提交哈希(您分叉时在 master 中最新的提交)。从现在开始,我将将此哈希称为abcd

通过执行以下操作,在您最新的提交(不是 abcd)上签出并创建一个新分支:

git checkout -b andrew_pr
Run Code Online (Sandbox Code Playgroud)

现在执行混合重置,以便andrew_pr分支将从 分支出来abcd,但您仍然会将之前提交的所有更改作为本地更改:

# Remember to replace "abcd" with the commit hash from the beginning!
git reset --mixed abcd # <---- Replace abcd
Run Code Online (Sandbox Code Playgroud)

现在您的所有更改都是简单的本地更改,您可以使用以下命令执行交互式 git add:

git add -p
Run Code Online (Sandbox Code Playgroud)

这将提示您完成每项更改,并且您可以取消一些更改并保留其他一些更改。当然,您需要保留您希望在 PR 中看到的所有更改。

完成后,提交

git commit -m "Andrew's changes"
Run Code Online (Sandbox Code Playgroud)

并推

git push --set-upstream origin andrew_pr
Run Code Online (Sandbox Code Playgroud)

推送日志应该为您提供一个方便的链接来创建拉取请求。点击该链接并提交您的 PR。