一、Git 基础概念题
1.1 Git 基本概念
Q1: Git 和 SVN 的主要区别是什么?
Git - 分布式版本控制系统 - 每个开发者都有完整的代码仓库历史 - 支持离线操作,本地提交 - 分支创建和合并非常快速 # SVN - 集中式版本控制系统 - 只有一个中央仓库 - 需要网络连接进行大多数操作 - 分支操作较慢
Q2: 什么是工作区、暂存区和版本库?
工作区(Working Directory):本地编辑的文件 暂存区(Staging Area):准备提交的文件快照 版本库(Repository):提交历史记录存储
Q3: Git 的三种状态是什么?
- 已修改(modified):文件已修改但未暂存 - 已暂存(staged):文件已添加到暂存区 - 已提交(committed):文件已提交到版本库
1.2 Git 配置相关
Q4: 如何配置全局用户名和邮箱?
git config --global user.name "你的姓名" git config --global user.email "你的邮箱"
Q5: 查看当前 Git 配置的命令?
git config --list # 查看所有配置 git config user.name # 查看用户名 git config user.email # 查看邮箱
二、Git 基本操作题
2.1 仓库初始化与克隆
Q6: 如何初始化一个新的 Git 仓库?
git init # 初始化新仓库 git init --bare # 初始化裸仓库(服务器用)
Q7: 克隆仓库的几种方式?
git clone https://github.com/user/repo.git # HTTPS方式 git clone git@github.com:user/repo.git # SSH方式 git clone /path/to/repo # 本地路径
2.2 文件操作命令
Q8: 添加文件到暂存区的命令?
git add filename.txt # 添加特定文件 git add . # 添加所有修改文件 git add -A # 添加所有变化(包括删除) git add -u # 只添加已跟踪文件的变化
Q9: 提交代码的命令和选项?
git commit -m "提交信息" # 基本提交 git commit -am "提交信息" # 添加并提交已跟踪文件 git commit --amend # 修改最后一次提交
Q10: 查看状态的命令?
git status # 查看工作区状态 git status -s # 简洁状态显示
三、Git 分支管理题
3.1 分支基础操作
Q11: 分支相关的基本命令?
git branch # 查看本地分支 git branch -a # 查看所有分支(包括远程) git branch new-branch # 创建新分支 git checkout branch-name # 切换分支 git switch branch-name # 新版本切换分支(推荐) git checkout -b new-branch # 创建并切换分支
Q12: 删除分支的命令?
git branch -d branch-name # 删除已合并的分支 git branch -D branch-name # 强制删除分支 git push origin --delete branch-name # 删除远程分支
3.2 分支合并与变基
Q13: merge 和 rebase 的区别?
# merge - 合并(保留历史记录) git checkout main git merge feature-branch # 创建新的合并提交 # rebase - 变基(线性历史) git checkout feature-branch git rebase main # 将特性分支变基到主分支
Q14: 什么情况下使用 merge?什么情况下使用 rebase?
使用 merge 当: - 公共分支(如 main、develop) - 需要保留完整合并历史 - 团队协作,避免重写历史 使用 rebase 当: - 个人特性分支 - 希望保持线性历史 - 清理提交记录
Q15: 解决冲突的步骤?
1. git status # 查看冲突文件 2. 编辑文件,解决冲突(<<<<<<<, =======, >>>>>>>) 3. git add resolved-file # 标记冲突已解决 4. git commit # 完成合并
四、Git 远程仓库题
4.1 远程仓库操作
Q16: 如何添加远程仓库?
git remote add origin https://github.com/user/repo.git git remote -v # 查看远程仓库 git remote show origin # 查看远程仓库详情
Q17: 推送代码到远程仓库?
git push -u origin main # 首次推送并建立跟踪 git push # 后续推送 git push --force # 强制推送(谨慎使用)
Q18: 拉取代码的几种方式?
git pull # 拉取并合并(fetch + merge) git pull --rebase # 拉取并变基 git fetch # 只获取不合并 git fetch --prune # 获取并清理已删除的远程分支
4.2 远程分支管理
Q19: 如何跟踪远程分支?
git checkout -b local-branch origin/remote-branch git branch --set-upstream-to=origin/remote-branch local-branch
Q20: 什么是 upstream?
upstream 是本地分支跟踪的远程分支,用于: - git pull/push 时知道操作哪个远程分支 - 简化分支操作命令
五、Git 高级操作题
5.1 撤销操作
Q21: 如何撤销工作区的修改?
git checkout -- filename # 撤销单个文件修改 git restore filename # 新版本撤销修改 git checkout -- . # 撤销所有修改
Q22: 如何撤销暂存区的文件?
git reset HEAD filename # 从暂存区移除文件 git restore --staged filename # 新版本命令
Q23: 如何撤销提交?
git reset --soft HEAD~1 # 撤销提交但保留修改在暂存区 git reset --mixed HEAD~1 # 撤销提交,修改保留在工作区 git reset --hard HEAD~1 # 彻底撤销提交和修改 git revert HEAD # 创建新的提交来撤销之前的提交
5.2 历史记录操作
Q24: 查看提交历史的命令?
git log # 查看提交历史 git log --oneline # 简洁显示 git log --graph # 图形化显示分支合并 git log -p # 显示具体修改内容 git log --since="2023-01-01" # 按时间筛选
Q25: 如何修改提交信息?
git commit --amend # 修改最后一次提交信息 git rebase -i HEAD~3 # 交互式变基修改多个提交
六、Git 场景应用题
6.1 团队协作场景
Q26: 如何参与开源项目?
1. fork 原项目到自己的账户 2. git clone 自己fork的项目 3. 添加原项目为 upstream:git remote add upstream 原项目URL 4. 创建特性分支进行开发 5. 推送到自己的fork仓库 6. 创建 Pull Request
Q27: 代码回滚的几种方式?
# 方式1:revert(推荐,安全) git revert commit-hash # 创建新的提交来撤销 # 方式2:reset(危险,会重写历史) git reset --hard commit-hash # 彻底回滚到指定提交 # 方式3:通过新分支修复 git checkout -b fix-branch commit-hash
6.2 故障处理场景
Q28: 如何恢复误删的分支?
git reflog # 查看所有操作记录 git checkout -b new-branch commit-hash # 根据记录恢复
Q29: 如何清理仓库历史?
git gc # 垃圾回收,优化仓库 git prune # 清理不可达对象
Q30: 大文件处理方案?
# 使用 Git LFS(Large File Storage) git lfs install # 安装LFS git lfs track "*.psd" # 跟踪大文件类型 git add .gitattributes # 添加跟踪配置
七、Git 原理深入题
7.1 Git 内部原理
Q31: Git 是如何存储数据的?
Git 核心对象: - blob 对象:存储文件内容 - tree 对象:存储目录结构 - commit 对象:存储提交信息 - tag 对象:存储标签信息 所有对象通过 SHA-1 哈希值唯一标识
Q32: 什么是 .git 目录?
.git/ ├── HEAD # 当前分支引用 ├── config # 仓库配置 ├── objects/ # 所有Git对象 ├── refs/ # 分支和标签引用 └── index # 暂存区信息
Q33: Git 的三种文件状态转换流程?
graph LR A[工作区] -->|git add| B[暂存区] B -->|git commit| C[版本库] C -->|git checkout| A
八、Git 工作流题
8.1 常见工作流模式
Q34: Git Flow 工作流是什么?
主要分支: - main:主分支,稳定版本 - develop:开发分支 - feature/*:特性分支 - release/*:发布分支 - hotfix/*:热修复分支
Q35: GitHub Flow 的特点?
- 只有 main 分支是长期分支 - 每个特性都创建新分支 - 通过 Pull Request 进行代码审查 - 合并后立即部署
Q36: GitLab Flow 的优势?
- 环境分支:production、staging 等 - 发布分支与版本标签结合 - 更适合持续交付场景
九、Git 实战编程题
9.1 命令行操作题
Q37: 请写出完成以下任务的命令序列:
# 1. 克隆仓库 git clone https://github.com/user/repo.git cd repo # 2. 创建并切换到新分支 git checkout -b feature-login # 3. 添加新文件并提交 echo "login function" > login.py git add login.py git commit -m "Add login functionality" # 4. 推送到远程 git push -u origin feature-login # 5. 创建 Pull Request(在GitHub界面操作)
Q38: 如何将多个提交合并为一个?
git rebase -i HEAD~3 # 在编辑器中将后两个提交标记为 "squash" # 保存后编辑最终的提交信息
十、Git 最佳实践题
10.1 提交规范
Q39: 好的提交信息应该包含什么?
格式:<类型>(<范围>): <主题> 示例: feat(auth): add user login functionality fix(api): resolve null pointer exception docs(readme): update installation instructions
Q40: Git 使用的最佳实践?
1. 提交前先拉取最新代码 2. 保持提交的原子性(一个功能一个提交) 3. 编写清晰的提交信息 4. 定期推送代码到远程 5. 使用分支进行功能开发 6. 代码审查后再合并 7. 谨慎使用 --force 推送
面试准备建议
理论知识准备
-
理解Git核心概念:工作区、暂存区、版本库
-
掌握分支管理:merge vs rebase的区别
-
熟悉远程操作:push、pull、fetch的区别
实践技能准备
-
熟练使用命令行:至少掌握30个常用命令
-
解决冲突能力:实际练习合并冲突解决
-
工作流理解:熟悉团队协作流程
场景问题准备
-
准备实际案例:描述你使用Git解决的具体问题
-
团队协作经验:说明你在团队中的Git使用经验
-
故障处理能力:展示你解决Git问题的能力
这份全面的Git面试题汇总涵盖了从基础到高级的所有重要知识点,建议结合实际操作进行学习和准备。