如何在git中组合多个stas

时间:2012-02-04 19:35:39

标签: git git-stash

这是过去两周内分支frontend上的管道。

| Stash@{3}是自Stash@{1}以来的所有代码(不包括两个小提交) |微小的承诺 |微小的承诺
|两周前大量提交,现已重新定位并转移到Stash@{1}

我的工作树目前很干净 Stash@{1}是两周前批量提交一般开发代码的内容(这应该首先被隐藏起来)。这个提交被撤消并转移到藏匿处 Stash@{3}是自Stash@{1}以来该树上的最新工作(减去已经提交的几项更改)。

我需要在工作树中将这两个存储块组合在一起,这样我就可以从这个巨大的工作池中做出一些提交。

我跑了git stash apply stash@{1}然后我尝试了:

git stash apply stash@{3}
git stash show -p | git stash apply stash@{3}

但在这两种情况下我都得到'脏工作树'。我如何将这项工作合并在一起?由于stash@{3}较新,我希望它在有冲突的地方取代stash@{1}

5 个答案:

答案 0 :(得分:91)

它有点牵扯,但这几乎总是有效:

  1. 弹出第一个藏匿

    $ git stash pop
    
  2. 暂时提交第一个存储的更改

    $ git add . && git commit -am 'WIP'
    
  3. 弹出第二个藏匿

    $ git stash pop
    
  4. 撤消临时提交,保留其引入的更改

    $ git reset --soft HEAD^
    

答案 1 :(得分:42)

如果工作树中没有与已修改文件冲突,则只能应用存储,因此,首先,确保git status中没有已修改的文件,如果有,则提交它们。然后做:

git stash apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}

然后,您可以进行新的提交,也可以修改前一个提交以进行组合。每次应用后,您可能需要解决合并冲突。

此外,如果您决定使用git stash pop而不是apply,请注意stash@{3}将成为stash@{2},因为第一个被弹出。

答案 2 :(得分:12)

更好的方法是使用git stash show -p stash@{whatever} > stash-{whatever}.diff,然后为每个人使用git apply

答案 3 :(得分:2)

我遇到了类似的问题并且解决了这个问题。

使用git stash pop应用其中一个藏匿处。然后使用git diff -p > ../stash.diff创建此存储的修补程序。然后,您可以重置工作树(或再次存储更改),并使用git stash pop stash@{1}弹出另一个存储。如果您此时应用补丁,则可以“合并”两个不同的藏匿处。

您可能需要解决一些冲突。如果一切顺利,您可以放弃隐藏的更改。

答案 4 :(得分:2)

这对我有用。

  1. 暂存当前更改(如果未暂存,则跳过此步骤)

    git add .
    
  2. 应用你想要的藏匿处

    git stash apply stash@{0}
    
  3. 暂存当前更改

    git add .
    

    git add <stashed_filename>

  4. 多次重复第 2 步和第 3 步

  5. 然后取消一切

    git reset 
    

完成!