仅仅看一下这个问题,简短的回答是:没有简单的方法可以做到这一点。试图只改变一个目录中的更改,这与git存储数据的方式有关。
看一下评论中的讨论,你想要完成的事情(我想)会变得更加清晰,所以也许我们可以把一些东西放在一起。但是要理解,看起来你处于这个位置是因为你和你的同事忽略了可以避免它的git功能。我的意思是 - 如果您希望能够独立地对您的更改采取行动,您为什么要在同一个分支上工作?
好吧,无论如何,你有这样的事情发生
... x -- x -- x <--(master) \ F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)
我假设,至少,您的更改会出现在与您同事的更改不同的提交中。所以 F<n> 代表你的一个提交,更新前端,和 B<n> 表示您的同事的一个提交,更新后端(服务器)。
F<n>
B<n>
如果至少那是真的 - 如果你的提交不依赖于 B 提交,反之亦然 - 然后你会想要一个结束状态
B
F1' -- F2' -- F3' -- F4' <--(frontend) / ... x -- x -- x <--(master) \ B1' -- B2' -- B3' <--(server)
请注意,这仍然涉及重写 B 承诺如此 server 分支机构不必保留更改的冗余副本。当重新整合分支时,这可能很重要,特别是如果重新整合分支 F 提交会产生冲突。
server
F
所以你在这里希望的是 F 提交更改不会与之发生冲突 B 提交更改 - 在您的方案中,至少是合理的。
所以首先要获得一个要重新提交的提交列表。这可以通过作者姓名完成,如果你确实写了所有的 F 承诺,他们写了所有的 B 提交。
git rev-list --author=your_name
或者它可以通过路径完成,如果你100%确定你的提交 - 和 只要 你的提交 - 影响某些路径。所以你可以说
git rev-list -- path/to/frontend/code
或者您可以手动扫描整个日志( git log master..branch 并记下你想要的提交。
git log master..branch
然后
git checkout branch git checkout -b frontend git rebase -i master
这将加载一个带有'todo list'的编辑器,每个提交一个条目 branch 。删除条目 B 从列表中提交,然后保存并退出。您可能必须解决一些冲突,但它应该仅用于您所做的更改。然后你会的
branch
F1' -- F2' -- F3' -- F4' <--(frontend) / ... x -- x -- x <--(master) \ F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)
然后,您需要创建服务器分支。你想确定 不 把它推向前进 master 提示,所以你不能只是改变 master ;但你可以这样做:
master
git checkout branch git checkout -b server git rebase -i $(git merge-base master HEAD)
todo列表出现的时候你删除了 F 提交。如果有任何冲突,这意味着您和您的同事实际上确实有重叠的变化,您必须对这些进行排序;你不会在同事的工作和工作之间看到冲突 master ,因为他的工作在任何之前都待在了 master 变化。
那你有
F1' -- F2' -- F3' -- F4' <--(frontend) / ... x -- x -- x <--(master) | \ | B1' -- B2' -- B3' <--(server) \ F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)
如果你想要,你可以丢弃原件 branch
git branch -D branch