如何从 `git rebase --autostash` 获取丢失的“autostash”提交

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

使用

git rebase --autostash
时,git会自动创建一个“autostash”提交,并在成功rebase后重新应用它。

但是如果变基被中止(例如,当它是交互式变基时,在 Vim 中使用

:cq
),自动存储提交可能最终会成为悬空提交。

Git 2.9.0

git rebase
2个回答
22
投票

我发现以下内容列出了所有“autostash”提交:

git log --pretty='%cr: %h %s' $(git fsck --no-reflog \
  | grep '^dangling commit' | cut -f3 -d\ ) | grep ': autostash$'

然后您可以使用提交哈希来取回提交,例如使用

git show
git cherry-pick

输出如下所示:

Checking object directories: 100% (256/256), done.
2 minutes ago: 7a50bcb On improve-moving-out-of-zoomed-tmux-pane: autostash
22 minutes ago: 9c504af On pr-123: autostash
5 weeks ago: f216b45 On look-for-vim-with-pgrep-ps: autostash
9 weeks ago: f405faa On look-for-vim-with-pgrep-ps: autostash
10 weeks ago: 28ddead On look-for-vim-with-pgrep-ps: autostash

4
投票

Git 2.10(2016 年第 3 季度)应该完全避免这个问题。

请参阅提交 33ba9c6(2016 年 6 月 29 日),作者:Patrick Steinhardt (

pks-t
)
(由 Junio C Hamano --
gitster
--
合并于 commit 5eb1e9f,2016 年 7 月 13 日)

rebase -i
:中止时恢复自动存储

当我们中止交互式变基时,我们通过调用

die_abort
来执行此操作,它会通过删除变基状态目录来清理我们之后的情况。
但是,如果用户请求使用自动存储功能,则状态目录还可能包含对自动存储的引用,该引用现在将被删除。

尝试在

die_abort
中重新应用自动存储来解决问题。
这也将通过将自动存储记录在用户可见的存储中来处理自动存储不再完全应用的情况。


请注意,Git 2.39 中又出现了同样的问题:

使用 Git 2.47(2024 年第 4 季度),第 19 批,“

git rebase --autostash
(man) 在交还控制权请求解决冲突方面的帮助后命令中止时,无法恢复自动存储的更改。

请参阅commit bf6ab08(2024 年 9 月 2 日),作者:Phillip Wood (

phillipwood
)
(由 Junio C Hamano --
gitster
--
合并于 commit 2b800ec,2024 年 9 月 20 日)

rebase
:当 rebase 启动失败时应用并清理自动存储

报告人:Brian Lyles
签字人:Phillip Wood

如果“

git rebase
(man)在存储用户未提交的更改后无法启动,那么它会忘记恢复存储的更改并删除状态目录。
更糟糕的是,运行“
git rebase --abort
(man)来应用隐藏的更改并清理状态目录会失败,因为状态目录仅包含自动存储文件并且缺少头名和文件
read_basic_state()
需要。

如果预变基挂钩或初始签出失败,请通过应用自动存储并删除状态目录来修复此问题。
这与

finish_rebase()
在成功变基结束时执行的操作相匹配。
如果用户在创建自动存储后修改任何文件,则应用自动存储时可能会出现冲突。
在这种情况下,
apply_autostash()
将存储保存在 refs/stash 下的新条目中,因此可以安全地删除包含自动存储文件的状态目录。

添加了新的测试来检查是否应用了自动存储,并且如果变基无法启动,则删除状态目录。
还向一些现有测试添加了检查,以确保在变基无法启动且未创建自动存储时不会留下任何状态目录。

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