我正在一个新项目中使用Git,该项目有两个并行但目前处于试验阶段的开发分支:
master:导入现有的代码库,再加上一些我通常确信的修改exp1:实验分支#1exp2:实验分支#2
exp1和exp2表示两种非常不同的体系结构方法。在我进一步相处之前,我无法知道哪一个(如果有的话)会起作用。当我在一个分支中取得进展时,我有时会对另一个分支进行有用的编辑,并希望仅合并这些编辑。
将一个开发分支中的选择性更改合并到另一个分支中,同时保留其他所有内容的最佳方法是什么?
我考虑过的方法:
gitmerge——无需提交,然后手动取消大量编辑,我不想在分支之间共享这些编辑。手动将通用文件复制到临时目录中,然后git checkout移动到另一个分支,然后更多地手动将临时目录复制到工作树中。在上述基础上的变化。暂时放弃exp分支,使用另外两个本地存储库进行实验。这使得手动复制文件更加简单。
所有这三种方法都显得乏味且容易出错。我希望有更好的方法;类似于过滤器路径参数,可以使gitmerge更有选择性。
1800 INFORMATION的答案完全正确。不过,作为Git的新手,“使用Git cherry pick”不足以让我在互联网上进行更多挖掘,所以我想我会发布一份更详细的指南,以防其他人也在类似的情况下。
我的用例是希望有选择地将别人的GitHub分支中的更改拉到我自己的分支中。如果您已经有一个具有更改的本地分支,则只需执行步骤2和5-7。
使用要引入的更改创建(如果未创建)本地分支。$git分支mybranch<基本分支>切换到它。$git结帐mybranch从其他人的帐户中删除所需的更改。如果还没有,则需要将它们添加为远程。$git远程添加repo-w-changes<git-url>把树枝上的东西都拔下来。$git pull-repos-w-changes-branch-i-want查看提交日志以查看所需的更改:$git日志切换回要将更改拉入的分支。$git原始付款分支Cherry用哈希一个接一个地选择你的提交。$git cherry-pick-x提交哈希
帽子提示:http://www.sourcemage.org/Git_Guide(存档副本)
1800 INFORMATION的答案完全正确。不过,作为Git的新手,“使用Git cherry pick”不足以让我在互联网上进行更多挖掘,所以我想我会发布一份更详细的指南,以防其他人也在类似的情况下。
我的用例是希望有选择地将别人的GitHub分支中的更改拉到我自己的分支中。如果您已经有一个具有更改的本地分支,则只需执行步骤2和5-7。
使用要引入的更改创建(如果未创建)本地分支。$git分支mybranch<基本分支>切换到它。$git结帐mybranch从其他人的帐户中删除所需的更改。如果还没有,则需要将它们添加为远程。$git远程添加repo-w-changes<git-url>把树枝上的东西都拔下来。$git pull-repos-w-changes-branch-i-want查看提交日志以查看所需的更改:$git日志切换回要将更改拉入的分支。$git原始付款分支Cherry用哈希一个接一个地选择你的提交。$git cherry-pick-x提交哈希
帽子提示:http://www.sourcemage.org/Git_Guide(存档副本)
如果您只需要合并一个特定的目录并保留所有其他内容,同时保留历史记录,那么您可以尝试这样做。。。在实验之前,从主对象创建一个新的目标分支。
下面的步骤假设您有两个分支目标分支和源分支,并且要合并的目录目录位于源分支中。另外,假设您有其他目录(如dir)保留在目标中,您不想更改并保留历史记录。此外,假设要合并的目录中存在合并冲突。
git checkout target-branch
git merge --no-ff --no-commit -X theirs source-branch
# the option "-X theirs", will pick theirs when there is a conflict.
# the options "--no--ff --no-commit" prevent a commit after a merge, and give you an opportunity to fix other directories you want to retain, before you commit this merge.
# the above, would have messed up the other directories that you want to retain.
# so you need to reset them for every directory that you want to retain.
git reset HEAD dir-to-retain
# verify everything and commit.