我如何从一个分叉的回购中制作一个 PR,只针对某些文件,但对它们进行所有提交?
How do I make a PR from a forked repo, for only certain files, but all commits on them?
tl;博士
- 我已经 fork 了一个 repo 并对许多文件进行了多次提交,所有这些都在 master 分支上。
- 现在我想为 提交的 select 文件创建拉取请求,以发送回原始文件回购的作者。例如,我想发回一些改进,而不是我添加的文件。
- 我不在乎是否所有提交都被压缩成一个全新的提交。
我试过的...
我职业生涯的大部分时间都在使用 Perforce,并且仍在习惯 git,所以我想我要么没有意识到我的场景与以下帖子中的场景不符,要么我'我缺少一些隐式步骤,这些步骤对普通 git 用户来说是显而易见的,但对我来说却不是。
- Pull-Request for only certain files/commits
- Using GIT, how can I selectively merge changes from one commit on another 'fork'?
- Cherry picking changes to specific files from a range of commits
- How to git-cherry-pick only changes to certain files?
- How to cherry-pick multiple commits
我看到了什么...
似乎每当我精心挑选时,我都会得到一个没有任何变化的分支(不过这是有道理的,因为他们已经致力于掌握,对吧?——那么我该如何创建这个“主题分支”我看到有人提到了?)现在我有 运行 几个我不完全理解的命令(例如 git remote add ...
)并且还可能在其中交换原作者的回购和我的分叉回购,所以它变得越来越难判断是否因为我弄乱了我的环境而无法正常工作。
清理
@Omer 的回答很有效。然后我做了一个
git reset --hard HEAD
清理。原作者合并了PR,我同步到:
git remote add upstream git://github.com/<author>/<repo>.git
git pull upstream master
在您的存储库中,使用 git log
找出不属于您的最新提交的提交哈希(您分叉时 master 中最新的提交)。从现在开始,我将把这个散列称为 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 添加使用:
git add -p
这将通过提示引导您完成每项更改,您可以取消一些更改并保留其他一些更改。当然,您会希望保留所有希望在 PR 中看到的更改。
完成后,提交
git commit -m "Andrew's changes"
然后推送
git push --set-upstream origin andrew_pr
推送日志应该可以让您方便 link 创建拉取请求。按照 link 并提交您的 PR。
tl;博士
- 我已经 fork 了一个 repo 并对许多文件进行了多次提交,所有这些都在 master 分支上。
- 现在我想为 提交的 select 文件创建拉取请求,以发送回原始文件回购的作者。例如,我想发回一些改进,而不是我添加的文件。
- 我不在乎是否所有提交都被压缩成一个全新的提交。
我试过的...
我职业生涯的大部分时间都在使用 Perforce,并且仍在习惯 git,所以我想我要么没有意识到我的场景与以下帖子中的场景不符,要么我'我缺少一些隐式步骤,这些步骤对普通 git 用户来说是显而易见的,但对我来说却不是。
- Pull-Request for only certain files/commits
- Using GIT, how can I selectively merge changes from one commit on another 'fork'?
- Cherry picking changes to specific files from a range of commits
- How to git-cherry-pick only changes to certain files?
- How to cherry-pick multiple commits
我看到了什么...
似乎每当我精心挑选时,我都会得到一个没有任何变化的分支(不过这是有道理的,因为他们已经致力于掌握,对吧?——那么我该如何创建这个“主题分支”我看到有人提到了?)现在我有 运行 几个我不完全理解的命令(例如 git remote add ...
)并且还可能在其中交换原作者的回购和我的分叉回购,所以它变得越来越难判断是否因为我弄乱了我的环境而无法正常工作。
清理
@Omer 的回答很有效。然后我做了一个
git reset --hard HEAD
清理。原作者合并了PR,我同步到:
git remote add upstream git://github.com/<author>/<repo>.git
git pull upstream master
在您的存储库中,使用 git log
找出不属于您的最新提交的提交哈希(您分叉时 master 中最新的提交)。从现在开始,我将把这个散列称为 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 添加使用:
git add -p
这将通过提示引导您完成每项更改,您可以取消一些更改并保留其他一些更改。当然,您会希望保留所有希望在 PR 中看到的更改。
完成后,提交
git commit -m "Andrew's changes"
然后推送
git push --set-upstream origin andrew_pr
推送日志应该可以让您方便 link 创建拉取请求。按照 link 并提交您的 PR。