73

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

| Stash@{3}是所有代码,因为Stash@{1}(不包括两个微小的提交)
| 微小的承诺
| 微小的承诺
| 两周前的大批量提交,现在重新定位并移至Stash@{1}

我的工作树目前很干净。
Stash@{1}是两周前大量提交一般开发代码的内容(这应该首先被隐藏)。此提交已撤消并移至隐藏。
Stash@{3}是那棵树上的最新作品Stash@{1}(减去一些已提交的更改)。

我需要在我的工作树中将这两个 stash 组合在一起,这样我就可以从这个庞大的工作池中进行一些提交。

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

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

但在这两种情况下我都会得到“肮脏的工作树”。我怎样才能将这项工作合并在一起?因为stash@{3}较新,所以我希望它取代stash@{1}任何有冲突的地方。

4

5 回答 5

130

这有点涉及,但这几乎总是有效的:

  1. 弹出第一个藏匿处

    $ git stash pop
    
  2. 临时提交第一个 stash 中的更改

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

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

    $ git reset --soft HEAD^
    
于 2013-01-24T16:53:10.283 回答
53

如果与工作树中的已修改文件没有冲突,您只能应用存储,因此,首先,确保 没有修改过的文件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}

于 2012-02-04T19:41:19.320 回答
14

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

于 2012-03-11T20:40:45.930 回答
6

这对我有用。

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

    git add .
    
  2. 应用你想要的存储

    git stash apply stash@{0}
    
  3. 阶段当前的变化

    git add .
    

    或者git add <stashed_filename>

  4. 多次执行第 2 步和第 3 步

  5. 然后取消一切

    git reset 
    

完毕!

于 2021-02-17T08:49:47.817 回答
2

我有一个类似的问题并像这样解决了它。

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

你可能会有一些冲突需要解决。如果一切顺利,您可以删除隐藏的更改。

于 2012-03-11T20:38:25.500 回答