如何在 git 中组合多个存储

这是过去两周 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}

36323 次浏览

只有在与工作树中修改过的文件没有冲突的情况下才能应用隐藏,因此,首先,确保 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},因为第一个弹出了。

我也遇到过类似的问题,就这样解决了。

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

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

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

虽然有点复杂,但总是有效的:

  1. 打开第一个藏匿点

    $ git stash pop
    
  2. Temporarily commit the changes from the first stash

    $ git add . && git commit -am 'WIP'
    
  3. Pop the second stash

    $ git stash pop
    
  4. Undo the temporary commit, keeping the changes it introduced

    $ git reset --soft HEAD^
    

这招对我很管用。

  1. 分阶段处理当前更改(如果没有未分阶段处理的更改,则跳过此步骤)

    git add .
    
  2. 你想藏多少就藏多少

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

    git add .
    

    git add <stashed_filename>

  4. 多次继续第2步和第3步

  5. 那就把一切都撤掉

    git reset
    

成交!