Git 学习笔记
写篇文章记录一下自己学习 git 的历程。开门见山,git 是什么就不说了,既然学习它,还是要知道学的是个什么东西。直接开始吧~
安装,配置
1.下载安装
https://git-scm.com/book/zh/v2/起步-安装-Git
根据自己系统选择不同的安装软件即可,安装成功后可使用 git --version 查看当前安装的 git 版本
2.配置 user 信息
user 代表当前的用户标识,有 name 和 email,下面是配置用户命令
git config --global user.name 'xxx' git config --global user.email 'xxx@xx.com'
-- global 代表全局设置,一般常用的还有 --local ,设置的是当前具有 git 控制的项目中的用户标识
3.查看 user 配置
user 是配置的一种,可以使用 git config --list 查看,同样可以查看 全局 或 当前项目 配置
git config --list --global
git config --list --local
4.git 时间格式配置
我们在使用 git log 查看时,显示的时间是这样的:
看起来不够直观,可以配置一下格式:
git config --global log.date format:"%Y-%m-%d %H:%M:%S"
配置好后的时间格式:
通过 git 管理项目
场景1:把已有项目纳入 git 管理
进入项目根目录,使用命令:
git init
场景2:新建项目直接用 git 管理
在当前路径创建项目 xxx,使用命令:
git init xxx cd xxx
开发时使用 Git 的基本流程
创建或修改本地文件 -> 暂存当前修改(git add) -> 提交本次修改 (git commit) ...
工作区 暂存区 本地仓库
git 基础命令
git 保存变更内容到暂存区
多个目标用空格隔开,保存 xxx.js 文件和 xxx 文件夹的变更到暂存区
git add xxx.js xxx
如果有多个文件变更,可以使用下面的命令全部提交到暂存区,也可在后面加上对应的路径:
git add -A git add -u git add .
-A 是 --all 的缩写,-A 和 . 在新版 git 中含义相同,提交所有修改。-u 则只添加修改和删除的,不添加新增的。
git 暂存区
查看暂存区内容
git status
撤销暂存区内容,xxx 对应文件,不填则对所有文件操作
git reset HEAD xxx
撤销本地修改,改为暂存区内容,xxx 为文件名字
git checkout -- xxx
git 提交
提交暂存区变更到本地仓库,-m 为本次变更的备注:
git commit -m '备注'
或者可以不进行 add 操作,直接将修改内容提交(不推荐):
git commit -am 'xxx'
消除最近几次提交(慎用):消除 xxx commit 后的所有 commit 数据;如果 xxx 为 HEAD 则直接放弃所有工作区和暂存区更改
git reset --hard xxx
git 修改提交信息
注意:这些操作仅是在本地操作时使用,如果已经提交到远程分支,慎用
修改最新一次的提交信息
git commit --amend
修改以前的 commit 信息;输入命令后会新打开一个文件,根据提示信息,在需要修改的那个分支前,将 pick 改成 reword 保存并退出;然后会进入那次分支的 message 文件,编辑保存退出就修改好了
git rebase -i xxx
把连续的几个 commit 合并起来:还是同样命令,进入上图文件,保留第一行和最后一行 pick ,将需要合并的改成 squash 这样就合并了
把间隔的几个 commit 合并起来:调整 commit 位置,使其连续,操作与上述相同
git 查看日志
git log
一般而言,如果一个任务需要修改多个文件,最好是每次修改一部分后添加到暂存区,全部修改完后再一起提交,git log 的其它用法:
简洁的显示 --oneline
git log --oneline
支持看固定条数 2条,4条 --n[x]
git log -n2 --oneline git log -n4 --oneline
查看所有分支 --all
git log --all
图形化 log 显示 --graph
git log --graph
以上几个方式都可以组合使用,可以更清晰的看到 log 信息
git 分支
查看分支;-a 查看所有,包括远程仓库分支;-v 分支最新信息;
git branch git branch -a git branch -v
新建分支;checkout 为创建分支;-b 是创建后并切换到该分支;xxx 是分支的名字; yyy 是基于该分支创建,可以不填,默认基于当前分支
同样的 checkout 也可以指向某次 commit ,具体后面的 git 小技巧会说到
git checkout -b xxx yyy
删除分支;-d 删除分支(未合并的情况下无法删除) 或者是 -D (强制删除)
git branch -d xxx
git 比较差异
比较 工作区 和 暂存区 的差异,如果只看对应文件,可以加上 -- 后跟多个文件名
git diff
比较 暂存区 和当前仓库 HEAD 的差异
git diff --cached
比较 commit 之间差异,可以使用 diff 命令;xxx 和 yyy 可以是两个不同的 commit;或者是使用 HEAD 指向比较,HEAD 后的 ^ 代表与其父亲比较,可以有多个,~ 则是向前查找多次
git diff xxx yyy git diff HEAD HEAD^ git diff HEAD HEAD~2
比较分支之间的差异;xxx yyy 均为分支名字(其实就是两个分支最新的 commit 比较);-- 后跟你想看的文件,部填则是全部
git diff xxx yyy -- abc.js
git 文件操作
修改文件名:一般我们直接修改文件名的话,git 会提示有文件被删除,且有一个新文件出现,我们需要先 git add 添加新文件,然后 git rm 删除 git 中管理的旧文件,git 才会提醒文件名变更。
但是如果直接使用 git mv 命令修改文件名,则不需要这么繁琐:
git mv xxx xxs
删除文件:
git rm xxx
git 隐藏功能
可以将工作区的更改先隐藏起来
git stash
查看隐藏内容
git stash list
取出隐藏的内容
# 取出来后就删除隐藏变更
git stash pop
# 取出来后依旧保留变更
git stash apply
git 仓库的备份
git 仓库备份与克隆类似,--bare 为不带工作区内容,只备份仓库内容;xxx 为协议地址,name 为备份名字;支持哑协议(传输进度不可见),智能协议(进度可见),http,ssh
git clone --bare xxx name
git 图形化界面
除了 git gui 图形化工具之外呢,我们还可以使用 gitk 命令调出 git 自带的的图形化界面
git 的三大对象:commit tree blob
git commit:每次提交后都会生成一个 commit 对象
git tree:文件 tree,每次 commit 对应了一个 tree,相当于一个快照
git blob:真正的文件内容,只包含内容,只要文件内容相同,就对应一个文件,依赖于 tree
每个对象都有自己的哈希值标识,我们可以使用 cat-file 命令查看对应哈希是什么,以及其内容
# 查看 xxx hsah 对应的文件类型 git cat-file -t xxx # 查看 xxx hsah 对应的文件内容 git cat-file -p xxx
三大对象简图:
.git 文件夹的小知识
HEAD:储存当前工作区指向,一般都是分支
config:当前配置
refs:引用,存放 branch,tags 的地方
objects:储存的文件内容(只要任何文件的内容相同,那就是唯一的一个 blob)
git 小技巧
分离 HEAD 指针(有一定风险):
使用 checkout 指向一次 commit,这种情况下,HEAD 并没有指向一个分支,你所做的操作在切换分支后可能都会被 git 清除掉
试用场景:在某个分支进行某些尝试,然后并不需要保留它,checkout 后这些尝试都不会去保存
假设你在分离指针后,突然想保留这次提交了,那可以新建一个分支来保留它:
# xxx:branch name
git switch -c xxx
如何设置某些文件不纳入版本控制
使用 .gitignore 在里面添加对应的规范
...... 持续更新中