Git学习内容总结
基础内容
git三大区域的关系
git倒退符
git reset e12d8ef^ 或 git reset HEAD^
# 倒退一次
git reset e12d8ef^^
# 倒退两次
git reset e12d8ef~5
# 倒退五次
git四大天王
在Git中,有四种很重要的对象,分别是Blob对象,Tree对象,Commit对象以及Tag对象。
(1)文件在Git中以Blob对象的形式存放,相同内容的文件为同个Blob
(2)目录及文件的名称将会以Tree对象形式存放
(3)Tree对象的内容会指向某个或某些Blob对象,或者其他的Tree对象
四大天王关系图如下所示
git的资源回收机制
在Git中,即使文件只做了很小的变动,但因为内容变化导致的SHA-1变化,Git依然会新生成一个大小类似的Blob文件。Git不选择做差异备份导致了资源的浪费但同时提高了Checkout的效率。所以Git提供了一套资源回收机制,在触发后可以有效压缩对象体积。
git gc # 此命令显式的启用了资源回收
# 调用gc后会把.git/objects目录下的对象全部打包到.git/objects/pack
git verify-pack -v .git/objects/pack/pack-ea00f1225551445.idx
# 此命令可显式的查看打包的情况
Git何时自动触发资源回收机制
(1)当.git/objects目录对象或打包过的packfiles数量过多时
(2)当执行git push命令把内容推送至远端时
其实Git并不在意空间的浪费,能够快速、有效率的操作才是Git关注的重点
常用指令
git clean
git clean命令用来从你的工作目录中删除所有没有tracked过的文件.
git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的commit的状态.
git clean -n
# 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒.
git clean -f
# 删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过.
git clean -f <path>
# 删除指定路径下的没有被track过的文件.
git clean -df
# 删除当前目录下没有被track过的文件和文件夹.
git clean -xf
# 删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件.
git reset --hard和git clean -f是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候.
例如你要删除所有工作目录下面的修改, 包括新添加的文件. 并且假设你已经提交了一些到暂存区了.
git reset HEAD .
# 清除暂存区提交的内容
git checkout .
# 清除工作区的修改内容
git clean -df
# 清除工作区新增的文件
运行后, 工作目录和缓存区回到最近一次commit时候一摸一样的状态, git status会告诉你这是一个干净的工作目录, 又是一个新的开始了.
git branch
新增分支
git branch cat
修改分支名称
git branch -m cat dog
删除分支
git branch -d dog
切换分支
git checkout dog
# 注意切换分支时并不会丢失切换前工作区的内容。
# 如果需要临时切换到其它分支去处理,请先commit一次或使用stash暂存 不然当前分支的修改会被带到新分支去
常见场景
新增项目
Git 全局设置:
git config --global user.name "你的作者名"
git config --global user.email "你的电子邮箱"
创建 git 仓库:
#本地已创建好目录 shell进入目录下按顺序敲以下代码
git init
git add --all
git commit -m "first commit"
git remote add origin https://gitee.com/sclcsm/repository.git #远程仓库地址
git push -u origin master #第一次推送必须用-u绑定upstream
去除某个文件版本控制
1: 还没有加到版本控制中即未使用git add加入
touch .gitignore #新建.gitignore文件
echo "index.html" > .gitignore #将不想被控制的文件写到.gitignore
#git add commit push推送即可
2:已经加到版本控制中
git rm -r --cached git.html # -r 是允许递归删除,当要删除的是文件夹的时候有用 git rm = rm + git add
#git add commit push推送即可
注意:这里 --cached 的意思是只去除版本控制而不删除本地文件,如果不写的话会把本地文件也删掉。所以要不要加 --cached 参数就看自己需要了。
修改 .gitignore, 把对应的规则写入 .gitignore,让忽略真正生效;
提交+推送。就是 add commit push 啦。
修改或新增文件后后悔怎么办
1.本地修改了一堆文件(并没有使用git add到暂存区),想放弃修改。
单个文件/文件夹:
git checkout -- filename
所有文件/文件夹:
git checkout .
2.本地新增了一堆文件(并没有git add到暂存区),想放弃修改。
单个文件/文件夹:
rm filename / rm dir -rf #此处会删除文件回收站都找不到 慎用
所有文件/文件夹:
git clean -f
# 删除新增的文件,如果文件已经已经git add到暂存区,并不会删除!
# 如果需要同时删除.gitignore控制的文件请使用git clean -xdf
3.本地修改/新增了一堆文件,已经git add到暂存区,想放弃修改。
单个文件/文件夹:
git reset HEAD filename
所有文件/文件夹:
git reset HEAD .
4.本地通过git add & git commit 之后,想要撤销此次commit
git reset commit_id
这个id是你想要回到的那个节点,可以通过git log查看,可以只选前6位
撤销之后,你所做的已经commit的修改还在工作区!
git reset --hard commit_id
# git reset --soft|--mixed|--hard <commit_id>
# --mixed 会保留源码,只是将git commit和index 信息回退到了某个版本.
# --soft 保留源码,只回退到commit信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可.
# --hard 源码也会回退到某个版本,commit和index 都会回退到某个版本.(注意,这种方式是改变本地代码仓库源码)
这个id是你想要回到的那个节点,可以通过git log查看,可以只选前6位
撤销之后,你所做的已经commit的修改将会清除,仍在工作区/暂存区的代码也将会清除!
如何放弃所有修改
例如你要删除所有工作目录下面的修改, 包括新添加的文件. 并且假设你已经提交了一些修改到暂存区了.
git reset HEAD .
# 清除暂存区提交的内容
git checkout .
# 清除工作区的修改内容
git clean -df
# 清除工作区新增的文件
运行后, 工作目录和缓存区回到最近一次commit时候一摸一样的状态, git status会告诉你这是一个干净的工作目录, 又是一个新的开始了.
如何修改上个commit信息
改动上一次提交的信息
git commit --amend -m "修改的信息"
改动指定一次commit提交
注意:改动历史的操作尽量不要应用在已push的commit中
如何追加文件到最近的commit
git add . # 新加文件到暂存区
git commit --amend --no-edit
# 最后的参数是指“不编写Commit信息”
注意:改动历史的操作尽量不要应用在已push的commit中
如何查看特定文件的commit记录
git log index.html
git log -p index.html # 加个参数可以看到文件每次的改动
如何找到某行代码是谁写的
git blame index.html
git blame -L 1,10 index.html # 加个参数可以限制查看的行数
commit后悔了,想拆掉重做
git reset --hard commit_id 或 HEAD^
# --mixed 拆出来的改动全部回到工作区.
# --soft 拆出来的改动全部回到暂存区.
# --hard 拆出来的改动全部消失,完整的回到指定版本.
不小心reset了commit,可以后悔吗
git reflog # 查到历次commit记录
git reset --hard commit_id
# 退回指定版本.
push提交到远端后悔了怎么办
任何Push都需要慎之又慎,任何涉及远端的回退都请认真评审其必要性
对于已经push出去的Commit任何回退都建议使用git revert
git rebase和git reset都会导致强制推送的出现,在多人开发环境中风险很大,不建议使用。
注意:git revert类似reset --hard模式,拆出来的commit内容会消失
如新增文件并写了大量内容,revert后文件会被删除。在使用revert之前请务必保证工作区干净!否则神仙难救。
以上内容还在不断更新中
Git是典型的易用难精,推荐各位有机会还是系统学习深入了解Git原理,对技术的提升很有帮助。
在此推荐一些比较好的书籍,大家有机会可以看看 有好书推荐大家也可以在下面评论分享。
《Git从入门到精通》 --高见龙