git stash - >使用当前更改合并存储更改

Bem*_*mis 160 git git-stash git-merge

我对我的分支进行了一些更改,并意识到我忘了我已经对所述分支进行了一些其他必要的更改.我想要的是一种将我的隐藏更改与当前更改合并的方法.

有没有办法做到这一点?

为了方便起见,我最终放弃并首先承诺了我目前的变化,然后是我的变化,但我宁愿一举将它们送进去.

Jos*_*ner 232

我刚刚发现如果你的未提交的更改被添加到索引(即"暂存",使用git add ...),那么git stash apply(并且,可能git stash pop),实际上将进行适当的合并.如果没有冲突,你就是金色的.如果没有,请像往常一样解决它们git mergetool,或者使用编辑器手动解决它们.

要清楚,这是我正在谈论的过程:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"
Run Code Online (Sandbox Code Playgroud)

......这可能就是你要找的东西.


TL;博士

git add第一.

  • 实际上,它不是一个黑客 - 它比你想要的改进,因为你可以很容易地恢复到索引的变化. (10认同)
  • 我不认为git有任何"预期"的东西.我的预感是,现在任何git都是偶然的. (8认同)
  • 这样的黑客,但嘿,它的工作原理似乎是唯一的方法.我希望有`git stash apply --force`或者什么. (7认同)
  • 这是完美的解决方案.我只是做了`git add .`,`git stash apply`,然后`git reset`将stash应用到我的工作更改并合并而不必进行提交. (4认同)
  • 哇,这个行为真的是由git打算的吗? (2认同)
  • 我想补充一下,`git add -u`可能比`git add .`更可取,因为它`-u`不会添加未跟踪的文件。 (2认同)

Bra*_*dan 69

运行git stash popgit stash apply基本上是合并.您不应该提交当前更改,除非在存储中更改的文件也在工作副本中更改,在这种情况下您将看到此错误消息:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您无法一步将存储应用于当前更改.git rebase如果你真的不想要两次提交,你可以提交更改,应用存储,再次提交,并压缩这两个提交,但这可能会更麻烦,值得.

  • 约书亚华纳的答案应该是标记为正确的答案.要合并存储,请暂存更改,应用存储,处理任何冲突,然后(如果需要)取消更改. (21认同)
  • "你可以提交更改,应用存储,再次提交,并使用git rebase压缩这两个提交,如果你真的不想要两个提交,但这可能更麻烦,它值得." 而不是你可以这样做:提交更改,应用存储,然后[`git commit --amend`](http://git-scm.com/book/en/v2/Git-Tools-Rewriting-History #更改最上一次提交). (4认同)
  • 在所有情况下,我都不会认为这是一个答案.您可能只隐藏了特定文件中的一组更改,因为您希望在开发过程中测试一些内容.而且您可能不希望在此时(或根本不)提交文件的当前内容,因为它是WIP.git存在一个真正的问题,即存储的更改无法合并到当前分支中 (3认同)
  • 我确实收到了这条消息 - 更改不冲突但共享相同的文件,是否使用隐藏/应用? (2认同)

ks1*_*322 23

我想要的是一种将我的隐藏更改与当前更改合并的方法

这是另一种选择:

git stash show -p|git apply
git stash drop
Run Code Online (Sandbox Code Playgroud)

git stash show -p将显示上次保存的藏匿的补丁.git apply将适用它.合并完成后,可以删除合并的存储git stash drop.