(十一)Git 面试题详解(2024)

303 阅读9分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 11 天,点击查看活动详情

一、Git 操作的基本结构

  1. 工作区(Workspace):基本文件的存放区(开发位置)
  2. 暂存区(Index/Stage):基本文件添加到暂存区后才会被 Git 管理(提交、更新)
  3. 本地仓库(Repository):本地的文件管理区域,提交代码或者更新代码的位置
  4. 远程代码托管中心(Remote):联合开发时,统一的文件联网管理中心
  5. 关系图:

image-20220419201209987

二、个人开发时 git 的使用

注册 github 或者码云账号(官网注册即可)

Git 官方下载地址(windows 版):Git - Downloading Package

为仓库生成和添加 SSH 公钥

详细可访问:生成/添加 SSH 公钥 - Gitee.com

Git 全局设置

直接进入命令行工具(如 cmd)中执行

git config --global user.name "用户名"
git config --global user.email "邮箱地址"

新建仓库

注:按顺序执行以下所有命令

1. 在命令行工具(git 或者 cmd 或者 powershell)建立 git 仓库

mkdir vue_shop  --  建立 vue_shop 文件夹
cd vue_shop  --  进入 vue_shop 文件根目录
git init  --  初始化 git 仓库
touch README.md  --  添加 readme 说明
git add README.md  --  把 readme 说明添加到暂存区
git commit -m "第一次提交"  --  把暂存区的文件推送到本地仓库
git remote add origin  新建仓库的 SSH 地址  --  将本地仓库与 git 仓库进行关联
git push -u origin master  --  将本地仓库主分支推送到 git 仓库

建议在 github 或者码云中直接新建仓库

2. 如果已有仓库

cd existing_git_repo  --  此处可以直接进入项目根目录, 右键进入命令行工具(git 或者 cmd 或者 powershell)
git remote add origin  已有仓库的 SSH 地址
git push -u origin master  --  将本地仓库主分支推送到 git 仓库

在项目中开发新模块前

此时也可以直接在 vscode 中的终端进行,记得先点击+号新建终端

以下粗体命令为必需命令,黑色命令为协助检查命令,以防错误

在当前项目下

  1. git status  -- 查看当前工作区状态(查看工作区是否干净)

  2. git branch  -- 查看当前是否在master主分支

  3. git checkout -b login  -- 创建新子分支login,并切换到login分支

  4. git branch  -- 查看当前是否在login子分支

  5. git push -u origin login  -- 将本地子分支login推送到git仓库(使git仓库中也有login这个分支),第一次推送不能直接用 git push

项目新模块开发完成后

此时可以直接在 vscode 中的终端进行,记得先点击+号新建终端

  1. git status  -- 查看当前工作区状态(查看工作区内修改和新增的文件,这些文件状态都为红色,以及当前是否在 login 子分支)

  2. git add .  --- 将所有修改和新增的文件都添加到暂存区

  3. git status  -- 查看当前工作区状态(文件是否已全部添加,添加的文字状态都为绿色)

  4. git commit -m "文本信息"  -- 把暂存区中的所有文件提交到本地仓库,并添加注释信息(注:此时只是将本地仓库的代码进行了更新,还需要将git仓库的代码进行同步更新)

  5. git branch  -- 查看当前所在分支,即 login子分支(提交的文件都被提交到login子分支)

  6. git push  -- 将本地更新的login分支推送到git仓库中的login分支(git中已有login分支,非第一次推送login,直接 git push  即可)

注:以下是对本地仓库的操作

  1. git checkout master  -- 切换到master主分支(从login子分支切换到master主分支)

  2. git branch  -- 查看当前所在分支(是否在master主分支)

  3. git merge login  -- 基于master主分支,将login子分支的文件全部合并到master主分支

注:此时只是将本地仓库的代码进行了更新,还需要将git仓库的代码进行同步更新

  1. git branch  -- 查看当前所在分支(是否在master主分支)

  2. git push  -- 将本地更新的master推送到git仓库中(更新git中的master

如果你对以上步骤不太清晰,请按顺序记住加粗的命令即可正确完成项目在 git 仓库中的更新。你也可以仔细阅读下面更详细的内容,方便你对 git 的理解。

三、Git 的常用命令

本地库的操作

新建 Git 管理库

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

签名配置

签名是 git 提交代码时的用户标识

  • 用户签名:git config user.name “[name]” 、 git config user.email “[email address]” 案例:git config user.name “xxxx”、git config user.email “xxx@qq.com

  • 系统签名:git config --global user.name “[name]” 、git config --global user.email “[email address]”

注意: Git 会采用就近原则,如果设置了用户签名就会覆盖系统签名

查看信息

  • git status:显示当前 git 库所有有变量的文件(查看管理库的当前状态)

暂存区的操作

  • git add [file1] [file2]:将工作区新增/修改的文件添加到暂存区
  • git add .:将当前目录下的所有文件添加到暂存区
  • git reset [file]:撤销暂存区的文件,工作区不变
  • git commit -m “备注” [file]:将暂存区的内容提交到本地库

历史记录的操作

查看:

  • git log:显示当前本地库的历史提交记录
  • git log --pretty=oneline:以单行的方式简化显示本地库的历史提交记录
  • git log --oneline:以更简化的 hash 值显示本地库提交的历史记录
  • git reflog:显示当前历史版本的全部操作过程

版本的选择:

  • git reset --hard [版本的哈希索引值]:表示当前版本设置为指定的某个历史版本
  • git reset --hard HEAD^: 表示当前的版本后退一步,n 个^表示后退 n 歩
  • git reset --hard HEAD~n:指定后退 n 歩

找回删除的文件

  • 删除的文件的操作已经提交的本地库:通过指定历史未删除的版本找回
  • 删除文件的操作未提交到本地库:git checkout [file]

文件差异比较

  • git diff [file]:将工作区的文件和暂存区的文件进行比较
  • git diff [hash 索引值] [file]:将本地库的某个历史版本和工作区的文件进行比较
  • git diff:将工作区和本地库的所有文件进行比较

分支的处理

什么是分支?

分支就是在当前的版本控制的主线上,复制一份出来,形成一个支线,所有的代码管理都可以对这个支线进行操作。对支线的操作不会对主线造成任何影响。这条支线就是所谓的分支。

分支的应用场景

在项目开发过程中,可能会需要开发一些周期比较长并且不急于上线的功能,如果直接在当前的主线上进行版本控制,可能会对当前主线的代码造成污染,但是从代码的安全性角度来说,又不能不进行版本管理,这个时候就可以考虑分支进行开发。

分支的操作

  • git branch -v:查看当前的分支情况
  • git branch [分支名]:创建分支
  • git checkout [分支名]:切换分支
  • git push origin --delete [分支名]:删除远程分支(需要将分支切换到master才能删除其他子分支)

注意:切换分支的时候,工作区中没有提交到本地库的文件会继续保留,被提交到工作区的文件有可能会消失

  • git merge [有新内容的分支名]:合并分支

注意:合并分支的时候,需要定位到被合并的分支上,然后再执行merge命令将有新内容的分支合并过来。

比如:需要将分支 1 合并到主分支上,先要通过 git checkout [主分支] 的命令定位到主分支,再执行 git merge [分支 1]的命令进行合并

冲突的解决:

如果主干和分支都修改了某个文件的相同的位置,就会发生所谓的冲突,这个时候需要进行冲突的解决:

  1. 找到冲突的文件进行编辑
  2. 按照具体的业务需求修改成合适的情况
  3. git add 添加修改后的文件到暂存区
  4. git commit 命令提交修改后的文件到本地库
  • git branch --merged:查询哪些分支合并入当前分支
  • git branch --no-merged:查询没有和当前分支合并过的其他分支
  • git branch -d [分支名]:删除分支

注意:如果该分支没有合并到主分支,则会删除失败,需要通过 git branch -D [分支名] 的方式强制删除

远程库的操作

  • git remote -v:显示所有远程仓库
  • git remote add [alias] [url]:新增一个远程仓库
  • git push [alias] [分支名]:将指定分支推送到远程仓库上
  • git push [alias] --all:推送所有分支到远程库
  • git clone [url]:克隆远程仓库的文件到本地库,并且初始化本地库
  • git pull [alias] [分支名]:将远程仓库上的变动拉取到本地库并且合并

拉取项目中的某一个文件

下面以克隆开源项目druid 下的/druid/doc 目录为例

mkdir druid
cd druid
git init // 初始化空仓库
git remote add -f origin <https://github.com/alibaba/druid.git> // 关联远程地址 ,这一步不要终止执行,不然下面操作无效
git config core.sparsecheckout true // 开启 Sparse Checkout 模式
echo "doc" >> .git/info/sparse-checkout // 设置需 Check Out 的文件。直接从项目目录下开始
git pull origin master // Check Out

Clone 项目后与另一个仓库关联

  1. git remote rm origin -- 取消项目与当前仓库的远程链接
  2. git remote add origin xxxxx -- 建立项目与目标仓库的远程链接
  3. git push -u origin master -- 将项目推送到目标仓库

拉取目标仓库中项目的部分文件

  1. mkdir project -- 创建新文件夹
  2. cd project -- 进入该文件夹
  3. git init -- 初始化 git 本地仓库
  4. git remote add -f origin -- 将远程 git 仓库与本地仓库关联
  5. git config core.sparsecheckout true -- 开启 Sparse Checkout 模式
  6. 选择需要 clone 的文件,作为列表保存到 .git/info/sparse-checkout 中
  7. git pull origin master -- 从分支中拉取需要的文件

补充第 6 步:

echo “test.txt” >> .git/info/sparse-checkout
echotest/test1” >> .git/info/sparse-checkout
echotest” >> .git/info/sparse-checkout

fork 和 clone,fetch 和 pull 的区别

PR 操作