一、主观题

  1. git stash 练习,练习步骤

1.创建并克隆仓库:

2.本地修改1.txt文件

3.远程修改1.txt文件,并提交版本

4.执行git pull 报错 (因本地有未提交修改,与远程冲突)

5.执行git stash存储工作区修改,使用git stash list查看存储栈

6.执行git pull 拉取远程最新版本(此时本地无修改,可顺利合并)

7.使用git stash pop 恢复之前暂存的修改(自动尝试合并,若冲突需手动解决)

8.手动编辑冲突文件,解决冲突后执行 git add -A 标记为已解决

9.提交合并结果并上传远程仓库 git push

2. git show有什么作用?

git show 命令用于显示 Git 仓库中对象(如提交 commit、标签 tag、文件 blob 等)的详细信息。默认显示最近一次提交的元数据和变更内容。

是查看历史变更和对象内容的核心命令。

3. git blame 有什么作用?

git blame 用于逐行显示文件中每行代码的最后修改者、提交哈希、修改时间和具体内容,帮助追踪代码变更历史和责任归属。

运行 git blame <文件路径> 可直观看到每行的“责任人”和修改上下文。

对代码审查、Bug 追溯、交接维护非常有用。

4. 再练习一遍撤销还原操作

4.1 工作区撤销(丢弃工作区未暂存的修改)

  1. 在工作区修改了文件

  2. 使用git status 查看那些文件被修改了

  3. 使用以下任一命令丢弃修改,恢复到最近一次提交的状态:

    使用git checkout – 被恢复的文件

1
2
3
4
git status
git checkout -- readme.txt
// 或者
git restore readme.txt

4.2 暂存盘软撤销(取消暂存,保留工作区内容

  1. 在工作区修改文件
  2. 使用 git add 添加到暂存区
  3. 使用 git status 查看状态
  4. 取消暂存(但保留工作区内容):

方法1(传统):

1
2
3
git status
git reset HEAD readme.txt # 取消暂存
git checkout -- readme.txt # 丢弃工作区修改(可选)

方法2(推荐,Git 2.23+):

1
2
git restore --staged readme.txt		# 取消暂存
git restore readme.txt # 丢弃工作区修改(可选)

注意:先修改一下文件,然后使用git add 将修改过后的文件添加到暂存盘,然后做上面的练习

1.工作区修改文件,添加至暂存区:

2.使用git status查看查看状态:

使用 git reset HEAD 文件名 取消暂存 + git checkout -- 文件名 丢弃修改:

4.3 暂存盘硬撤销(恢复修改前的工作区内容)(取消暂存并丢弃工作区修改)

1
2
3
4
将被修改了文件添加到暂存盘
# 假设文件已修改并 add 到暂存区
git restore --staged 1.txt # 取消暂存
git restore 1.txt # 丢弃工作区所有修改,恢复到 HEAD 状态

4.2 版本软回滚(保留工作区和暂存区内容,仅移动 HEAD)

git reset –soft 短版本号

目标:回滚到 22222 提交(3bfdc42),但保留当前 1.txt 的所有内容(包括 33333)

1
git reset --soft 3bfdc42

此时提交历史回到 3bfdc42,但工作区和暂存区保持不变,可重新 commit。

4.3 版本硬回滚(工作区内容也恢复)(工作区、暂存区、HEAD 全部回退)

git reset –hard 短版本号

目标:彻底回滚到 11111 提交(2acb598),工作区内容也恢复成那时的样子

⚠️ 此操作不可逆!未提交的修改将永久丢失。

4.4 恢复恢复刚才的 33333 提交,找回被 reset –hard 删除的提交

使用 git reflog 查看 HEAD 移动历史,找到被删除提交的哈希:

1
2
git reflog
git reset --hard 8e1f554 # 恢复到指定提交

5. git reset 和 git revert的区别?

  • git revert:创建一个新的提交来“撤销”旧提交的变更,原提交历史保留。安全,适用于共享分支。
    示例:git revert <commit-id> 会生成一个反向提交。

  • git reset:将 HEAD、暂存区、工作区重置到指定提交,之后的提交会被“丢弃”(可通过 reflog 恢复)。会改写历史,仅适用于本地或未推送分支。

    三种模式:

    • --soft:仅移动 HEAD
    • --mixed(默认):移动 HEAD + 重置暂存区
    • --hard:移动 HEAD + 重置暂存区 + 重置工作区

git revert是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;

git reset是回到某次提交,提交及之前的commit都会被保留,但是此commit id之后的修改都会被删除

6. 练习git revert,假设有4个版本,我将回滚到版本2,然后合并修改之后新增版本2增强版,如何实现?

查看提交历史:git log --oneline

找到要撤销的提交(如版本3和版本4),执行:

1
2
git revert <版本4的commit-id>
git revert <版本3的commit-id>

这会生成两个新提交,撤销版本3和4的变更,此时代码状态等同于“版本2”,但历史保留版本3、4、revert1、revert2。

在此基础上继续开发“版本2增强版”,修改后提交:

1
2
3
# 修改文件
git add .
git commit -m "feat: 版本2增强版"

⚠️ 注意:git reset --hard 是直接回退历史,不适用于协作场景。revert 才是协作推荐方式。

7. git 可以同时支持几种仓库地址?

Git可以同时支持多种仓库地址,比如HTTPS和SSH

可以在本地仓库中使用git remote add命令为同一个远程仓库添加多个地址

8. 在gitee上克隆别人的仓库,默认克隆了几个分支?是否默认创建了远程仓库别名?你能否往这个仓库推送你的版本?

  • 默认只克隆默认分支(通常是 mainmaster)。

  • 自动创建远程别名 origin

  • 默认无推送权限(除非你是仓库协作者或拥有者)需要开发者权限。需 Fork 后克隆自己的仓库,修改后提交 Pull Request。

9. 一个文件添加到了git仓库,那么我删除这个文件,怎么恢复它?假如我想彻底从git仓库删除这个文件,该怎么做?

恢复已删除的文件(从最近提交中恢复):

1
2
3
git checkout -- 文件名
# 或
git restore 文件名

彻底从 Git 仓库删除文件(停止追踪并删除工作区文件):

1
2
git rm 文件名
git commit -m "删除文件"

若只想停止追踪但保留工作区文件:

1
2
git rm --cached 文件名
git commit -m "停止追踪文件"

git rm 不但会把工作区里面的文件删除,还会把版本库里面的文件也删除,做到彻底移除掉这个文件

10. 练习远程仓库、新增远程仓库、删除远程仓库、查看以及查看详细远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 克隆远程仓库
git clone 仓库地址

# 添加新远程仓库
git remote add 别名 仓库地址

# 查看所有远程仓库(简略)
git remote -v

# 查看某个远程仓库详细信息
git remote show 别名

# 删除远程仓库配置
git remote rm 别名

11. git pull和git push的区别?

  • git pull:从远程仓库拉取最新提交并自动合并到当前分支。相当于 git fetch + git merge
  • git push:将本地提交推送到远程仓库,更新远程分支。

12. git push -u 和git push -f 的区别是什么?

-u (或 --set-upstream)以非常安全的模式提交到远程,

​ 比如远 程早一个版本,它会提示你先git pull 拉取下来

-f 强制覆盖模式,强制推送,覆盖远程分支历史。危险操作!会丢弃远程分支上其他人的提交。

更安全替代:--force-with-lease(仅在远程未更新时强制推送)

13. 假如我从远程克隆了一个项目,然后我想给这个项目贡献自己的代码?你的理解你应该接下来怎么办?

需要修改

  1. Fork 项目到自己的账号下(如果是开源项目)。
  2. 克隆自己的 Fork:git clone 自己的仓库地址
  3. 创建新分支开发:git checkout -b feature/xxx
  4. 修改、提交:git add . && git commit -m "message"
  5. 推送到自己的远程:git push origin feature/xxx
  6. 在网页端发起 Pull Request(PR)到原项目。
  7. 等待审核合并。

14. 我能不能 不经过git add 直接 git commit 提交一个版本?

不行,在 Git 中必须先将变更(git add)添加到暂存区(Stage/Index),然后才能提交(git commit)。这是 Git 的基本工作流程。

15. 有哪些指令可以知道git 仓库改动的信息?

  • git status:查看工作区和暂存区状态(修改、新增、删除)
  • git diff:查看工作区与暂存区差异
  • git diff --cached:查看暂存区与 HEAD 差异
  • git log:查看提交历史
  • git log -p:查看提交历史及每次变更详情
  • git reflog:查看 HEAD 移动记录(包括 reset、checkout 等)
  • git show <commit>:查看某次提交的详情
  • git blame <file>:查看文件每行最后修改者

16. 我有一个项目,想要git来做版本控制管理,第一步应该做什么?

初始化本地 Git 仓库,使用命令git init,生成 .git 目录。

然后添加文件并首次提交:

1
2
git add .
git commit -m "Initial commit"

17. 我有一个项目,5个人开发,你应该怎么做,才能确保这个5个可以互相协作开发不出乱子?你的计划是什么?

协作规范:

  1. 使用远程仓库(如 GitHub/GitLab/Gitee)作为中央仓库。
  2. 每人 Fork 或克隆仓库到本地。
  3. 基于分支开发:
    • main/master 分支保护,禁止直接推送。
    • 新功能/修复在 feature/xxxfix/xxx 分支开发。
  4. 每日开始前git pull origin main 同步主干。
  5. 开发完成后:推送分支到远程,发起 Pull Request/Merge Request。
  6. Code Review:团队成员审核代码后合并。
  7. 解决冲突:拉取最新主干,合并到自己分支解决冲突后再提 PR。
  8. 使用 .gitignore 忽略临时文件。
  9. 提交信息规范:清晰描述变更内容。

18. 早上9点公司例会,组长讨论了每个人今日的任务,你分到了一些bug修改,共10条bug,请问今天这一天你打算怎么安排修改?晚上下班前组长要求你们每个人提交今天的任务,你又该怎么做?

安排:

  1. 从主干拉取最新代码:git pull origin main
  2. 为这组 Bug 创建独立分支:git checkout -b fix/bug-set-20250917
  3. 逐个修复 Bug,每个 Bug 修复后单独提交(原子提交):
1
2
3
4
5
6
7
# 修复 bug1
git add .
git commit -m "fix: 修复用户登录失败问题 #123"
# 修复 bug2
git add .
git commit -m "fix: 修复购物车数量计算错误 #124"
...

晚上下班前:

  • 推送分支:git push origin fix/bug-set-20250917

  • 在 Git 平台发起 Merge Request / Pull Request 到 main 分支

  • 通知组长或相关同事进行 Code Review

  • 不要直接合并到主干(除非流程允许)

19. 接上面,假如你在修改上面的bug时,发现第5个bug,仍然存在问题,你现在想到另一种解决办法,你打算怎么样?

不要直接在原提交上修改

在当前分支继续修改代码,测试新方案。

新增一个提交:

1
2
git add .
git commit -m "fix: 优化第5个bug的解决方案,改用XX方法"

如果原提交有误,可考虑:

  • git commit --amend:如果尚未推送,可修改上一次提交。
  • 或使用 git revert 撤销原修复提交,再提交新方案(适用于已推送场景)。

避免使用 git reset 修改历史,以免影响协作。

20. 练习从远程克隆仓库到本地,然后做一些修改,修改后提交到远程仓库,顺利提交成功后,再练习本地修改后,再提交到远程,此时远程已经有人修改了比你早提交了版本,你提交不了,发生冲突了,你该如何解决后,提交到远程。

手动解决冲突:编辑冲突文件,删除 <<<<<<<=======>>>>>>> 标记,保留正确内容。

标记冲突已解决:

1
2
git add .
git commit -m "Merge remote changes and resolve conflicts"

再次推送:

1
git push origin main

二、 今晚默写和语音题

1. 如何创建和合并分支?(默写+语音朗读)

创建分支:

1
2
3
4
5
6
7
8
#新建一个分支,但依然停留在当前分支
git branch [branch-name]

# 新建一个分支,并切换到该分支
git checkout -b [branch]

# 新建一个分支,指向指定commit
git branch [branch] [commit]

合并分支:

1
2
3
4
5
#合并指定分支到当前分支
git merge [branch]

# 选择一个commit,合并进当前分支
git cherry-pick [commit]

2. 如何将本地仓库与远程仓库同步?(默写+语音朗读)

使用git fetchgit pull命令从远程仓库下载最新的提交和分支信息。

然后,使用git merge命令或git rebase命令将本地分支与远程分支合并。

最后,使用git push命令将本地提交推送到远程仓库。

答案在下面的网址

http://47.110.66.96/helper/guide/git.html#%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%92%8C%E5%90%88%E5%B9%B6%E5%88%86%E6%94%AF

三、 明天早上默写和语音题

1. 如何解决合并冲突?(默写+面试提问)

合并冲突发生在合并分支时,当两个分支的相同部分产生了不同的更改时,解决合并冲突一般步骤如下:

使用git status命令查看冲突的文件。

打开冲突文件,手动解决冲突并选择要保留的更改。

使用git add命令将解决冲突后的文件标记为已解决。

使用git commit命令提交解决冲突的结果

2. 如何将本地仓库与远程仓库同步?(默写+面试提问)

使用git fetchgit pull命令从远程仓库下载最新的提交和分支信息。

然后,使用git merge命令或git rebase命令将本地分支与远程分支合并

最后,使用git push命令将本地提交推送到远程仓库。

3. 如何创建和合并分支?(默写+面试提问)

使用git branch命令创建新分支,例如git branch bug

创建分支后,使用git checkout命令切换到新分支,例如git checkout bug

要将分支合并到当前分支,可以使用git merge命令,例如git merge dev

4. 请介绍git多人远程协作的流程?(默写+面试提问)

  1. 克隆远程仓库

首先,每个开发者需要将远程仓库克隆到本地:

1
git clone <远程仓库URL>
  1. 创建分支

为了隔离开发工作,开发者应基于主分支(如 main 或 master)创建新分支:

1
git checkout -b <分支名>
  1. 开发与提交

在本地分支上进行开发,完成后提交更改:

1
2
3
git add .

git commit -m "提交信息"
  1. 推送分支

将本地分支推送到远程仓库:

1
git push origin <分支名>
  1. 创建 Pull Request (PR)

在远程仓库(如 GitHub、GitLab)上,基于推送的分支创建 PR,请求将更改合并到主分支。

  1. 代码审查

团队成员审查 PR,提出修改建议。开发者根据反馈更新代码,并推送新的提交。

  1. 合并 Pull Request (PR)

审查通过后,将 PR 合并到主分支。

  1. 同步主分支

合并后,开发者应拉取最新的主分支到本地,保持同步:

1
2
3
git checkout main

git pull origin main
  1. 删除已合并的分支

合并完成后,可以删除远程和本地的已合并分支:

1
2
3
git push origin --delete <分支名>

git branch -d <分支名>
  1. 处理冲突

如果多人修改了同一文件,可能会产生冲突。解决冲突后,标记冲突已解决并提交:

1
2
3
git add <冲突文件>

git commit -m "解决冲突"
  1. 持续集成

许多团队使用 CI/CD 工具(如 JenkinsGitHub Actions)自动测试和部署代码,确保每次合并后的代码质量。

  1. 定期同步

开发者应定期拉取主分支,保持本地代码与远程仓库同步,减少冲突。

总结:

多人协作的关键在于:

使用分支隔离开发

通过 PR 进行代码审查

定期同步主分支

及时解决冲突