“git reset”和“git rebase”有什么不同?

我一直在玩git(还是很noob),我想知道“重置”和“rebase”之间的区别。 比另一个更强大吗?

假设我想从历史logging中删除粗体的3个提交,哪个更好用,还是应该标记,然后用git tag -d <tagname>删除它?

17a64df 2012-06-21 | 你好使用style.css(HEAD,origin / style,master),
a6792e4 2012-06-21 | 新增了CSS样式表
801e13e 2012-06-21 | 增加了README
5854339 2012-06-21 | 增加了index.html
0b1dd4c 2012-06-21 | 将hello.html移至lib
55649c3 2012-06-21 | 添加作者/电子邮件评论
9b2f3ce 2012-06-21 | 添加了作者评论
cdb39b0 2012-06-21 | 用文本提交p标签(v1.1)
b7b5fce 2012-06-21 | 这将恢复提交a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8。
a6faf60 2012-06-21 | 恢复“糟糕,我们不想要这个提交”
a006669 2012-06-21 | 糟糕,我们不想要这个提交
262d1f7 2012-06-21 | 添加了HTML标头(v1)
b1846e5 2012-06-21 | 添加了标准的HTML页面标签(v1-beta)
bf1131e 2012-06-21 | 添加了HI标签
02b86d0 2012-06-21 | 第一次承诺

他们完全不同。 git-reset可以在你的工作目录和索引中使用refs,而不用触及任何提交对象(或其他对象)。 另一方面, git-rebase用于重写先前提交的提交对象。

所以如果你想重写历史, git-rebase就是你想要的。 请注意,您不应该重写已推送的历史logging,并且可以为其他人使用,因为重新绑定会将对象重写为与旧对象不兼容,从而导致涉及其他任何人的混乱。

这就是说,你想做的是交互式重新装订 。 使用git rebase -i 262d1f7来调用它,你应该得到如下的提示符:

 pick 262d1f7 Added HTML header (v1) pick a006669 Oops, we didn't want this commit pick a6faf60 Revert "Oops, we didn't want this commit" pick b7b5fce This reverts commit a6faf60631b5fbc6ee79b52a1bdac4c971b69ef8. pick cdb39b0 Commit p tags with text (v1.1) pick 9b2f3ce Added an author comment pick 55649c3 Add an author/email comment pick 0b1dd4c Moved hello.html to lib pick 5854339 Added index.html pick 801e13e Added README pick a6792e4 Added css stylesheet pick 17a64df Hello uses style.css (HEAD, origin/style, master), 

在那里,简单地删除你想要删除的提交的行,保存并退出编辑器,Git将重写你的历史logging。 再次,如果您已经推送了更改, 请不要这样做 。 一般来说在历史上这样的承诺是完全正确的。

虽然这并不比较两者之间的差异,但是这里有一篇很好的文章,解释了很容易理解的rebase。