首页 > 解决方案 > 使用 git rebase 跳过一些目录或文件

问题描述

我希望您能在 git rebase 命令方面提供帮助。我有一个目录ParentDir,其中包含UISEVER和其他文件。所以,我在工作,develop branch但我想结帐gh-pages并从develop分支获取更新的代码。

我知道如何使用git rebase命令,但它附带了开发分支中的所有目录和文件。

有什么方法可以忽略/跳过其他文件和目录,只需将UI目录从中抓取?谢谢。developgh-pages

标签: git

解决方案


好吧,您问如何获取一组文件,出于某种原因,人们一直在用“如何从特定提交中获取更改”来回答这个问题。

但这仍然会让您从这些提交中对所有文件进行所有更改。根据您的历史,您可能会也可能无法做到这一点;但只有在非常特定的情况下才是最简单的方法。

更具体地说,cherry-pick将是一个好的解决方案的案例是rebase可以运作良好的案例的一个子集。由于您说您知道rebase并且无法以这种方式获得所需的结果,因此我假设您遇到的情况既不是rebase也不cherry-pick是一个好的选择[1]。

如果您想要的更改与同一提交中的其他更改混合在一起,那么对提交进行操作的命令(如 rebase 或 cherry-pick)将不会执行您想要的操作。在这种情况下,有几种非常不同的方法,这是否有意义取决于你真正想要完成的事情。

从字面上看你问的最直接的方法是

git checkout gh-branch
git checkout develop -- ./UI

(如果更改包括删除,您可能需要一个额外的步骤,例如

git checkout gh-branch
rm -r ./UI
git checkout develop -- ./UI

删除被“看到”。)

然后你的工作树处于你想要的状态,你可以提交它。但这将再次使您的分支与开发发生冲突,并且由于它不是基于精确的重复提交,因此 git 以后将很难帮助自动解决。


[1] 我会指出,以防万一,解决问题的最通用方法rebase是进行交互式 rebase。您会将提交develop重新定位 gh-branch.

git checkout --detach develop
git rebase -i gh-branch
# edit the todo list to `pick` the commits with the changes you want

# and once the rebase is done, update gh-branch in any of a number of ways; one of the "safest" being
git tag gh-branch-temp
git checkout gh-branch
git merge --ff-only gh-branch-temp
git tag -d gh-branch-temp

如果您还没有尝试过这种方法,您可以研究一下,因为它是一种容易/不易出错的方法,效果与cherry-pick;相同。cherry-pick这是我认为被过度推荐的主要原因。

但请注意 - 如果您尝试“好像”在分支上完成 UI 工作一样工作,那么 rebase 和 cherry-pick 都不会让您到达那里;分支develop保持原样。仍然存在的更改develop将与您的分支发生冲突(尽管 git 会在冲突出现时自动解决冲突,但它可能无法做到)。


推荐阅读