git commit --amend
amending中文为纠正。该命令的作用是修改上一个提交。把stage区的东西并入到上一个提交之中,从而不必搞一个新的提交。
git commit --amend -m "an updated commit message"
更改上一条的log信息。不加-m来改log也可以,只不过要通过vim操作一下。结论是无论stage区有没有东西,你都可以commit一次,有则会把stage的东西提交到head,无则只是更改log。
git commit --amend --no-edit
--no-edit这个flag代表着不改变log。所以你可以用这条东西更新stage区的文件到最新的一个commit。
WARNING 最好只更改本地的commit,commit一旦提交到了远端,就别再用这种方式改了,可能会导致冲突(私以为改个log还是没问题的...)
git rebase
# 涉及到branch,暂时先不理
git reflog
等同于git reflog show HEAD
。
和log有啥不同?这个显示的是操作,不只是commit,比如:
ecac366 HEAD@{1}: reset: moving to HEAD
ecac366 HEAD@{2}: revert: Revert "second add 1"
52ea7db HEAD@{3}: reset: moving to HEAD
52ea7db HEAD@{4}: checkout: moving from 5d3587cea87e9afee747b015c8cc190caae6362f to master
5d3587c HEAD@{5}: checkout: moving from master to 5d3587cea87e9afee747b015c8cc190caae6362f
52ea7db HEAD@{6}: checkout: moving from 3f0b9788c4d959c705fa416f29ff68dfc183cb70 to master
**在此说明: **HEAD代表着当前的分支。
git reflog show --all
可以展示所有分支的reflog。
时间标志
1.minute.ago
1.hour.ago
1.day.ago
yesterday
1.week.ago
1.month.ago
1.year.ago
2011-05-17.09:00:00
用法比如
git reflog HEAD@{1.hour.ago}
百分号和大括号是必须的。
用在diff时可以这么用,以区分两个版本:
git diff master@{0} master@{1.day.ago}
show其实是个隐藏命令git reflog
== git reflog show
恢复历史(超越rebase的牛逼操作,永不再丢失代码)
先用git reflog
看一下你要去的目标版本,然后用git reset --hard HEAD@{8}
之类的代码把版本恢复过去即可~