学习笔记-极客时间 玩转 git 三剑客 课程记录

课程地址:https://time.geekbang.org/course/intro/100021601

这篇文章不是课程的全部,仅仅是课程的冰山一角,
而且苏老师对于 git 的使用讲解的很清晰,有需要的可以付费支持。

如果你想白嫖可以简单看我下面的粗陋记录
或者去阮一峰老师的博客,地址是:https://www.liaoxuefeng.com/wiki/896043488029600/

git 基本命令

git 下载

https://git-scm.com/downloads

选择合适的系统下载直接安装即可。

查看版本号

git --version

配置

可通过--list查看已配置的信息

 # local 只对仓库有效
git config --list --local
# global 对登录⽤户所有仓库有效
git config --list --global
# system 对系统的所有⽤户有效,一般不用
git config --list --system 

添加配置信息

git config --global user.name "zhangsan"
git config --global user.email "zhangsan2020@163.com"

三者的优先级顺序如下

local > global > system

如何指定不需要Git管理的文件?

当然是添加.gitignore文件了

忽略特殊文件规则参考阮一峰老师的文章:.gitignore文件规则

Git 修改gitignore后生效

git rm -r --cached .    #清除缓存
git add .               #重新trace file
git commit -m "update .gitignore" #提交和注释
git push origin master  #可选,如果需要同步到remote上的话

创建本地仓库

分为这几个步骤吧:

  1. 初始化
  2. 仓库配置
  3. 添加文件
  4. 提交文件
  5. 提交远程

初始化

# git-learning-1 文件夹名称
git init git-learning-1

仓库配置

cd git-learning-1
git config --local user.email "zhangsan2020@163.com"
git config --local user.name "zhangsan"

四个工作区域

  • Workspace工作区,就是你平时存放项目代码的地方
  • Index / Stage暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息。对应的 git 命令:git add <filename>
  • Repository仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。对应的 git 命令:git commit -m 'desc'
  • Remote远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换。对应的 git 命令:git push

往本地仓库暂存区添加文件 readme.md 文件

git add readme.md

使用 restore 将暂存区的文件回退

git restore --staged readme.md

查看本地仓库状态

git status

提交到本地仓库

git commit -m "some description"

使用图形化界面

gitk

清屏

clear

给文件重命名

#查看文件权限
ll

#文件重命名
git mv readme.md  README.md

git commit -m "[optimized] rename"

删除文件

git rm aa

回退到上一次 commit

工作区暂存区的删除或者修改的内容回退到上一次commit的的状态,不影响新增的文件。

git reset --hard

解决每次都需要输入用户名密码问题

如果我们git clone的代码选择 https://而不是git@git (ssh)
当我们操作git pull/push的时候,总是提示我们输入账号和密码才能操作成功,
频繁的输入账号和密码会很麻烦。

git config --global credential.helper store
 
git pull /git push #(第一次输入,后续就不用再次数据)

#或者用 ssh 这种形式推送/拉取代码
git@git (ssh) 

日志相关

查看当前分支

#显示当前分支全部 log
git log

#显示当前分支最近4条log
git log -n4

#只显示当前分支 commit 信息
git log -n4 --oneline

#图形化查看当前分支日志
git log --graph

查看其它分支

#查看 master 分支 log
git log --graph  --oneline master

查看所有分支

#图形化查看所有分支
git log --all --graph

图形化单行显示所有分支的 commit 信息
git log --all --graph --oneline

分支相关

列出所有本地分支

git branch -v

创建分支并切换到该分支

# 新分支 temp
git checkout -b temp

删除分支

#普通删除
git branch -d 分支名

#强力删除
git branch -D 分支名

commit 相关

修改最新的 commit 描述信息

通过 git commit --amend命令修改当前的 commitmessage信息。

修改老旧的 commit 描述信息

使用 git rebase -i指定 commit父 commit id,进入一个文件交互框,
然后将 pick 修改为reword/r,然后保存退出
会再进行一个文件交互框,这个时候修改commit信息,再保存退出。

把多个连续的 commit 描述信息合并成1个

git rebase -i beab99bb7d
  • pick 的意思是要会执行这个 commit
  • squash 的意思是这个 commit 会被合并到前一个commit

修改完成后,按esc键,冒号,输入wq进行保存。
之后会继续跳转到commit message 的编辑界面:

把多个不连续的 commit 描述信息合并成1个

假如是不连续的话,那么你也是拿最早的commit id来执行

git  rebase -i  commit id

然后进入弹出框,你会看到 pick中没有最早你要合并的那个 commitid
这里你需要按照列表的格式把最早的 commit id复制到顶部
格式就是 pick commit id XXX,这个XXX就表示注释(可有可无)
然后再把你要合并的几个commit一定复制到当前这个新加的pick下面,
然后修改成 (s commit id XXXX),有几个写几个,把重复的去掉,然后保存即可。

比较差异

比较暂存区和HEAD所含文件的差异

在修改完文件,add后添加到暂存区,
想比较暂存区与HEAD区别,可以通过git diff --cached进行比较

比较工作区和暂存区所含文件的差异

#另外可以通过在后面加上文件名指定显示,否则默认是展示所有文件的不同点
git --no-pager diff 

恢复相关

让暂存区恢复成和HEAD的一样

可以通过git restore --staged指定文件恢复,或者git reset HEAD

让工作区的文件恢复为和暂存区一样

git restore 文件名

取消暂存区部分文件的更改

git restore --staged 文件名

消除最近的几次提交

恢复到某次commit

#工作区和暂存区都会变成对应commit文件状态
git reset --hard 51e9dc395

业务相关

开发中临时加塞了紧急任务怎么处理?

通过stash能够将工作目录中和暂存区的内容暂时保存;
在添加了a和c文件,并且修改了bb文件,stash后不会保存新增的a和c
需要通过add a和c,再stash才会将其进行保存;
恢复的时候,pop会删除 stash历史记录,apply不会

git stash
git stash list
git pop

不同人修改了不同文件如何处理?

我们在别人修改并且push之前,已经pull/fetch到本地后,
别人在修改了一个文件ApushGitHub
此时我们在本地修改文件B,在push的时候会报错。
那么就需要通过使用git fetch,然后再git merge,最后git push

git pull其实等于git fetchgit merge两个操作,完成本地与远端的同步,如果相同文件

不同人修改了同文件的不同区域如何处理?

git pull
git push

不同人修改了同文件的同一区域如何处理?

git pull
#解决冲突(协商看保留谁的内容)
git add
git commit
git push

同时变更了文件名和文件内容如何处理?

git pull
#解决冲突(协商看保留谁的内容,以及文明名称)
git add
git commit
git push

把同一文件改成了不同的文件名如何处理?

git pull,本地会出现别人修改后的文件名文件,
git status 根据提示 addrm 文件,最后push

远程相关

把本地仓库同步到远程

git remote add github git@github.com:ragpo/git-learning.git

git remote -v

git branch -av

git push github

Tag 相关

显示已有标签

git tag

新建标签

创建一个含附注类型的标签非常简单
-a(译注:取 annotated 的首字母)指定标签名字即可

git tag -a tag_name -m 'Some Messages'

删除标签

删除本地标签:

git tag -d tag_name

删除remote标签 :

git push --delete origin tag_name

推送标签到github 将本地所有标签推送到remote:

git push origin --tags

危险操作

禁止向集成分支执行push -f操作

GitHubgitlab提供禁止push -f的操作配置。

禁止向集成分支执行变更历史的操作

改了之后其他人会很麻烦

.git 文件夹分析

查看HEAD

HEAD的内容是指向 refs/heads/,指代当前在哪个分支下面

config

config文件里面的user字段可以通过命令行来设置,
也可以通过命令来获取,如果修改了文件,命令行也是能读取到的。

refs

refs里面包含了本repo所包含的分支(head)和tag,
例如 master 分支的内容,就是某次commit

git cat-file -t a4a63945 是查看这个哈希值所代表的类型。可能包含:commit
git cat-file -p a4a63945 就展示这个哈希值的内容。可能包含:tree、bloc、

object

object 里面包含了对象,分为 tree、commit、blob、tag。
tree 可以理解为一个文件夹,里面包含了blob,
blob 可以理解为是一个具体的文件
tag 类似一个开发阶段成果,基于某次commit。

通过git cat-file -p 哈希值,可以看到内容

commit、tree 和 blob 三个对象之间的关系

commit: 提交时的镜像
tree: 文件夹
blob: 文件

一次commit就对应着对当前时间仓库内的所有文件做了一次快照;
一次commit对应着一个tree,tree 类似文件夹,一个tree下面又可以包含多个tree
tree下面可以包含文件,也就是blob,但是blob没有具体名字,

因为git的存储机制是基于相同文件的内容就认为是同一个blob
在有多个相同文件时,就能节省实际的存储空间。

git 提交规范

来源网络

  • [func] do sth:功能开发
  • [fixbug] #xx# do sth:Bug 修改,#号内为 issue 编号
  • [docs] do sth:文档
  • [chore] do sth:build相关的修改
  • [test] do sth:添加测试代码
  • [optimize] do sth: 优化部分代码
  • [style] do sth: 格式化上的格式化、删除空白行等,无关功能

-END-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_龙衣

赏杯快乐水喝喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值