git stash - >合并存储的变化与当前的变化

时间:2012-07-26 18:35:50

标签: git git-merge git-stash

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

有办法做到这一点吗?

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

8 个答案:

答案 0 :(得分:211)

我刚刚发现如果你的未提交的更改被添加到索引中(即“暂存”,使用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"

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


TL;博士

首先运行git add

答案 1 :(得分:68)

运行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

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

答案 2 :(得分:17)

  

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

这是另一种选择:

git stash show -p|git apply
git stash drop

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

答案 3 :(得分:0)

正如@Brandan所建议的那样,这就是我需要做些什么才能解决问题

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

请遵循以下流程:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

您将完全合并本地更改为file,准备好进行进一步的工作/清理或做出一个好的提交。或者,如果您知道file的合并内容是正确的,您可以编写适当的消息并跳过git reset HEAD^

答案 4 :(得分:0)

我这样做的方法是先git add,然后git stash apply <stash code>。这是最简单的方法。

答案 5 :(得分:0)

也许是,(通过difftool)从...是...分支合并不是一个最糟糕的主意!

> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch

答案 6 :(得分:0)

您可以轻松

  1. 提交当前更改
  2. 取消藏匿和解决冲突
  3. 从隐藏提交更改
  4. 软重置以提交您来自(最后一次正确提交)的提交

答案 7 :(得分:-1)

另一种选择是对本地未提交的更改执行另一个“git stash”,然后组合两个git stashes。不幸的是,git似乎没有办法轻松地结合两个藏匿处。因此,一种选择是创建两个.diff文件并同时应用它们 - 以免它不是额外的提交而且不涉及十步过程:|

如何:https://stackoverflow.com/a/9658688/32453