如何在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”。