Skip to content
0

Git - 常用命令

NOTE

下面我们学习 Git 在本地常用的命令,也是开发经常用到的命令。

2022-02-08 @Young Kbt

Git常用命令

本地命令

命令名称作用
git config --global user.name 用户名设置用户签名
git config --global user.email 邮箱设置用户签名
git init初始化本地库
git status查看本地库状态
git add 文件名(-A 代表目录及子目录下所有文件名)添加到暂存区
git commit -m "日志信息" [文件名](不加文件名,默认所有文件都添加该日志信息)添加到本地库
git reflog查看历史记录(简要)
git log查看历史记录(详细)
git log --pretty=oneline一行显示一个版本信息(版本号完整)
git log --oneline一行显示一个版本信息(版本号简写)
git reset --hard 版本号版本穿梭、跳转
git diff [文件名]比较工作区中和暂存区的文件
git diff [本地库中历史版本] [文件名]比较工作区中的文件和本地库历史记录
git branch 分支名创建分支
git branch -D 分支名删除分支
git branch -m 新的分支名将当前分支名改为新的分支名
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名合并分支

远程命令

命令名称作用
git remote -v查看当前所有远程地址别名
git remote add 别名 远程地址起别名
git push 别名 分支推送本地分支上的内容到远程仓库
git clone 远程地址将远程仓库的内容克隆到本地
git pull 远程库地址别名 远程分支名将远程仓库对于分支最新内容拉下来后与 当前本地分支直接合并

如果 git push 不加别名和分支,默认别名是 origin,分支是 master。

我们 clone 项目会自动做如下操作:

  • 拉取代码
  • 初始化本地仓库
  • 创建别名,默认是 origin

具体看 Git - SSH免密登录

设置用户签名

项目级别/仓库级别

仅在当前本地库范围内有效。

sh
git config user.name 用户名
git config user.email 邮箱

信息保存位置:./.git/config 文件里。

系统用户级别

登录当前操作系统的用户范围。

sh
git config --global user.name 用户名
git config --global user.email 邮箱

image-20220208133344605

信息保存位置:设置了用户签名,会在用户盘下生成 .gitconfig 文件,里面也可以直接修改自己的信息。

级别优先级

  • 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

  • 如果只有系统用户级别的签名,就以系统用户级别的签名为准

  • 二者都没有不允许

说明

签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码

邮箱可以是虚拟邮箱,Git 不会去识别。

注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系。

初始化本地库

基本语法:

sh
git init

该指令会将目录下的所有子目录以及文件交给 Git 管理,也是我们使用 Git 最重要的一步。

执行该指令后,会在当前目录下生成 .git 目录,该目录默认是隐藏的。

注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。

查看本地库状态

查看工作区、暂存区状态。

基本语法:

sh
git status

image-20220208134440861

可以看到,我删除了 3 个文件,还没有放到暂存区(红色),存到了暂存区(绿色),存到了本地库(消失)。

文件增删改操作

删除暂存区的文件

sh
git rm --cached 文件名

添加文件到暂存区

sh
git add 文件名
git add -A  # -A 代表全名文件

提交文件到本地库

sh
git commit -m "日志信息" [文件名] # 文件名可不写

历史版本操作

查看历史版本

sh
git log   # 查看详细版本信息
git reflog  # 查看简要版本信息
git log --pretty=oneline  # 一行显示一个版本信息(版本号完整)
git log --oneline  # 一行显示一个版本信息(版本号简写)

多屏显示控制方式:

  • 空格向下翻页

  • b 向上翻页

  • q 退出

切换历史版本

  • 基于索引值操作[推荐]

    sh
    git reset --hard [局部索引值]
    git reset --hard a6ace91   # 例子
  • 使用 ^ 符号:只能后退

    sh
    git reset --hard HEAD^

    注:一个 ^ 表示后退一步,n 个表示后退。

  • 使用 ~ 符号:只能后退

    sh
    git reset --hard HEAD~n

    注:表示后退 n 步。

  • 使用 HEAD 符号,恢复当前提交本地库的版本

    git reset --hard HEAD

    注:在当前版本中删除了某个文件,可以恢复到当前最初的版本。

reset 命令的三个参数对比

  • --soft 参数

    • 仅仅在本地库移动 HEAD 指针
  • --mixed 参数

    • 在本地库移动 HEAD 指针
    • 重置暂存区
  • --hard 参数

    • 在本地库移动 HEAD 指针
    • 重置暂存区
    • 重置工作区

比较文件操作

将工作区中的文件和暂存区进行比较

sh
git diff [文件名]

将工作区中的文件和本地库历史记录比较

sh
git diff [本地库中历史版本] [文件名]

不带文件名则比较多个文件。

如果 [本地库中历史版本] 是 HEAD,则比较当前版本。

分支操作

image-20220208142253151

什么是分支?

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

image-20220208142308410

分支的好处?

同时并行推进多个功能开发,提高开发效率。

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

分支操作

命令名称作用
git branch 分支名创建分支
git branch -D 分支名删除分支
git branch -m 新的分支名将当前分支名改为新的分支名
git branch -v查看分支
git checkout 分支名切换分支
git merge 分支名合并分支

创建分支

sh
git branch [分支名]

删除分支

sh
git branch -D 分支名

将当前分支名改为新的分支名

git branch -m 新的分支名

查看分支

sh
git branch -v

切换分支

sh
git checkout [分支名]

合并分支

  • 第一步:切换到接受修改的分支(被合并,增加新内容)上

    sh
    git checkout [被合并的分支名]
  • 第二步:执行 merge 命令

    sh
    git merge [有新内容的分支名]

分支冲突

产生冲突

冲突的表现:后面状态为 MERGING

image-20220208140823758

冲突产生的原因:合并分支时,两个分支在 同一个文件的同一个位置 有两套完全不同的修改。Git 无法替 我们决定使用哪一个。必须 人为决定 新代码内容。

冲突如图(修改的是同一个位置):

image-20220208152143419

解决冲突

冲突的解决:

  • 第一步:编辑文件,删除特殊符号

  • 第二步:把文件修改到满意的程度,保存退出

  • 第三步:添加到暂存区,git add [文件名]

  • 第四步:执行提交,git commit -m "日志信息"(注意:此时 commit 一定不能带具体文件名)

创建分支和切换分支图解

image-20220208142934045

master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD 决定的。所以创建分支的本质就是多创建一个指针。

HEAD 如果指向 master,那么我们现在就在 master 分支上。

HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。

分支进阶操作

删除所有记录

想清空所有 commit 的信息记录,就像形成一个全新的仓库,且代码不变。

  1. 先切换到新的分支

    sh
    git branch kele
    git checkout kele
  2. 添加所有文件到暂存区(除了 .gitignore 中排除的)

    sh
    git add -A
  3. 提交跟踪过的文件到本地库

    sh
    git commit -am "commit message"
  4. 删除 master 分支

    sh
    git branch -D master
  5. 重命名当前分支为 master

    sh
    git branch -m master
  6. 提交到远程 master 分支

    sh
    git push -f origin master

删除上次记录

如果只是想修改上次提交的代码,做一次更完美的 commit,可以这样:

  1. 回到到上个版本(注:不要带 --hard)

    sh
    git reset commitId
  2. 暂存修改

    sh
    git stash
  3. 强制 push,这样远程的最新的一次 commit 被删除

    git push --force
  4. 释放暂存的修改,开始修改代码

    sh
    git stash pop
  5. 添加、推送

    sh
    git add
    git commit -m "massage"
    git push

同时修改本地分支名和对应的远程分支名

修改前要确保本地分支的代码是最新的,并且修改后不会影响到同事的代码。

  1. 修改本地分支名
sh
git branch -m oldBranchName newBranchName
  1. 删除远程分支
sh
git push origin :oldBranchName
  1. 改名后的本地分支推送到远程
sh
git push --set-upstream origin newBranchName
最近更新