命令 1:查看历史记录 git log
可以查看所有提交记录

如果想看更加详细的信息可以用 git log -p 可以看到所有细节
如果只想看下大致修改内容可以用git log --stat
如果想看某个提交的详细信息可以用git show + id
如果想以标准格式输出日志git log -g

命令 2:git commit --amend
适用场景: 提交后发现有错误,修正
释义: "amend" 是「修正」的意思,git commit 加上 -- amend参数的时候并不是在
当前commit上增加一个commit,而是会把当前commit的内容和暂存区里的内容合并起来
创建一个新的commit,并用这个新的commit替换掉当前commit
用git log将不会看到上次的commit id了,因为已经把它修改,相当于擦除
命令3 : git reset --hard HEAD^
适用场景:提交后修正都不想,写的太烂了,直接丢弃
就可以使用 git reset --hard HEAD^ reset 有重置的意思,
相当于重置工作目录到最新提交的上一次
HEAD就是当前commit的引用,HEAD^表示的HEAD的父commit
reset 不止可以用来丢弃最新的提交,了解它的本质就知道它其他的用途
reset 的本质:移动 HEAD 以及它所指向的 branch
-
reset --hard:重置工作目录,工作目录里的内容会被完全重置为和 HEAD 的新位置相同的内容,未提交的内容会被全部擦除掉(谨慎使用,除非确保工作目录里面的内容都不要了)
-
reset --soft:保留工作目录,会在重置 HEAD 和 branch 时,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区
-
--mixed(默认):重置位置的同时,保留工作目录的内容,并清空暂存区。
-
reset 不加参数:默认使用 --mixed 参数 保留工作目录,并清空暂存区
命令4 : git reabse
merge 之后,commit 历史就会出现分叉,这种分叉再汇合的结构会让有些人觉得混乱
可以用 rebase 来代替 merge,就不会出现分叉
感觉文字描述已经不能比动态图更好,直接用图解
git merge branch1 //合并分支,是站在master上合并branch1
如果把 merge 换成 rebase,可以这样操作:
git checkout branch1//签出分支branch1 HEAD 指向了 branch1
git rebase master //站在branch 1上 rebase操作
可以看出,通过 rebase,5 和 6 两条 commits 把基础点从 2 换成了 4 。
通过这样的方式,就让本来分叉了的提交历史重新回到了一条线。
这种「重新设置基础点」的操作,就是 rebase 的含义。
另外,在 rebase 之后,记得切回 master 再 merge 一下,把 master 移到最新的 commit
git checkout master //签出到master分支
git merge branch1
上面的动态图清晰的描述了git checkout branch名 的本质,其实是把 HEAD 指向指定的 branch,
然后签出这个 branch 所对应的 commit 的工作目录
同样的,checkout 的目标也可以不是 branch,而直接指定某个 commit:...
可以直接指定 commit 作为参数,来把 HEAD 移动到指定的 commit
综上:checkout 的本质是签出指定的 commit
checkout和reset的区别
checkout 和 reset 都可以切换 HEAD 的位置,它们除了有许多细节的差异外,最大的区别在于:
reset 在移动 HEAD 时会带着它所指向的 branch 一起移动,而 checkout 不会。
当你用 checkout 指向其他地方的时候,HEAD 和 它所指向的 branch 就自动脱离了...
和 merge 是不同的,rebase 是站在需要被 rebase 的 commit 上进行操作
所以前面需要先切到分支再rebase
命令5 : git pull --reabse
那就先看看git pull,我们都知道是同步代码,拉取远程最新的代码
git pull命令其本质是:把远程仓库使用git fetch 取下来以后再进行 git merge操作的
如果本地什么都没有修改 git pull 其实是和git fetch一样的
如果本地有修改,就会做merge 操作,用命令操作的话可能就会弹出编辑框,有一条默认的merge信息,相当于产生了一个新的commit,可以使用自动的merge信息,也修改merge信息
所以如果合并算法能解决的 产生冲突的话,需要先解决冲突
git pull rebase
如果在本地什么都没有修改的情况下git pull rebase 和 git pull 和git fetch都是一样的
有修改的情况下git pull rebase 相比会改变父commit
--rebase 可以让提交记录看起来很连续和优美,而不是多出很多无用的merge commit
命令6 : git reflog
骚操作 ,它能把所有的操作命令展示出来
图片来的更加直观,比如你用了git commit --amend 想要回到上次commit 咋整?
用这个命令,还能找到上次的commit id 再 reset 回去

reflog 是 "reference log" 的缩写,查看的其实是引用的记录
默认不写查看的是HEAD的移动记录,也可以指定branch,如:master
可见查找出来的log是类似栈的结构

命令7:git stash 存储
在代码写了一部分后,而这时想要切换到另一个分支做其他事情
又不想因为过会儿回到这一点而做了一半的工作创建一次提交
这种场景下就可以使用git stash 命令
git stash的意思是暂存,可以把我们工作目录所有的未提交的修改都保存起来
在.git\logs\refs目录下有个stash文件,可以看到
如果我们多次暂存,可以用命令查看记录
git stash save "message" 可以带上message
git stash apply 可以应用最新的stash
git stash apply stash@{2}来应用指定的stash
git stash drop移除指定的stash
git stash pop应用后再删除
git stash list查看stash list

命令8: git fsck --full
显示出所有没有被其他对象指向的对象,数据恢复的时候可能用到
Git HEAD ,master, branch解释

push的本质

merge的本质


网友评论