Git:在不改变工作目录的情况下在分支之间移动更改

18
用例:每次我想将提交从一个git分支移动到另一个分支时,我执行以下操作序列:
  1. [提交到工作分支]
  2. git checkout 要合并到的分支
  3. git cherry-pick 目标提交
  4. git push
  5. git checkout 工作分支
这对于唯一的异常来说效果很好 - 每次执行“git checkout”时,git工作目录内容会发生更改(预期),这会导致我的IDE(IntelliJ IDEA)执行内部状态更新(因为外部修改了受监视的文件系统子树)。 尤其是在大量小提交的情况下,这确实很烦人。
我看到两种方法:
  1. 执行'大规模樱桃挑选',即执行大量提交; 在工作日结束时将它们移到另一个分支中;
  2. 有第二个本地git存储库,并在其上执行cherry pick,即每次实际提交和推送到工作分支时,转到该第二个存储库,拉取更改并在其中执行cherry pick;
我不喜欢第一种方法,因为可能会忘记移动特定提交。 第二种方法看起来有点...不自然。
基本上,如果我可以告诉git'将此提交从名称为branchX的分支移动到分支branchX + 1',而不进行工作目录更新,那将是完美的。
问题:是否可以执行以上操作?

3
选项3:指示您的编辑停止阻碍您的工作。 - rafl
3
你愿意与不会反映外部文件更改的编辑器一起工作吗? - denis.zhdanov
将更改提交并选择到另一个分支,然后恢复当前分支上的工作。 - cmcginty
你认为当前的标题没有反映出实际问题吗?提到的帖子针对另一个问题。 - denis.zhdanov
1
这不是重复项。而且标题很好。 - donquixote
显示剩余2条评论
3个回答

10

不,不可能在不更改工作目录的情况下将提交移动到另一个分支。这是因为您最终会遇到冲突,在此时Git会暂停,以便您可以解决冲突。如果您的工作目录未表示该状态,则无法正确解决冲突。

如果您四处寻找,将会发现SO上有很多其他可能的解决方案,但根本问题似乎是您的编辑器无法处理文件在其下面被更改的情况。这基本上是使用git的事实。因此,要么更新编辑器,要么转移到更适合git工作流程的东西。


2
你说得对,可能会发生冲突。然而,Git仍然会尝试合并,如果出现冲突,它会拒绝并告诉你要检出要合并的分支。这通常可以让你完成大部分操作。听起来像是一个不错的功能请求。 - donquixote

1

如果您不需要经常合并更改,而不是使用cherry-pick,那么从您的<要合并的分支>中偶尔执行一次git merge <工作分支>如何? 如果我没有弄错的话,这将相当于自上次合并以来挑选所有更改(使用此方法不会忘记提交)。 这样,“编辑器问题”就不会经常发生。


谢谢您的建议,但据我所知,合并操作将不仅包括我的提交,还包括分支之间的所有提交。也就是说,它会包含我和同事们执行的所有提交,而我只想将我的目标提交移动到另一个分支。 - denis.zhdanov
@denis.zhdanov:我现在明白你需要什么了。但我不确定如何自动选择你的提交... - Eric O. Lebigot

1

其中一种选择是使用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,这个操作应该不会干扰你本地的检出。

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