Git 基本概念及常用操作
常用的 Git 命令及概念梳理……
一般工作中使用的编辑工具, 比如 VSCode 等都提供了 Git 操作的图形界面,结合常用的命令,一般场景都能处理。 Git 的功能是很丰富的,有很多的命令和参数,也有许多奇妙的用法,不过在随手可用的图形界面下,很多命令和参数用不到,甚至也不好验证测试,况且即便通过验证测试学会了也记不住。所以就这样吧。
一 配置用户信息
作用域参数:
--local: 只对某个仓库有效(cd 进入某仓库下执行)
--global:对当前用户所有仓库有效(默认)
--system: 对系统所有登录的用户有效
优先级:local > global > system
设置:
git config --global user.name 'your name'
git config --global user.email 'xxx@xxx.xxx'
查看设置:
git config --list
git config --list --global
二 Git 的四个状态
四个状态分别是 untrack,modified,staged 和 committed。
状态 | 说明 |
---|---|
untrack | 未被跟踪。指文件没有被 git 记录跟踪,比如新建的文件 |
modified | 被 git 记录跟踪的文件发生了变动的状态 |
staged | 暂存,通过 git add xx 命令,将 xx 文件放入暂存区的状态 |
committed | 已提交,通过 git commit -m '提交信息' 命令, 将暂存区的文件提交到版本库中 |
以上操作过程(状态的变化)跟网络都没有关系,都只是在本地。通过 git push 推送到远程仓库,这时才需要网络。
三 一般性常用命令
命令 | 说明 |
---|---|
git help -- web xxx | 用浏览器查看 xxx 命令详情 |
git init [project-name] | 对当前目录进行 git 初始化 |
git add fileName | 将fileName文件放入暂存区,文件进入git的管理状态 |
git commit -m 'commit msg' | 提交到版本库 |
git pull | 把远程代码更新到本地 |
git push | 把本地代码更新到远程仓库 |
git remote add origin 仓库地址 | 本地代码同步到远程仓库(name 可以不叫 origin,可以自定义) |
git remote rm [name] | 删除远程仓库 |
git remote rename [old_name] [new_name] | 修改远程仓库 |
git remote -v | 查看远程分支地址 |
git remote set-url origin [新地址] | 修改远程仓库地址 |
git clone 仓库地址 | 拉取仓库 |
git clone -b 分支名 仓库地址 | 按分支拉取仓库 |
git checkout 分支名 | 将头指针指向某分支 |
git checkout -b 分支名 [base分支] | 创建分支并切换到新分支(基于base或头指针指向的分支新建) |
git push --set-upstream origin 分支名 | 创建远程分支 |
git branch -d 分支名 | 删除不要的分支 |
git push origin -d 分支名 | 删除远程分支 |
git branch -v | 查看有多少分支 |
git log [-- all -- graph -- oneline -n4 ] | 查看当前分支日志 |
git mv 原文件名 新文件名 | 文件重命名 |
gitk -- all | 图形化界面 |
四 头指针HEAD
当执行 git checkout
分支名 时,HEAD
指针会指向该分支(.git/HEAD 文件的内容会变),并切换到该分支,此时进行增改删等操作都是在该分支内的操作。
但 git checkout
不限于切换分支,也可以 git checkout commitId(提交的 hash 值) ,HEAD 指针就会指向 commitId 这次提交,当前代码也是此次提交时的代码状态,此时就会 分离头指针。
如果在此基础上做了修改后,又想 checkout 到其他分支,可以不管这里的修改,这里的修改就会丢弃,不会影响其他分支;如果想保留,可以使用 git checkout -b newBranch
命令来为这次的提交新建一个分支,再把分支合并上去。
某些情况下,只是想做下调试,不想单建一个分支,也没有提交到版本库的意思,那么就可以使用 分离头指针方法。
可以通过 git log
来查看当前头指针的指向。
HEAD
可以表示当前头指针的指向。
HEAD^1
表示当前指针父亲,也就是上一次头指针的指向;HEAD^1^1
表示当前指针父亲的父亲,上上次的头指针指向。
HEAD~2
,等同于 HEAD^1^1,~后面的数字可自定义。
五 常用功能
- 比较暂存区和 HEAD 文件:
git diff --cached
- 比较工作区和暂存区文件(所有变更的文件):
git diff [ -- fileName...]
(不加 fileName 会显示所有文件差异) - 比较 commit 差异:
git diff commitId commitId [ -- fileName...]
(不加 fileName 会显示所有文件差异) - 比较分支差异:
git diff 分支名 分支名 [ -- fileName...]
(不加 fileName 会显示所有文件差异) - 让暂存区恢复成HEAD:
git reset HEAD [-- fileName ]
(不加 fileName 会让所有的文件恢复) - 让工作区恢复成暂存区:
git checkout -- fileName
- 删除文件:
git rm fileName
- 修改最近的一次的 commit 信息:
git commit --amend
(进入 vi 模式修改) - 修改或合并之前的 commit 信息:
git rebase -i commitId
(进入 vi 模式,注意看注释,r修改,s合并) - 一并撤销commit和git add 操作:git reset --mixed HEAD^ 或 git reset HEAD^(不删除工作空间改动代码)
- 撤回上次commit操作:git reset --soft HEAD^(不删除工作空间改动代码)
- 消除最近几次的 commit:
git reset --hard commitId
(工作区和暂存区也清空,慎用)
六 多人协作
多分支集成协作:
- 不同人修改了不同文件或同文件的不同区:
- git fecth [别的分支名];
- git branch -av 查看情况;
- git merge [需要合并到本地的分支名]
- 不同人修改了同文件的同一区域:git 不能自动合并,需要根据差异提示,人为修改文件,之后再次 commit。
七 加塞任务:git stash
当需要放下当前任务去修改另一项任务,而当前任务的代码不能污染另一个任务时,可以将当前任务的代码缓存并移除。后续再恢复。
git stash 可以将本地没提交的内容(工作区和暂存区)进行缓存并从当前分支移除,缓存的数据结构为堆栈,先进后出。
查看缓存列表:git stash list
将缓存应用到当前分支: git stash apply [指定缓存名]
将缓存应用到当前分支并删除该条缓存: git stash pop [指定缓存名]
删除缓存:git stash drop 指定缓存名
删除全部缓存:git stash clear
显示缓存与当前分支差异: git stash show [指定缓存名]
八 .git 文件
执行 git init 命令会在当前目录下生成 .git 文件。其中主要的目录有:
HEAD文件:引用,指向当前工作的分支(refs目录)
config文件:git 配置信息
refs文件夹:heads(分支) / tags(标签)
objects文件夹:存放具体文件(commit/tree/blob)
git 三大类型:commit/ tree / blob。
一次提交(commit)对应一个 tree,tree 下包含 tree(文件夹)和 blob(文件),blob 内是文件的具体内容。需要注意的是,blob 的内容和文件名是分开的无关的,只要内容一样,git 会认为是同样的,所以改了文件名而没改变内容,提交后 objects 目录下内容就不会变。
git cat-file -t commitId // 查看文件类型(commit/tree/blob)
git cat-file -p commitId // 查看文件内容
查看 tree 和 blob 是同样的方式,id 不一定要全写,支持模糊匹配。有兴趣的话可以到 .git 目录下自行研究,或研究 Git 的原理,这里不多说。
指定不需要git管理的文件:添加 .gitignore 文件
转载自:https://juejin.cn/post/7380009750925230106