Git常用命令

发布于:2024-12-20 ⋅ 阅读:(14) ⋅ 点赞:(0)


Git流程

在这里插入图片描述
在这里插入图片描述

- Git的四个存储区

  • Workspace:工作区
  • Index(Stage):暂存区
  • Repository:本地仓库
  • Remote:远程仓库

- Git文件的四种状态

在这里插入图片描述

  • Untracked: 未跟踪

    文件在文件夹中, 但并没有加入到git库, 不参与版本控制。

    • 如果执行git add状态变为Staged
  • Staged: 暂存

    文件通过git add加入了版本管理,文件状态变为Staged

    • 如果执行git commit将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件状态变为Unmodify
    • 如果执行git reset HEAD filename取消暂存, 文件状态变为Modified
  • Untracked: 文件已经入库, 未修改

    文件通过git commit将修改同步到库中,此时版本库中的文件快照内容与文件夹中完全一致,文件状态变为Unmodify

    • 如果文件被修改, 文件状态变为Modified
    • 如果执行git rm将文件移出版本库,文件状态变为Untracked
  • Modified: 文件已修改

    执行了git commit的文件随后被修改, 文件状态变为Modified

    • 如果执行git add,状态变为Staged
    • 如果执行git checkout,则丢弃修改过, 状态变回Untracked(git checkout即从库中取出文件, 覆盖当前修改)

Git名词含义

- HEAD

HEAD 是当前分支引用的指针,它总是指向某次commit,默认是上一次的commit。 这表示 HEAD 将是下一次提交的父结点。 通常可以把 HEAD 看做你的上一次提交的快照,表示当前分支的最新版本。

HEAD的指向是可以改变的,比如你提交了commit,切换了仓库,分支,或者回滚了版本,切换了tag等。

HEAD并非只能指向分支的最顶端(时间节点距今最近的那个),实际上它可以指向任何一个节点。

- HEAD、HEAD~ 、HEAD^

HEAD表示当前分支的最新版本。

在HEAD后面加 ^ 或者 ~ 其实就是以 HEAD 为基准,来表示之前的版本

  • HEAD~ 和 HEAD^ 都是指次新版本,也就是倒数第二个版本
  • HEAD~~ 和 HEAD^^ 都是指次次新版本,也就是倒数第三个版本,以此类推

- HEAD~ 、HEAD^后面加数字

  • 数字为0:HEAD~0、HEAD^0都等同于HEAD,都是指当前最新版本
  • 数字为1:HEAD~1、HEAD^1等同于HEAD~、HEAD^,都是指前一个版本(当数字为1时可以省略)
  • 数字大于1:HEAD~n、HEAD^n都是指前n个版本

Git命令

命令汇总

命令 作用
help 查看支持的Git命令
init 创建本地Git代码库
clone 下载远程Git代码库
config 操作Git本地项目配置、全局配置、系统配置
status 查看当前仓库的状态
diff 对比工作区,暂存区,仓库的差异
add 将工作区的修改添加到暂存区
commit 将暂存区的修改提交到本地仓库
log 查看提交历史(不能查看已经删除了的commit记录)
reflog 查看本地仓库的所有操作记录(包括已经被删除的commit记录)
rm 删除暂存区、工作区的文件
reset 回退到某一个版本
revert 回退某个修改
push 将本地仓库代码推送到远程仓库
branch 操作分支
checkout 创建切换分支
switch 创建切换分支
remote 操作远程分支
fetch 拉取远程分支最新的commit到本地仓库
merge 合并分支
pull 从远程仓库拉取代码到工作空间,等于fetch+pull
rebase 合并提交
stash 隐藏修改
tag 管理标签
show 查看标签信息

- help

查看全部Git子命令

git help -a

查看Git版本

git version

- init

# 在当前目录新建一个Git代码库
git init
 
# 新建一个目录,将其初始化为Git代码库
git init [project-name]

- clone

# 下载一个项目和它的整个代码历史
git clone [url]

Git的全局配置文件为.gitconfig,Git的项目配置文件为config。

- config

1. 查看配置文件
格式:git config [–local|–global–system] --list

  • local:仓库配置(本地项目配置)
  • global:全局配置
  • system:系统配置
# 仓库配置
git config --local --list

# 全局配置
git config --global --list

# 系统配置
git config --system --list

# 最终配置(三个配置整合后的配置信息)
git config --list

2. 编辑配置文件
命令参数 --edit,简写-e
格式:git config [–local|–global|–system] --edit

# 编辑仓库配置
git config --local -e

# 编辑全局配置
git config --global -e

# 编辑系统配置
git config --system -e

3. 编辑单个配置

# 配置用户名、邮箱
# 配置本地仓库用户名、邮箱
git config user.name "Your Name"
git config user.email "xxx@qq.com"

# 配置全局用户名、邮箱
git config --global user.name "Your Name"
git config --global user.email "xxx@qq.com"

4. 增加配置
格式: git config --local|–global|–system] --add key value

git config --global --add user.sex 22

5. 获取单个配置
格式:git config [–local|–global|–system] –get section.key
默认是获取local配置中内容

git config --global --get user.name

6. 删除单个配置
格式:git config [–local|–global|–system] –unset key

git config --global --unset user.sex

- status

# 查看指定文件状态
git status [file-name]

# 查看所有文件状态
git status

- diff

# 最新本地版本库和工作区所有文件的区别
git diff HEAD -- . 

# 最新本地版本库和工作区指定文件的区别
git diff HEAD -- [file-name]

# 本地上一个版本和工作区文件的区别
git diff HEAD^ -- [file-name]

# 本地分支和远程分支的区别
git diff [local branch] origin/[remote branch]

- add

# 从工作区添加指定文件到暂存区
git add [file-name1] [file-name2] ... 

# 从工作区添加指定目录到暂存区(包括子目录)
git add [dir]

# 将工作区当前目录下被修改的文件和新增的文件提交到暂存区,不包括被删除的文件(.指当前目录,Git 2.x版本后也包括被删除的文件)
git add . 

# 将工作区当前目录下被修改的文件和被删除的文件提交到暂存区,不包括新增的文(u指update)
git add -u . 

# 将工作区当前目录下被修改、被删除、新增的文件都提交到暂存区(A指all)
git add -A . 

- commit

# 将暂存区所有文件添加到本地仓库
git commit -m [massage]

# 将暂存区指定文件添加到本地仓库
git commit [file-name-1] [file-name-2] -m [massage]

# 将工作区的内容直接加入本地仓库
git commit -am [massage]

# 快速将当前文件修改合并到最新的commit,不会产生新的commit。在提交commit后发现还有部分文件修改忘记提交了可以是用该命令
git commit --amend 

-m是指直接在后面写上版本的注释,不加-m的话会用一个vim打开文件让你写入massage,有未追踪的文件将会失败,需要add加入暂存区。

- log

# 显示所有commit日志
git log

# 查看最新n条commit日志数据
git log -n

# 将日志缩写为单行显示
git log --pretty=oneline

# 查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit

# 查看分叉历史,包括:提交历史、各个分支的指向以及项目的分支分叉情况。
git log --oneline --decorate --graph --all 

- reflog

# 显示操作本地版本库的命令日志,包括commit和reset等
git reflog

在回退版本以后又后悔找不到commit id了可以使用此命令查看历史。

- rm

# 删除暂存区的文件
git rm --cached [file-name]

# 删除所有暂存区的文件,且删除所有工作区的物理文件
git rm -rf . 

- reset

对版本进行操作,主要用于版本回退(丢弃后面的提交)
格式:git reset --{soft|(mixed)|hard} HEAD

  • soft:最新版本指向指定的commit-id,取消之后的commit,保留暂存区,保留工作区(取消commit,保留add)
  • mixed:最新版本指向指定的commit-id,取消之后的commit,重置暂存区,保留工作区(取消commit,取消add)
  • hard:最新版本指向指定的commit-id,取消之后的commit,重置暂存区,重置工作区(取消commit,取消add,重置工作区)
参数 本地仓库版本 暂存区 工作区
soft 回退,指向指定版本 保留指定版本之后变动 保留指定版本之后变动
mixed 回退,指向指定版本 重置指定版本之后变动 保留指定版本之后变动
hard 回退,指向指定版本 重置指定版本之后变动 重置指定版本之后变动
# 向前回退一个版本,保留暂存区文件变动,保留工作区文件变动
git reset --soft HEAD^
git reset --soft HEAD^1
git reset --soft HEAD~
git reset --soft HEAD~1

# 向前回退一个版本,重置暂存区文件变动,保留工作区文件变动
git reset --mixed HEAD^
git reset --mixed HEAD^1
git reset --mixed HEAD~
git reset --mixed HEAD~1

git reset HEAD^
git reset HEAD^1
git reset HEAD~
git reset HEAD~1

# 向前回退一个版本,重置暂存区文件变动,重置工作区文件变动
git reset --hard HEAD^
git reset --hard HEAD^1
git reset --hard HEAD~
git reset --hard HEAD~1

- revert

对版本进行操作,主要用于版本回退(保留后面的提交)

revert与reset的区别:

  • revert 使用一个新的commit 来回滚你希望回滚的commit, reset 是直接HEAD 指向回退的commit
  • revert 只会回滚你希望回滚的哪一个commit的操作,不会影响其他的,reset 由于指针回退了,因此这个commit 之后的commit都会消失。
  • 一般使用时,如果已经push了,使用revert,如果没有,就是用reset

举例说明:
在这里插入图片描述

在这里插入图片描述

  • reset 切换版本是会删除丢弃最新的版本的,HEAD会直接跳到指定版本,但是还是可以通过reflog找回。
  • revert 会将指定的bug版本视为bug版,会将当前版本中的bug版的代码删除,生成新的commit覆盖掉当前commit,但是commit-id是不会变的。

- push

# 推送当前本地分支到远程仓库
git push

# 推送当前本地分支到远程仓库指定分支
git push origin [branch-name] 

# 强制提交,当我们本地reset到旧的版本时,然后普通push会被拦截,因为此是本地HEAD指向比远程库还要旧
git push -f 

- branch

分支操作

# 创建分支
git branch [branch-name]

# 查看当前分支
git branch

#查看本地和远程的所有分支
git branch -a 

# 查看远程所有分支
git branch -r

# 删除一个分支
git branch -d [branch-name]

#  强制删除一个没有合并的分支
git branch -D [branch-name]

# 把本地分支和远程分支进行连接
git branch --set-upstream-to=origin/[branch-name] [branch-name]

- checkout

切换分支:

# 切换分支
git checkout [branch]

# 创建并切换分支
git checkout -b [new-branch-name]

覆盖工作区指定文件:

git checkout -- [file-name]
  • 用暂存区的文件覆盖掉工作区的文件
  • 如果暂存区没有可更新的就会用commit的文件更新工作区的文件
  • 前面需要加上–,如果前面没加–可能会出问题:
    • 会优先把file-name当作切换分支看待,执行分支切换
    • 只有当没有file-name这个分支时,才会把它当作文件覆盖

- switch

# 创建新分支并切换到该分支
git switch -c [branch-name]

# 切换到已有分支
git switch [branch-name]

- remote

# 远程地址关联远程仓库
git remote add origin

# 查看本地添加了哪些远程分支地址
git remote

# 查看本地添加了哪些远程分支地址更详细信息
git remote -v

# 删除本地指定的远程地址
git remote remove origin

- fetch

# 拉取远程分支最新的commit到本地仓库的origin/[branch-name]
git fetch

- merge

# 合并本地origin/[branch-name]和HEAD->[branch-name]的代码,并同步到工作空间
git merge

#  用于合并指定分支到当前分支
git merge [branch-name]

# 退出当前分支合并,当合并后冲突很多,要撤回合并分支就可以用这个命令
git merge --quit

# 不使用Fast forward合并分支,这样会创建新的commit,所以需要massage。这样被合并的分支HEAD指向是会变的。
# 如果使用了Fast forward方式合并分支,那么删除次要分支的时候历史分支记录也会被删除,这样就无法追寻分支合拼信息了。
git merge --no-ff -m [massage] [branch-name]

- pull

# 从远程仓库拉取代码到工作空间
git pull

pull 和 fetch的关系:
pull = fetch + merge

- rebase

# 合并前2个历史提交
git rebase -i HEAD~2

合并提交时,会弹出vim修改信息,修改第二行的pick为s,或者为squash,squash为合并的意识,然后保存退出编辑,会打开第二个vim编辑,合并并修改commit内容,保存退出会产生一个新的commit id,这样就合并了两个commit

- stash

隐藏当前工作的修改。避免发生在切换到别的分支后,将然后自己的半成品代码带入其他分支,这样就发生很多不必要的麻烦。

# 隐藏当前工作的修改
git stash

# 隐藏当前工作的修改,并添加备注,方便查找
git stash save message

# 查看隐藏的工作信息列表
git stash list

# 删除隐藏的工作信息
git stash drop

# 恢复隐藏的工作信息,同时删除隐藏的工作信息
git stash pop

# 恢复指定的隐藏工作信息,但是不会删除隐藏的工作信息
git stash apply [stash@{0}]

- tag

标签管理

# 查看所有标签
git tag

# 给当前最新的commit打上标签
git tag [version]

# 给指定的commit-id打上标签
git tag [version] [commit-id]

# 给指定的commit-id打上标签并附上说明文字
git tag -a [version] -m [massage] [commit-id]

# 删除标签
git tag -d [version]

- show

查看标签信息

# 查看标签的详细信息
git show [tag-name]