如何在git中组合多个存储

如何在git中组合多个存储,git,git-stash,Git,Git Stash,这是过去两周内分支前端的管道 |Stash{3}是所有代码,因为Stash{1}(不包括两个微小的提交) |微小提交 |微小提交 |两周前进行了大量提交,现在重新设置了基础并移动到Stash@{1} 我的工作树当前已清除。 Stash@{1}是两周前批量提交的通用开发代码中的内容(首先应该隐藏)。此提交已撤消并移动到隐藏。 Stash{3}是自Stash{1}以来该树上的最新工作(减去已提交的几个更改) 我需要在我的工作树中将这两个存储组合在一起,这样我就可以从这个巨大的工作池中进行大量的提交

这是过去两周内分支
前端的管道

|
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 apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}
然后,您可以进行新的提交,也可以修改前一个提交以合并它们。每次应用后,您可能需要解决合并冲突


另外,如果您决定使用
git stash pop
而不是
apply
,请注意
stash{3}
将在第一个问题弹出后变成
stash{2}

我遇到了类似的问题,并这样解决了它

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


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

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

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

  • 破获第一个藏品

    $ git stash pop
    
    $ git add . && git commit -am 'WIP'
    
  • 暂时提交第一次存储的更改

    $ git stash pop
    
    $ git add . && git commit -am 'WIP'
    
  • 把第二个藏起来的东西打开

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

    $ git reset --soft HEAD^
    
  • 这对我有用

  • 暂存当前更改(如果未暂存中没有任何内容,则跳过此步骤)

  • 把你想要的藏起来

    git stash apply stash@{0}
    
  • 将当前的变化分阶段进行

    git add .
    
    git add

  • 继续步骤2和3多次

  • 然后把一切都取消

    git reset 
    

  • 完成了

    这两个堆栈很大,包含大量重叠的工作,这就是我希望避免提交的原因。是否可以在工作树中合并它们,或者我被迫提交这些大块,然后在vim中合并2个糟糕的提交并将它们拆分为10个好的提交?另一件事是:我不想提交所有这些代码。其中很大一部分仍然只用于开发。在工作树中组合它们和修改它们之间有什么区别?或者在应用第二次隐藏后执行
    git重置头^
    ?您无法在脏工作树上应用隐藏,因此必须在应用之前提交,但这并不意味着您无法在应用后撤消该提交。@AndrewMarshall“您只能在干净的工作树上应用隐藏”。。。。这仍然是最新的和准确的吗?如果更改不重叠,这是迄今为止最直接的。我觉得仅仅为了合并内容而进行提交是愚蠢的。@MarceloDiniz:如果内容发生变化,就必须进行提交。一点也不傻。如果隐藏相当简单,那么将其作为补丁应用就可以了,但是如果存在中间的、非平凡的空白更改或文件路径更改,那么就不起作用了。不需要中间文件,只需直接插入
    git apply
    git stash show stash@| git apply-
    。我已经有四年半的时间了“斯塔斯克“在那里,直到现在还没有人注意到。我花了一段时间来欣赏这里的美丽。它比尝试应用修补程序要好得多,修补程序通常会因空格或文件路径更改而失败。不要忘记在修补程序之后重置文件,以查看
    git diff
    中的统一更改,因为当前重置的更改是暂存的,并被单独视为
    git diff--staged
    。这似乎是最好的解决方案,但我仍然不明白,为什么我们不能在有未老化更改的情况下简单地打开现有的存储。例如,只需运行
    gitstashpop
    ,然后再运行
    gitstashpop
    就可以了。也许我遗漏了一些关于git存储内部的内容。如果弹出第二个存储导致合并冲突(即两个连续的POP不起作用时),在修复冲突后,您还需要一个
    git add
    。@Nakilon提到了这一点,但我会添加以下内容作为步骤5(从项目的根目录输入):
    git reset HEAD.
    或者将stash{1}作为一个diff拉出并在本地应用(例如siride的答案和注释),但这也很有效,谢谢!因此,基本上不要对未老化的更改应用隐藏。谢谢因此,在应用另一个/2次隐藏之前,不需要创建临时“git commit”。