1

我有一个名为foo. M1我对它进行了一些修改foo并暂存。然后我通过从 中检出它在工作树中恢复它,并对它HEAD进行另一次修改M2。现在我想在提交之前合并这两个修改。如何才能做到这一点?谢谢!

(我知道分支是用于这种工作的。但我想知道是否有办法将暂存文件与工作树中的修改版本合并。)

4

3 回答 3

2

最好的方法是存储:

# 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"

没有要处理的分支。

于 2012-10-31T06:12:49.273 回答
1

最明显的解决方案是创建两个提交,然后合并它们。这是相当安全的,因为一旦您将更改放入两个不同的提交中,就很难丢失它们,如果合并没有按照您的意愿进行,您可以丢弃合并提交并重试。

对于第一次提交,您已经进行了更改,所以git commit应该足够了。

其次,您的工作副本中有一个状态,表示对原始HEAD. 但是现在你已经完成了那个提交,有一个介入;HEAD是索引中的内容,因此看起来您的工作副本恢复了这些更改。为了解决这个问题,我们需要重置我们的HEAD点,而不改变工作副本中的内容。

在此之前,让我们保存一个指向当前HEAD:的指针git branch was-in-index。现在我们可以使用 重置为之前HEAD的(父级HEADgit 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分支。

于 2012-10-31T05:18:19.683 回答
0

最简单的方法是 4 步过程。

  1. git commit对 foo 的分阶段更改。
  2. 修改 foo,在 M1 之上添加 M2
  3. git add foo,将 M2 放在暂存区。
  4. git commit --amend,将 M1 与 M2 合并。

这并不完全是您所要求的,但我相信这是获得您所要求的结果的最有效方式。

于 2012-10-31T04:44:57.037 回答