GIT : 在旧提交中编辑暂存文件但保留更改

GIT : edit staged files in old commit but keep changes

我找遍了所有地方,但找不到解决我正在尝试做的事情的方法。也许我只是错过了。

假设我有:

Commit A: 
- file 1
- file 2
- file 3
Commit B:
- file 4
Commit C:
- file 5
- file 6
HEAD: has files 1-6. 

有没有办法以交互方式返回提交 A 以取消提交文件 2 和文件 3,然后重播剩余的提交? 这样我就剩下

Commit A: 
- file 1
Commit B:
- file 4
Commit C:
- file 5
- file 6
HEAD: has files 1-6, with file2 and file3 as unstaged.

我发现的不完整解决方案:

- git reset --soft <commit A>
- make changes
- git commit

但这让我没有剩余的提交(B,C)。

- git rebase -i HEAD~n
- edit <commit>
- make changes
- git commit --amend
- git rebase --continue

但是这里的更改是在那次提交时提交的文件之上,我不想撤消文件更改,只是 uncommit/unstage 它们。

- git revert -n <commit> 

但这会撤消更改。

- git rebase drop <commit> 

但这会删除整个提交。

我正在寻找 playback/--continue 的变基,但软重置的可编辑性。有办法吗?

谢谢

我会推荐:

git rm -- file_2 file_3
git commit

这将创建一个删除这两个文件的新提交。历史没有改变。

恢复工作树中的两个文件:

git checkout HEAD^ -- file_2 file_3
git reset HEAD -- file_2 file_3

git checkout 恢复文件并 git reset 将它们从暂存区中删除,这样您就不会提交它们。

或者,如果您还没有将这些提交推送到共享存储库,并且希望更改历史记录,请使用 git rebase -i

git rebase -i HEAD~n #n should be one more than the number of commits to change
#mark commit A to edit 
git reset -- file_2 file_3 # remove file_2 and file_3 from staging so they won't be committed
git commit --amend
git rebase --continue

我相信这会在您的工作树中留下 file_1 和 file_2。如果没有,可以使用上面的 git checkout 从你的 pre-rebase 提交中恢复它们。