具体来说,我在提交范围内完成了差异,以查看哪些文件已更改:
git diff COMMIT_X COMMIT_Y --name-only
我得到的结果如下:
/src/foo.php
/src/lib/bar.php
/src/lib/baz.php
/src/meta/test.php
我想采取这些提交中引入的所有更改,但仅针对文件的子集,例如:
/src/foo.php
/src/lib/baz.php
如何实现这一目标?理想情况下,只需在我当前的分支上重播它就是最好的。
答案 0 :(得分:2)
你不能完全这样做。但是,鉴于:
$ git diff COMMIT_X COMMIT_Y --name-only
打印超过两个文件的列表而您只想获取其中两个文件的更改,您可以从以下开始:
$ git diff COMMIT_X COMMIT_Y -- src/foo.php src/lib/baz.php
实际上只会为这两个文件提供更改。您可以将结果传递给git apply
:
$ git diff COMMIT_X COMMIT_Y -- src/foo.php src/lib/baz.php | git apply
获取对当前工作树所做的相同更改(如果它们干净地应用),之后您可以像往常一样添加和提交。 (你必须自己制作类似樱桃选择的提交信息。)
答案 1 :(得分:1)
据我所知,您无法挑选提交的一部分。你要么挑选整个提交,要么不要。
但是,如果(在您的情况下)您知道哪些文件应该更改,哪些文件不能尝试应用您想要的提交,然后还原所有不应该更改为其文件的文件早先的州。
请参阅Reset or revert a specific file to a specific revision using Git?的已接受答案,了解如何在较早的时间点结帐文件。
之后,您可以提交工作区的当前状态(即恢复的文件)。
我没有试过这个但看起来它可以起作用。但是,你以他们不打算的方式滥用git的某些部分。更好的做法是制作包含应该/将始终应用于一起的工作单元的较小提交,以便将来避免这个问题。