Git:在分支之间移动更改而不更改工作目录

时间:2010-10-07 12:13:36

标签: git cherry-pick git-checkout

用例:每次我想将提交从一个git分支移动到另一个git分支时,我执行以下操作序列:

  1. [提交工作分支]
  2. git checkout branch-to-merge-into
  3. git cherry-pick target-commit
  4. git push
  5. git checkout 工作分支
  6. 唯一的例外情况就是这样 - 每次执行'git checkout'时,git工作目录内容都会被更改(预期)并导致我的IDE(IntelliJ IDEA)执行内部状态更新(因为受监视的文件系统子树)在外部修改)。特别是在大量小提交的情况下,这真的很烦人。

    我看到两种方法:

    1. 执行'群众樱桃选择',即执行大量提交;比如,在工作日结束时,将他们转移到另一个分支;
    2. 拥有第二个本地git存储库并对其执行cherry picks,即每次对工作分支执行实际提交和推送,转到第二个存储库,提取更改并在那里执行cherry pick;
    3. 我不喜欢第一种方法,因为它可能会忘记移动特定的提交。第二个看起来有点......不自然。

      基本上,如果我能说git'将这个提交从名为branchX的分支移动到分支branchX + 1'而没有工作目录更新,那将是完美的。

      问题:是否可以执行上述操作?

3 个答案:

答案 0 :(得分:8)

不,在不更改工作目录的情况下,无法在分支之间移动提交。这是因为你最终会遇到冲突,此时git会暂停,这样你就可以解决冲突。如果您的工作直接不代表该状态,那么您将无法正确解决冲突。

如果你环顾四周,你会在SO上找到很多其他可能解决这个问题的方法,但是潜在的问题听起来就像你的编辑器没有处理从它下面改变的文件。这基本上是使用git的一个事实。因此,要么更新编辑器,要么转移到更适合git工作流程的东西。

答案 1 :(得分:1)

如果您不需要经常合并您的更改,而不是cherry-pick,那么如何在git merge <working branch> <branch to merge into>进行一次{{1}}?这可能相当于樱桃酸洗自上次合并以来的所有变化,如果我没有弄错(用这种方法没有忘记提交的风险)。这样,“编辑问题”就不那么频繁了。

答案 2 :(得分:0)

一个选择是使用git-worktree。例如,您可以:

worktree_dir=$(mktemp -d)
git worktree add "$worktree_dir" branch-to-merge-into
git -C "$worktree_dir" cherry-pick target-commit
git -C "$worktree_dir" push
git worktree remove "$worktree_dir"

只要没有其他工作树还没有branch-to-merge-into签出,这应该可以正常工作,而不会破坏您的本地签出。