我不确定我是如何陷入这种情况的,但是我要向Github中的repo提交一个pull-request,但我发现pull-request包含了一堆其他提交(15)到另一个与分支无关的文件。
我要保留的文件名为tuition_benefit.json
,我不想要的文件名为employees.json
。如何从我的分支中删除所有与employees.json
相关的提交,以便在pull请求中不考虑它们?
当我创建新分支(employees.json
)来创建这个新文件employees
而不是benefits-query
时,我认为我一定是在与tuition_benefit.json
文件(master
)相关的分支上。
我只在这个新分支上做了3次提交,而在pull请求中指定的其他15个都与另一个文件相关,我从未在这个分支上修改过。
但是我发现pull-request包括一堆其他提交(15)到另一个与分支无关的文件。
这可能表明你在其他分支上打开了分支,或者你有一个本地修改的master
分支并从中分支。
无论哪种方式,您的存储库都是这样的。
A - B - C [origin/master]
\
D - E - F [others]
\
G - H - I [yours]
你可以用git log --decorate --graph
看到这个。
origin/master
是master
分支,因为它看起来在上游。 yours
是您要提交的分支机构。 others
代表你从yours
分支的东西;这可能是你当地修改的master
或另一个分支。只有提交G - H - I
与您的PR相关。
你想要的是你的工作从origin/master
这样分支。
G - H - I [yours]
/
A - B - C [origin/master]
\
D - E - F [others]
您可以使用rebase来重现G - H - I
上的origin/master
。但一个简单的git rebase origin/master
不会这样做。如果你这样做,Git将取代yours
和origin/master
之间的所有内容,包括来自D - E - F
的others
完成任何事情。你需要告诉它忽略D - E - F
。你用git rebase --onto <from> <to>
做到这一点。
git rebase --onto origin/master others yours
这将采取所有提交开始(但不包括)others
和最多(包括)yours
并将其重写到origin/master
。那是G - H - I
。然后你会有这个。
G1 - H1 - I1 [yours]
/
A - B - C [origin/master]
\
D - E - F [others]
请注意,它是G1 - H1 - I1
。这是因为rebase
不会重写历史,它会创造新的历史。这些都是新的提交。当你尝试git push
它将被拒绝,因为这不是yours
的简单更新。你必须git push --force
。
总共...
git fetch
(获得最新的origin/master
)。git checkout yours
git log --decorate --graph
以确定您的工作开始的地方。git rebase --onto origin/master <last commit that's not yours> yours
git push --force