在另一个分支中从diff创建git commit而不切换

问题描述 投票:1回答:2

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

为了把事情放在一个透视图中,让我们假设我正在使用master分支,并将diff表示为文件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分支,我想知道我是否可以以某种方式避免这种情况。

提前致谢!

git branch diff git-commit
2个回答
3
投票

从技术上讲,Git从索引中的任何内容进行新的提交,因此您可以将当前索引(通常与当前提交匹配)替换为与其他提交匹配的其他索引内容,然后调整索引内容并使用它来进行另一个提交。这样做的问题是(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可能会破坏你在该工作树中所做的事情。如果您只是快速做某事,那么删除添加的工作树,这些错误不会咬人。


1
投票

并不是的。您需要切换到其他分支才能应用修补程序/提交。没有办法(在一个本地仓库,以防万一)。

© www.soinside.com 2019 - 2024. All rights reserved.