在 git 中,是否可能对特定文件进行 rebase 操作?

16

这类似于关于合并的问题,但我尝试将分支A变基到分支B,而不是将分支B合并到分支A。

可以使用git checkoutgit commit命令在单个文件上进行组合,从而在分支A中实现类似效果,但这对历史记录没有与变基相同的影响。

是否有可能只变基特定的文件,以便所有未来的变基都不需要涉及这些文件,而无需变基所有文件的历史记录?

5个回答

10

有点像。您可以执行交互式变基,并在文本编辑器中显示变基脚本时,将所有操作从“挑选”更改为“编辑”,然后保存并退出。现在会开始重新定位,并且在应用每个提交后停止,这样您就可以:

  1. 删除您不感兴趣的文件中的更改。

    可以通过类似于以下内容的方式完成

    git reset <reference_commit> -- pathname
    

    其中<reference_commit>是包含你不想被合并的文件的提交名称。

  2. 运行git commit --amend -C HEAD来应用这些更改。

  3. 运行git rebase --continue
  4. 重复上述步骤。

每当git rebase应用下一个要合并的提交时,你可能会遇到冲突,而不仅仅是编辑已记录的提交。这与普通的编辑并没有太大区别——你只需要更加关注索引的当前状态。

总之,你想要做的事情,在我看来听起来相当奇怪:重新基于更新的上游代码向前移植本地更改,这意味着如果你的更改无法与更新的上游代码一起工作(否则你为什么还想保留某些文件不更新?),那么重新基于就没有意义——因为你不会重新基于,而是在做其他事情,这可能会在后面给你带来麻烦。


1
您可以使用git checkout [文件路径]将文件恢复到最后一次提交的状态。例如:
git checkout /views/index.html

0

Git 真正的工作方式是基于整个仓库而不是单个文件,因此你会发现在 Git 中没有简单的方法来做到这一点。


这是一个非常好的回答,加1分,但需要改进。你需要说明“还原”和“检出”选项的缺点是什么。 - Jonathan Ben-Avraham
我成功地使用git和PowerShell混合使用来完成它,例如以下代码将获取在两个提交之间添加或更新的文件,排除指定文件扩展名的文件,并将它们检出到当前分支... foreach ($changedFile in (git --no-pager diff --name-only --diff-filter=AMCR sha1 sha2 | ? { ($_ -notlike '.sln' -and $_ -notlike '.yml')})) { git checkout develop $changedFile } - ZenoArrow

0
尝试使用git revert。搜索引入不需要的更改的特定提交哈希,并将其用作参数。git revert然后会生成一个撤消这些确切更改的补丁。
请注意,这意味着您的提交量很小(不修改大量文件),正如它们应该是的。因此,仓库中其他文件的更新将保持不受影响,只有处理该特定提交的文件才会更改。

0

我相信你要找的是 git checkout --patch BRANCH_NAME FILE_PATH

请注意,如果省略了 --patch,文件将被简单地覆盖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接