如何在git中组合多个stas

ssc*_*rus 58 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}任何有冲突的地方取代.

小智 98

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

  1. 弹出第一个藏匿处

    $ git stash pop
    
    Run Code Online (Sandbox Code Playgroud)
  2. 暂时从第一个存储中提交更改

    $ git add . && git commit -am 'WIP'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 弹出第二个藏匿处

    $ git stash pop
    
    Run Code Online (Sandbox Code Playgroud)
  4. 撤消临时提交,保持引入的更改

    $ git reset --soft HEAD^
    
    Run Code Online (Sandbox Code Playgroud)

  • 花了一些时间来欣赏这种美丽.它比尝试应用修补程序要好得多,修补程序通常由于空格或文件路径更改而失败 (6认同)
  • 不要忘记在它之后重置文件以查看`git diff`中的统一更改,因为当前重置的更改是分阶段进行的,并且单独看作`git diff --staged`. (2认同)
  • 这似乎是最好的解决方案,但我仍然不明白为什么我们不能在我们有未暂存的更改时简单地弹出现有的存储。例如,简单地运行`git stash pop`然后是`git stash pop`会很好。也许我错过了 git stash 内部的一些东西。 (2认同)
  • @Nakilon 提到了这一点,但我将添加以下内容作为第 5 步(从项目的根目录输入): `git reset HEAD 。` (2认同)

And*_*all 47

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

git stash apply stash@{1}
git commit -a
# Enter your commit message
git stash apply stash@{3}
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您决定使用git stash pop而不是apply,请注意自第一个弹出以来stash@{3}stash@{2}出现的情况.

  • 在工作树中组合它们和修改它们之间的区别是什么?或者在应用第二个存储后执行`git reset HEAD ^`?您不能在脏工作树上应用存储,因此您必须在应用之前提交*,但这并不意味着您在应用之后无法撤消该提交. (8认同)
  • 这两个存储区很大,包含很多重叠的工作,因此我想避免提交。是否可以仅将它们合并到工作树中,还是我被迫提交这些大块,然后合并2个cr脚的提交,并将它们拆分为vim中的〜10个好提交? (2认同)

NIK*_*C M 17

这对我有用。

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

    git add .
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用你想要的藏品

    git stash apply stash@{0}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 阶段当前的变化

    git add .
    
    Run Code Online (Sandbox Code Playgroud)

    或者git add <stashed_filename>

  4. 继续步骤2和3多次

  5. 然后取消一切

    git reset 
    
    Run Code Online (Sandbox Code Playgroud)

完毕!

  • 因此,在应用另一个/第二个存储之前不需要创建临时“git commit”。 (2认同)

sir*_*ide 12

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

  • 四年半的时间里,我已经"陷入困境",直到现在还没有人注意到. (3认同)
  • 不需要中间文件,只需直接输入`git apply`:`git stash show stash @ <n> | git apply -`. (2认同)