我有一个名为foo
. M1
我对它进行了一些修改foo
并暂存。然后我通过从 中检出它在工作树中恢复它,并对它HEAD
进行另一次修改M2
。现在我想在提交之前合并这两个修改。如何才能做到这一点?谢谢!
(我知道分支是用于这种工作的。但我想知道是否有办法将暂存文件与工作树中的修改版本合并。)
我有一个名为foo
. M1
我对它进行了一些修改foo
并暂存。然后我通过从 中检出它在工作树中恢复它,并对它HEAD
进行另一次修改M2
。现在我想在提交之前合并这两个修改。如何才能做到这一点?谢谢!
(我知道分支是用于这种工作的。但我想知道是否有办法将暂存文件与工作树中的修改版本合并。)
最好的方法是存储:
# modify file
git stash -u
# modify file in a different way
git add -A && git commit -m "M2"
git stash pop
# resolve conflicts
git add -A && git commit --amend -m "M1 and M2 merged"
没有要处理的分支。
最明显的解决方案是创建两个提交,然后合并它们。这是相当安全的,因为一旦您将更改放入两个不同的提交中,就很难丢失它们,如果合并没有按照您的意愿进行,您可以丢弃合并提交并重试。
对于第一次提交,您已经进行了更改,所以git commit
应该足够了。
其次,您的工作副本中有一个状态,表示对原始HEAD
. 但是现在你已经完成了那个提交,有一个介入;HEAD
是索引中的内容,因此看起来您的工作副本恢复了这些更改。为了解决这个问题,我们需要重置我们的HEAD
点,而不改变工作副本中的内容。
在此之前,让我们保存一个指向当前HEAD
:的指针git branch was-in-index
。现在我们可以使用 重置为之前HEAD
的(父级HEAD
)git reset HEAD^
,并添加并提交我们的更改git add some stuff; git commit
(或者git commit -a
,如果您想要所有更改)。
现在我们有两个分支;我们当前的,其中包含来自工作副本的更改,并且was-in-index
,其中包含索引中的更改。现在您可以根据需要合并它们;git merge was-in-index
, git rebase was-in-index
, 或者你有什么。完成后可以删除was-in-index
分支。
最简单的方法是 4 步过程。
git commit
对 foo 的分阶段更改。git add foo
,将 M2 放在暂存区。git commit --amend
,将 M1 与 M2 合并。这并不完全是您所要求的,但我相信这是获得您所要求的结果的最有效方式。