如何在 git 中组合多个存储

问题描述 投票:0回答:5

这是过去两周分支

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}

git git-stash
5个回答
158
投票

有点复杂,但这几乎总是有效的:

  1. 弹出第一个藏品

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

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

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

    $ git reset --soft HEAD^
    

56
投票

只有在与工作树中修改的文件没有冲突的情况下才能应用存储,因此,首先确保

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}


19
投票

你不需要临时提交来实现这一点

这对我有用。

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

    git add .
    
  2. 应用你想要的藏品

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

    git add .
    

    git add <stashed_filename>

  4. 继续步骤2和3多次

  5. 然后取消所有内容

    git reset 
    

完成!


15
投票

更好的方法是只使用

git stash show -p stash@{whatever} > stash-{whatever}.diff
,然后对每个都使用
git apply


3
投票

我也有类似的问题,是这样解决的。

使用

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

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

© www.soinside.com 2019 - 2024. All rights reserved.