git 重置 --soft 奇怪的行为

git reset --soft strange behavior

我想压缩 3 次提交,然后再推送到远程存储库中的 develop 分支。我想我会使用 git reset --soft HEAD~3(删除我的最后 3 次提交并使它们成为带有新提交消息的单个提交)。但是,当我编写命令时,我注意到它不仅重置了 3 次提交,而是重置了 20 次(不用担心,我有备份)。在那之后,我想我会再试一次以前的提交(只是为了测试行为),我看到它不仅删除了 3 个提交,而且删除了一个随机数。

这可能来自什么? (注意:"HEAD~3" commit 之前 pull 的时候有合并冲突,我已经解决了,不知道是不是这样)。

如果您重置 merge 提交,那么您将删除所有合并到您的分支中的提交...

假设您有另一个包含 10 次提交的分支,您将其合并到 develop 分支中。如果您 运行 现在 git reset --soft HEAD~1,那么您将看到这 10 次提交的所有更改。

更深入的解释

假设您有以下提交:

abc123 last commit (HEAD)
def456 merge feature2-branch (with 10 commits)
ghi789 add feature
jkl123 fix bug

HEAD(您在历史记录中的位置)位于 abc123。当你现在执行命令 git reset --soft HEAD~3,

  • NOT 意思是:git,请删除最后 3 次提交。
  • 这个的意思:git,请将HEAD移动到jkl123,但保留所有文件原样。

所以 git 没有提交次数的概念,也不知道它们是否是合并提交或其他。

看起来你合并到你的分支然后 运行 重置。

这是一个可行的计划。

  1. 在你的分支上找到合并前的提交。
  2. git checkout last_commit_before_merge
  3. git branch -b feature/_X_attempt2
  4. 你压扁了吗-我推荐git rebase --interactive
  5. 按照您通常的流程:合并 master、推送、创建 PR

在合并前回退到您的分支后,您可以使用 git rebase -i master 在您的分支上 rebase master。参见 Merging vs. Rebasing


注意:这一切都是在您不与他人共享分支的情况下进行的,因为变基(以及您的 git reset 方法)会重写历史。