一、主观题

1. 你会使用 Git 吗?(以面试者的口吻回答,要详细)

Git 是一个分布式版本控制系统,能在工作中高效管理代码版本、协作开发和解决冲突。

核心能力:

  • 日常操作
    使用 git clone 复制远程仓库,git addgit commit 提交更改,git push/pull 同步远程代码,以及 git branch/merge 管理分支。
  • 高级功能
    git stash 暂存未完成的工作,用 git rebase 整理提交历史,并通过 git reflog 恢复误操作。
    • 例如,在团队协作中,创建 feature 分支开发新功能,完成后通过 PR 合并到 main 分支。
  • 场景经验
    曾处理过代码冲突:手动编辑冲突文件 → git add 标记解决 → git commit 完成合并。我还配置过 .gitignore 忽略编译文件(如 target/),确保仓库整洁。

2. 列举工作中常用的几个 git 命令?(以面试者的口吻回答,要详细)

工作中最常用的 Git 命令包括:

  1. git status
    查看工作区和暂存区状态。例如修改文件后运行它,会显示 modified: file.txt,提示未提交的变更。
  2. **git add -A**或者git add .
    将所有变更添加到暂存区。若只添加特定文件,用 git add file.txt
  3. git commit -m "message"
    提交暂存区的变更到本地仓库。例如 git commit -m "修复登录逻辑" 会生成一个带描述的新版本。
  4. git push origin main
    推送本地提交到远程仓库的 main 分支。首次推送需关联分支:git push -u origin main
  5. git pull
    拉取远程最新代码并自动合并(等价于 git fetch + git merge)。若本地有未提交变更,需先用 git stash 暂存。
  6. git checkout -b feature
    创建并切换到新分支(如 feature)。完成后用 git merge feature 合并回主分支。

3. 简单介绍一下 Git 的工作流程(以面试者的口吻回答,要详细)

Git 的标准工作流程分为五步:

  1. 克隆仓库
    git clone 仓库地址 下载远程仓库到本地。
  2. 创建分支
    基于 main 分支新建开发分支:git checkout -b dev
  3. 开发与提交
    在工作区修改代码 → git add -A 添加到暂存区 → git commit -m "描述" 提交到本地仓库。
  4. 同步远程
    定期 git pull origin main 拉取团队更新,避免冲突;开发完成后 git push origin dev 推送分支。
  5. 合并与部署
    提交 PR/MR 请求将 dev 合并到 main,通过代码审核后部署到生产环境。

4. Git 是用什么语言编写的?

Git 主要使用 C 语言编写,部分脚本用 Shell 和 Perl 实现。C 语言的高效性使 Git 能快速处理大型项目(如 Linux 内核)。

5. 什么是 git stash? 什么是 git stash drop?

  • git stash

    临时保存工作区的未提交变更,方便切换分支或拉取代码。例如:

    1
    2
    3
    git stash        # 保存变更
    git pull # 拉取远程代码
    git stash pop # 恢复变更
  • git stash drop
    删除指定的暂存条目。

    • 例如 git stash drop stash@{0} 删除第一次保存的内容。
    • git stash pop(恢复后自动删除)不同,drop 只删除不恢复。

6. 我提交版本是写了版本描述,发现写的不好,想修改,怎么修改?

使用 git commit --amend 修改最近一次提交的描述:

1
git commit --amend -m "新描述"  # 直接替换描述

若需修改提交内容,先更新文件 → git add -A → 再运行git commit --amend

注意:若已推送到远程,需强制推送(git push --force),但可能影响团队协作,应谨慎使用。

7. 大公司的分支一般有哪些分支? 这些分支的工作流程是什么?

大公司常用 Git Flow 分支模型:

  • 分支类型
    • main/master:生产环境代码,仅存放稳定版本。
    • develop:集成分支,合并所有新功能。
    • feature/*:功能分支,从 develop 分出,开发完成后合并回 develop
    • release/*:预发布分支,用于测试和修复 Bug,合并到 maindevelop
    • hotfix/*:热修复分支,从 main 分出,紧急修复生产环境问题。
  • 工作流程
    1. 新功能在 feature/login 分支开发。
    2. 完成 → 提交 PR 合并到 develop
    3. 测试通过 → 从 develop 创建 release/v1.0 分支。
    4. 预发布测试 → 合并到 main 并打标签(git tag v1.0)。
    5. 生产环境 Bug → 从 main 创建 hotfix/issue1,修复后合并回 maindevelop

8. 练习一下分支合并(没有冲突和有冲突)

  • 无冲突合并

    1
    2
    3
    git checkout main         # 切换到目标分支
    git merge feature-login # 合并 feature-login 分支
    git push origin main # 推送合并结果

    若两分支无重叠修改,Git 自动完成合并(Fast-forward)。

  • 有冲突合并

    1. 合并时报错:CONFLICT (content): Merge conflict in file.txt

    2. 打开冲突文件,手动解决(删除 <<<<<<< ======= >>>>>>> 标记)。

    3. 标记解决:

      1
      2
      git add file.txt      # 添加解决后的文件
      git commit -m "解决合并冲突" # 完成合并

9. 练习一下抓取远程分支和推送指定的分支到远程

  • 抓取远程分支:

    1
    2
    git fetch origin         # 获取远程所有分支信息
    git checkout -b dev origin/dev # 创建本地分支并关联远程分支
  • 推送指定分支:

    1
    git push origin dev  # 推送本地 dev 分支到远程 dev

10. 什么是 clone 克隆、branch 分支和 fork 复刻?区别是什么?

  • Clone(克隆)
    复制远程仓库到本地,如 git clone https://gitee.com/project.git,创建完整的本地副本。

  • Branch(分支)
    在仓库内创建独立开发线,如 git branch feature,用于隔离开发新功能。

  • Fork(复刻)
    在代码平台(如 Gitee)复制他人仓库到自己的账户,创建独立新仓库,用于贡献开源项目。

  • 区别:

    | 操作 | 范围 | 目的 |
    | :