【发布时间】:2021-01-26 18:23:11
【问题描述】:
假设我在 git repo 'master' 和 'feature' 中有两个分支。这两个分支在某个点上已经分道扬镳了。现在我想从'feature'分支上的提交'0123456789abcdef'中对'script.py'进行确切的更改,并将这些更改应用于'master'分支头部的'script.py'的相应行。git cherry-pick 对我来说似乎是显而易见的选择,但它并没有完全符合我的要求。问题是git cherry-pick 使“master”分支保持最新,“feature”上的所有更改都提交到“0123456789abcdef”。
我不希望应用所有这些更改。我只想要在提交 '0123456789abcdef' 中发生的变化——仅此而已。我认为,如果我能以某种方式利用共同历史来确定相对于来自“功能”的提交,相应的更改行可能在“主”中移动的位置,而不是在“主”上应用所有这些先前的更改,那将是明智的。
我怎样才能做到这一点?当然,我可以从 git diff 的输出中复制并粘贴它,但对 Git 了解得有些清楚,在我看来,它必须有更好的方法来做到这一点,而我还不知道。
编辑:看来上述行为一定是由于我无法再重现的错误造成的。基于@torek's answer,我重复了正确的樱桃采摘过程,它产生了我想要的结果。
【问题讨论】:
-
Git 不处理“文件”或“更改”。它处理 commits,这是项目整个状态的完整快照。如果您喜欢某个提交中某个文件的 state,并且希望它成为当前分支头部文件的 state,请使用 @987654325 @ 将提交中的文件提取到您的工作树中并提交该状态。
-
就像你说的,你可以在两次提交 scripts.py 文件之间使用
git diff,并将差异输出到一个文件,然后使用git apply应用它。 -
谢谢@matt,我知道了。但是,作为人类,我们通常能够以比计算机更少限制的词汇甚至更抽象的术语相互交谈,并且仍然可以相互理解...... Git 可以做到
git diff和我调用“更改”的输出。这些是我感兴趣的。我不喜欢存储库的任何特定状态。我喜欢我的存储库的两种状态之间的特殊差异,我希望将这种(相对)差异应用到我的存储库完全不同的状态之上。 -
另外@matt,Git 确实处理“文件”,例如我可以
git checkout [commit] -- [a particular file],所以在上下文中讨论文件也很有意义Git 也是如此。现在我们可以继续“解析”人类的实际问题,并避免像@rootkonda 那样讲题外话吗? -
感谢@rootkonda,这是一个有用的指针。但是,由于不同的历史记录,这些更改不适用于“master”上文件的同一行,就像源提交中一样。我希望 Git 足够聪明,可以使用历史记录来确定相应行现在在“master”文件中的移动位置。
标签: git patch cherry-pick