Git:使用工作树中的文件合并分阶段文件

时间:2012-10-31 04:10:47

标签: git

我有一个名为foo的文件。我对M1做了一些修改foo并进行了修改。然后我在工作树中将其从HEAD中检出,然后对其进行另一次修改M2。现在我想在提交之前合并这两个修改。如何才能做到这一点?谢谢!

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

3 个答案:

答案 0 :(得分: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"

没有分支机构可以处理。

答案 1 :(得分:0)

最简单的方法是分四个步骤。

  1. git commit分阶段更改为foo。
  2. 修改foo,在M1
  3. 上添加M2
  4. git add foo,将M2放入临时区域。
  5. git commit --amend,将M1与M2合并。
  6. 这不完全是您的要求,但我相信这是获得您要求的结果的最有效方式。

答案 2 :(得分:0)

最明显的解决方案是创建两个提交,并合并它们。这是相当安全的,因为一旦你将更改变成两个不同的提交,就很难丢失它们,如果合并没有按你的意愿去,你可以扔掉合并提交并重试。

对于第一次提交,您已经进行了更改,因此只需git commit即可。

对于第二个,您的工作副本中有一个状态,表示对原始HEAD的更改。但既然你已经完成了那个提交,那么就会有干预; HEAD是索引中的内容,因此看起来您的工作副本会还原这些更改。要解决这个问题,我们需要重置HEAD点的位置,而不更改工作副本中的内容。

在此之前,让我们保存指向当前HEADgit branch was-in-index的指针。现在,我们可以使用HEAD重置为之前的HEAD({1}}的父级),并添加并提交我们的更改git reset HEAD^(或git add some stuff; git commit,如果您想要你所有的改变。)

现在我们有两个分支机构;我们当前的一个,其中包含工作副本的更改,以及git commit -a,其中包含索引中的更改。现在您可以根据需要合并这些; was-in-indexgit merge was-in-index,或者你有什么。完成后,您可以删除git rebase was-in-index分支。