如何从特定文件中的一系列提交中挑选更改?

时间:2015-05-22 09:50:10

标签: git

具体来说,我在提交范围内完成了差异,以查看哪些文件已更改:

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

如何实现这一目标?理想情况下,只需在我当前的分支上重播它就是最好的。

2 个答案:

答案 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的某些部分。更好的做法是制作包含应该/将始终应用于一起的工作单元的较小提交,以便将来避免这个问题。