在不切换的情况下从另一个分支中的 diff 创建 git 提交

Create git commit from diff in another branch without switching

我想知道是否可以在不切换到此分支的情况下在单独的本地分支中提交表示为差异的更改。

为了更直观地看待事物,让我们假设我正在 master 分支上工作,并且有一个表示为文件 raw.diff 的差异。现在我想将这个差异应用到新的本地分支(或标签)needs_change 并提交更改而不从 master.

切换

我知道在常规流程中我会做这样的事情:

git checkout -b needs_change             # create and switch to local branch
git apply raw.diff                       # apply diff in needs_change
git commit -am "New commit with changes" # commit changes
git checkout master                      # switch back to master branch

然而,在这一系列步骤中,我必须切换到 needs_change 分支,我想知道我是否可以以某种方式避免这种情况。

提前致谢!

不是真的。您需要切换到另一个分支才能应用 patch/commit。没有办法解决这个问题(以防万一,在单个本地存储库上)。

从技术上讲,Git 从 index 中的任何内容进行新提交,因此您可以将当前索引(通常与当前提交匹配)换成一些其他索引内容与其他一些提交匹配,然后调整索引内容并使用它来进行另一次提交。这样做的问题是(a)它真的很难并且(b)换出索引内容意味着无论如何都会覆盖当前的工作树。

因此,在不创建单独克隆的情况下执行此操作的方法是添加另一个 工作树和索引 ,您可以使用 git worktree add,只要您Git 至少是 2.5。1 这实际上添加了一组三个项目:

  • 一个新的工作树,如命令 git worktree add;
  • 所暗示的
  • 一个新索引,为该新工作树提供索引/暂存区;和
  • 一个新的 HEAD 以跟踪 新工作树中的哪个分支。

您现在可以 cd 进入新的工作树,在那里做任何您喜欢的工作,git add 文件将它们复制回该工作树的索引,并且 git commit 在那里使用该工作树的索引来构建一个新的提交,该提交更新在该工作树中检出的分支。

(如果没有git worktree,再克隆一个即可。)


1您的 Git 最好至少为 2.15,因为在 2.15 之前修复了一些重要的错误。最重要的是,在 2.5 到 2.14 中,如果你在一个添加的工作树中工作,然后被打断并离开它 14 天或更长时间,Git 有可能破坏你在那个时候所做的事情工作树。如果你只是快速地做一些事情,然后删除添加的工作树,这些错误就不会咬人了。