likes
comments
collection
share

Git 基本概念及常用操作

作者站长头像
站长
· 阅读数 55

常用的 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(工作区和暂存区也清空,慎用)

六 多人协作

多分支集成协作:

  • 不同人修改了不同文件或同文件的不同区:
    1. git fecth [别的分支名];
    2. git branch -av 查看情况;
    3. 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
评论
请登录