如何不害怕
我想告诉你,无论你搞砸了多么糟糕,提交永远不会被破坏*,你总是可以回到你开始的地方。
我制作了一个与您图示的形状相同的人造 git 树:
我现在要清除“备份”分支的最后三个提交:
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
$ git reset --hard HEAD~3
HEAD is now at 07e71d9 Merged "getDepsForScript" function
$ git log --oneline
07e71d9 Merged "getDepsForScript" function
...
糟糕,那很糟糕。让我们回到我们开始的地方。首先看看我们做了什么:
$git reflog
07e71d9 HEAD@{0}: HEAD~3: updating HEAD
9b41f46 HEAD@{1}: commit: Removed extraneous whitespace
...
你可以看到,当我们重置时,git 所做的只是让 HEAD 指向那个旧的提交。但实际上并没有丢失任何提交——它们只是成为孤儿,而不是任何分支的一部分。让我们再次让它们成为“备份”分支的一部分:
$ git reset --hard 9b41f46
HEAD is now at 9b41f46 Removed extraneous whitespace
$ git log --oneline
9b41f46 Removed extraneous whitespace
981e2e8 Merged the "loadscripts" function
005bc62 Pick up a few very fringe cases
07e71d9 Merged "getDepsForScript" function
...
Git 意味着永远不必说对不起。
*松散的对象最终会被垃圾收集,但至少要等到它们至少两周大。
如何做你想做的事。
首先让我们结合master中的两个提交:
$ git checkout master
$ git rebase -i HEAD~2
Git 将启动您的编辑器。改变这个:
pick 6389f4e Moved "loaded" function out of "require".
pick 41fb646 comma
对此:
pick 6389f4e Moved "loaded" function out of "require".
s 41fb646 comma
并保存。Git 将再次启动您的编辑器。改变这个:
# This is a combination of two commits.
# The first commit's message is:
Moved "loaded" function out of "require".
# This is the 2nd commit message:
comma
对此:
Moved "loaded" function out of "require".
并保存。
现在让我们重新排序“备份”中的提交:
$ git checkout backup
$ git rebase -i remotes/origin/master
当你的编辑器弹出时,改变这个:
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
pick 9b41f46 Removed extraneous whitespace <-----
对此:
pick 9b41f46 Removed extraneous whitespace <-----
pick ec7f71c moved "loaded" function out of "require"
pick 4a76897 Replaced maploaded event
pick 07e71d9 Merged "getDepsForScript" function
pick 005bc62 Pick up a few very fringe cases
pick 981e2e8 Merged the "loadscripts" function
并保存。
现在从 master 中挑选合并的“已移动加载”提交到当前分支(“备份”)
$git cherry-pick master
使 master 指向与“备份”相同的提交
$git checkout master
$git reset --hard backup
摆脱扭曲分支
$git branch -D twist