我一直在玩git(还是非常非常棒),我想知道"重置"和"重写"之间的区别.那个比另一个更强大吗?
假设我想从历史记录中删除粗体中的3个提交,哪个更好用,或者我应该标记它然后删除它git tag -d <tagname>?
17a64df 2012-06-21 | Hello使用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 TAG
02b86d0 2012-06-21 | 第一次提交
pok*_*oke 60
它们完全不同.git-reset在您的工作目录和索引上使用refs,而不触及任何提交对象(或其他对象).git-rebase另一方面,用于重写以前生成的提交对象.
所以如果你想重写历史,git-rebase那就是你想要的.请注意,您永远不应该重写被推送并且可供其他人使用的历史记录,因为重新定位会重写对象,使其与旧对象不兼容,从而导致其他任何相关人员陷入混乱.
话虽这么说,你想要做的是交互式变基.使用它来调用它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),
Run Code Online (Sandbox Code Playgroud)
在那里,只需删除要删除的提交行,保存并退出编辑器,Git将重写您的历史记录.如果您已经推送了更改,请不要这样做.一般来说,历史上有这样的承诺是完全没问题的.
Syd*_*ney 12
我希望这位外行解释是正确的.
git reset和git rebase都会影响你的本地分支.它们将强制您的本地分支与某个提交同步.不同之处在于:
附加信息
什么时候重置?
假设您完成了工作并在本地提交.然后你的猫走过键盘,不知怎的,你不小心搞了你猫的工作.使用重置.
什么时候使用rebase?
假设您重构函数/类的名称,这个更改会影响许多文件.当你提交并试图推动原点时,你意识到你的同事做了一些重要的改变并且已经把它推到了原点.假设您认为重新重新命名(使用IDE)比通过所有冲突文件更容易,您可以选择重新设置,这将删除您的工作并保持您的同事不受影响.
为什么每个答案/教程都包含如此多的技术免责声明?
因为reset和rebase都可以永久删除本地更改.因此,用户需要知道如何使用策略(例如创建备份分支)来保持其工作.
| 归档时间: |
|
| 查看次数: |
43357 次 |
| 最近记录: |