git - 我如何有选择地 merge 或从 Git 中的另一个分支中挑选更改?

标签 git git-merge git-cherry-pick git-patch

我在一个新项目中使用 Git,该项目有两个并行的——但目前处于试验阶段——开发分支:

  • master:导入现有代码库加上一些我通常确定的修改
  • exp1:实验分支#1
  • exp2:实验分支 #2

exp1exp2 代表两种截然不同的架构方法。在我走得更远之前,我无法知道哪个(如果有的话)会起作用。当我在一个分支中取得进展时,我有时会进行对另一个分支有用的编辑,并且只想 merge 这些。

将有选择的更改从一个开发分支 merge 到另一个开发分支,同时保留其他一切的最佳方法是什么?

我考虑过的方法:

  1. git merge --no-commit 然后手动取消暂存大量我不想在分支之间共享的编辑。

  2. 将常用文件手动复制到临时目录,然后通过 git checkout 移动到另一个分支,然后再从临时目录手动复制到工作树中。

  3. 上述内容的变体。暂时放弃 exp 分支并使用两个额外的本地存储库进行实验。这使得手动复制文件变得更加简单。

所有这三种方法都显得乏味且容易出错。我希望有更好的方法;类似于过滤器路径参数的东西,可以使 git-merge 更具选择性。

最佳答案

tl;dr

git checkout source_branch -- path/to/file
# resolve conflicts if any
git commit -am '...'

我遇到了与您上面提到的完全相同的问题。但是我发现this在解释答案时更清楚。

总结:

  • 检查要 merge 的分支的路径,

     $ git checkout source_branch -- <paths>...
    
    Hint: It also works without `--` like seen in the linked post.
    
  • 或有选择地 merge 帅哥

     $ git checkout -p source_branch -- <paths>...
    

或者,使用重置,然后使用选项 -p 添加,

    $ git reset <paths>...
    $ git add -p <paths>...
  • 最后提交

     $ git commit -m "'Merge' these changes"
    

关于git - 我如何有选择地 merge 或从 Git 中的另一个分支中挑选更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/449541/

相关文章:

添加相同文件的 Git cherry-pick 提交

git - 没有提交的 git repo 中的未暂存文件

Git 子模块丢失,能找回吗?

git - 如何将其他人的(github)提交到你的树中?

git - 将整个分支重置/恢复到另一个分支状态?

git - 在 git cherry pick 之前是否需要一个新的分支?

Git:如何确定是否存在对提交的引用

git - 取消设置 git 配置

git - 如何避免 git rebase 杀死 merge 提交?

git - git cherry-pick 和 git format-patch 有什么区别?我是 SCSS ?