我已经使用
reword
的git rebase -i
指令好几年了,没有任何问题。
但是,它不再仅在我的本地 Git 存储库中工作。 奇怪的是,只需在本地分叉存储库就可以解决问题。
如何重现
$ git status
On branch x
nothing to commit, working tree clean
$ git rebase --abort
fatal: no rebase in progress
$ git rebase -i develop
pick 0a280af1 commit_1
pick 4c37991e commit_2
- pick 09191dca commit_3
+ reword 09191dca commit_3
pick cb098966 commit_4
pick 670ce5d9 commit_5
reword
本身成功了,但紧随其后的
pick
由于未知原因失败了。
错误消息中的 commit_4_{a|b}.txt
已被跟踪并
commit_4
对其进行编辑。
commit_{1|2|3|5}
)不要碰它们。
git rebase -i
。
[detached HEAD 79925137] new_commit_3
Date: Mon Sep 2 15:55:29 2024 +0900
2 files changed, 185 insertions(+)
create mode 100644 commit_3_a.txt
create mode 100644 commit_3_b.txt
error: Your local changes to the following files would be overwritten by merge:
commit_4_a.txt
commit_4_b.txt
Please commit your changes or stash them before you merge.
Aborting
hint: Could not execute the todo command
hint:
hint: pick cb0989660941c763e6935d63105205e296a2c11f commit_4
hint:
hint: It has been rescheduled; To edit the command before continuing, please
hint: edit the todo list first:
hint:
hint: git rebase --edit-todo
hint: git rebase --continue
$ cd /path/to/new_directory
$ git clone /path/to/original_project
部分所示完全相同的步骤。
Git 子模块的缓存(即
.git/modules
)已损坏。只需删除目录并重新初始化子模块即可解决问题。
但我不知道为什么。如
中所写,我比较了在原始有问题的项目中执行的GIT_TRACE=1 git rebase -i develop
的输出和在无问题的本地分支中执行的输出,发现我仅在前一种情况下初始化了Git子模块。
git submodule deinit <directory name>
来取消初始化前存储库中的子模块。之后
reword
就开始正常工作了。
git submodule init
。这让
reword
再次失败。
git submodule init
。仍然
reword
正在工作。
.git/modules
)
已损坏(尽管
git gc
和git fsck
不起作用)。这应该不重要,因为被重新基化的一系列提交与子模块的内容完全无关且独立。但无论如何我尝试过:
git submodule deinit <directory name>
mv .git/modules/ .git/modules.bak
(删除子模块缓存)
git submodule init
git submodule update
reword
又可以工作了。