16

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

  1. [提交到工作分支]
  2. git checkout 分支合并到
  3. git cherry-pick 目标提交
  4. git push
  5. git checkout 工作分支

唯一的例外情况很好 - 每次我执行 'git checkout' 时,git 工作目录内容都会更改(预期),这会导致我的 IDE(IntelliJ IDEA)执行内部状态更新(因为受监控的文件系统子树在外部被修改)。这真的很烦人,尤其是在大量小提交的情况下。

我看到了两种方法:

  1. 执行“大量挑选”,即执行大量提交;将他们转移到另一个分支机构,例如在工作日结束时;
  2. 有第二个本地 git 存储库并对其执行樱桃选择,即每次实际提交和推送到工作分支时,转到第二个存储库,拉取更改并在那里执行樱桃选择;

我不喜欢第一种方法,因为它可能会忘记移动特定的提交。第二个看起来有点……不自然。

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

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

4

3 回答 3

9

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

如果您环顾四周,您会在 SO 上找到许多其他可能解决此问题的方法,但根本问题听起来像是您的编辑器无法处理从其下方更改出来的文件。这基本上是使用 git 的事实。因此,要么更新编辑器,要么转向更适合 git 工作流程的东西。

于 2010-10-07T21:29:52.547 回答
1

如果您不需要经常合并您的更改,而不是做,cherry-pick那么偶尔做一次怎么样?如果我没记错的话,这相当于对自上次合并以来的所有更改进行樱桃腌制(使用这种方法没有忘记提交的风险)。这样,“编辑器问题”就不会那么频繁地发生了。git merge <working branch><branch to merge into>

于 2010-10-07T13:01:15.993 回答
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签出,这应该可以在不中断本地结帐的情况下工作。

于 2020-11-13T19:14:27.760 回答