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从入门到精通》 --高见龙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值