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
没有提交次数的概念,也不知道它们是否是合并提交或其他。
看起来你合并到你的分支然后 运行 重置。
这是一个可行的计划。
- 在你的分支上找到合并前的提交。
git checkout last_commit_before_merge
git branch -b feature/_X_attempt2
- 你压扁了吗-我推荐
git rebase --interactive
- 按照您通常的流程:合并 master、推送、创建 PR
在合并前回退到您的分支后,您可以使用 git rebase -i master
在您的分支上 rebase master。参见 Merging vs. Rebasing。
注意:这一切都是在您不与他人共享分支的情况下进行的,因为变基(以及您的 git reset
方法)会重写历史。
我想压缩 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
没有提交次数的概念,也不知道它们是否是合并提交或其他。
看起来你合并到你的分支然后 运行 重置。
这是一个可行的计划。
- 在你的分支上找到合并前的提交。
git checkout last_commit_before_merge
git branch -b feature/_X_attempt2
- 你压扁了吗-我推荐
git rebase --interactive
- 按照您通常的流程:合并 master、推送、创建 PR
在合并前回退到您的分支后,您可以使用 git rebase -i master
在您的分支上 rebase master。参见 Merging vs. Rebasing。
注意:这一切都是在您不与他人共享分支的情况下进行的,因为变基(以及您的 git reset
方法)会重写历史。