多选题:

1、以下哪些命令可以查看历史或差异?( )

  1. git log –oneline
  2. git diff HEAD~1 HEAD
  3. git show commit_id
  4. git blame filename

参考答案:ABCD

选项解析:

  1. git log –oneline
    • 正确。该命令用于查看提交历史,以简洁的一行格式显示每个提交的信息(提交ID和消息)。它属于“查看历史”范畴。
  2. git diff HEAD~1 HEAD
    • 正确。该命令比较两个提交之间的差异:HEAD~1 表示前一个提交,HEAD 表示当前提交。它显示文件内容的变化,属于“查看差异”范畴。
  3. git show commit_id
    • 正确。该命令显示指定提交(通过 commit_id)的详细信息,包括提交元数据和文件差异(diff)。因此,它既能查看历史(提交信息),又能查看差异(文件变化)。
  4. git blame filename
    • 正确。该命令显示文件中每一行的最后修改信息,包括提交ID、作者和修改时间。它用于“查看历史”(追踪文件的变更来源),虽然不是传统差异比较,但能帮助理解变更历史。

2、以下关于分支的说法,正确的是?( )

  1. git checkout -b feature 会创建并切换到 feature 分支
  2. git branch 命令默认列出所有本地分支
  3. 删除远程分支的命令是 git push origin –delete branchname
  4. git merge 会产生合并提交,而 git rebase 不会产生

参考答案:ABCD

选项解析:

  1. git checkout -b feature 会创建并切换到 feature 分支
    • 正确。这是 Git 的标准语法:-b 选项表示创建新分支并立即切换到它。例如,git checkout -b feature 会基于当前分支创建 feature 分支并切换过去。
  2. git branch 命令默认列出所有本地分支
    • 正确git branch 不加任何参数时,默认列出所有本地分支(当前分支前标记 *)。如果要查看远程分支,需使用 git branch -rgit branch -a
  3. 删除远程分支的命令是 git push origin –delete branchname
    • 正确。这是删除远程分支的标准命令,例如 git push origin --delete feature 会删除名为 feature 的远程分支。它通过向远程仓库推送删除请求实现。

3、以下哪些操作可以用于撤销提交?( )

  1. git reset –hard HEAD~1
  2. git revert HEAD
  3. git commit –amend
  4. git checkout HEAD~1

参考答案:ABC

选项解析:

  1. git reset –hard HEAD~1
    • 正确。该命令将当前分支重置到前一个提交(HEAD~1),并丢弃工作区和暂存区的更改。它直接移除最新提交,适用于本地撤销(尚未推送的场景)。
  2. git revert HEAD
    • 正确。该命令创建一个新的提交来撤销指定提交(例如 HEAD)的更改。它不修改历史,而是添加一个逆向提交,适用于公共历史(如已推送的场景)。
  3. git commit –amend
    • 正确。该命令修改最新提交:可以更改提交消息或添加新更改到上一个提交中。它间接用于“撤销”提交,因为你可以修正错误内容(如移除敏感信息),效果上撤销了上一次提交的缺陷。
  4. git checkout HEAD~1
    • 错误。该命令检出前一个提交(HEAD~1)的状态,使工作区进入“分离头指针”模式。但这仅用于查看旧版本,不改变提交历史,也不撤销提交。工作区变化不会影响分支指针,因此不能用于撤销提交。

4、关于 git fetch 和 git pull,以下说法正确的是?( )

  1. git fetch 只下载远程更新,不自动合并
  2. git pull 等价于 git fetch + git merge
  3. git pull 比 git fetch 更安全,推荐优先使用
  4. git fetch 不会改变本地工作区内容

参考答案:ABD

选项解析:

  1. git fetch 只下载远程更新,不自动合并

    • 正确git fetch 从远程仓库下载最新数据(如新提交和分支),但只更新本地的远程跟踪分支(如 origin/main),不修改本地分支或工作区。需要手动合并(如 git merge)。
  2. git pull 等价于 git fetch + git merge

    • 正确git pullgit fetch(下载远程更新)后跟 git merge(合并到当前分支)的快捷方式。默认行为等同于 git fetch && git merge origin/current-branch
  3. git pull 比 git fetch 更安全,推荐优先使用

    • 错误

      。解析:

      • git pull 自动合并可能引入冲突或不稳定:因为它直接合并下载的更改,如果本地有未提交的更改,可能导致冲突或意外覆盖。
      • git fetch 更安全:它仅下载数据,让用户手动检查后再合并(例如 git log origin/main 查看差异),避免自动合并的风险。实践中,推荐优先使用 git fetch 以更好地控制流程。
  4. git fetch 不会改变本地工作区内容

    • 正确git fetch 只更新本地的远程引用(如 origin/main),不触及工作区文件、暂存区或本地分支。工作区保持原状。

5、以下哪些是 Git 的核心概念?( )

  1. 工作区(Working Directory)
  2. 暂存区(Staging Area)
  3. 本地仓库(Local Repository)
  4. 远程仓库(Remote Repository)

参考答案:ABCD

选项解析:

  1. 工作区(Working Directory)
    • 正确。工作区是用户编辑文件的目录,所有未跟踪或修改的文件都在此区域。它是 Git 工作流的起点。
  2. 暂存区(Staging Area)
    • 正确。暂存区(也称为索引)是临时存储区,用户通过 git add 将工作区的更改添加到这里,准备下一次提交。
  3. 本地仓库(Local Repository)
    • 正确。本地仓库存储提交历史、分支和元数据(位于 .git 目录)。通过 git commit,暂存区内容被永久保存到此。
  4. 远程仓库(Remote Repository)
    • 正确。远程仓库是共享的代码存储库(如 GitHub),用于团队协作。通过 git push/git fetch 与本地交互。

主观题

1、远程仓库管理所涉及的全部指令和分支管理所涉及的全部指令?

远程仓库命令:

克隆:gitclone仓库地址

拉取:gitpull

创建远程仓库别名:gitr emote add origin main

推送:gitpush

查看远程仓库信息:gitremote-v

gitremote-a

分支管理:

查看当前分支:gitbranch

查看所有分支信息:gitgranch-v

创建分支:gitbranch-b分支名

创建并切换分支:gitcheckout-b分支名

gitswitch-c分支名

删除分支:gitbranch-d分支名

gitbranch-D分支名

推送指定分支到远程:gitpush分支名origin/main

分支合并:gitmerge 分支名

gitrebase分支名

2、你在开发新功能时创建了一个 feature 分支,现在需要将主分支(main)的最新改动合并到你的 feature 分支中。请写出完整的操作步骤(包括命令),并说明使用 merge 和 rebase 两种方式的区别和各自的优缺点。

操作步骤:

切换到主分支:gitswitchmain

拉取最新提交和分支信息:gitpull

合并我的feature分支:gitmergefeature

打开文件,手动解决冲突,gitadd标记冲突已解决,提交一个版本

merge和rebase的区别和优缺点:

merge和rebase都是用于“整合分支”的工具,但是他们的实现方式,历史记录结构等完全不同

merge是“合并”,合并指定的分区

rebase是“变基”,把你的提交“挪到”目标分支的最新提交之后,保持历史记录结构线性简洁

merge 更安全(保留历史),rebase 更干净(但重写历史有风险)。

3、请简述 Git 中“工作区”、“暂存区”和“本地仓库”三者之间的关系,并说明在典型开发流程中它们是如何协作的。

工作区:你正在编辑文件所在的区域

暂存区:临时区域,通过gitadd命令暂时存储工作区的内容

本地仓库:暂存区通过gitcommit提交一个版本后,保存内容的区域

开发流程:在工作区修改文件,通过gitadd保存到暂存区,再通过giecommit提交版本存储到本地仓库

4、假设你不小心提交(commit)了一个包含敏感信息(如密码)的文件,且尚未推送到远程仓库。请描述至少两种安全撤销该提交的方法,并写出对应的 Git 命令。如果已经推送到远程仓库,又该如何处理?

安全撤销方法:

一,通过命令gitreset–hard版本号,回到上一个版本

二,使用命令gitrevert前一个版本号,回到上一次没有提交敏感文件的版本继续工作

已经推送到远程仓库的方法:

先使用gitpull拉取到本地,创建一个新分支,回到提交敏感文件之前的版本,之后合并主分支

5、本地提交版本推送到远程仓库多人协作全部过程

一,开发者克隆远程仓库到本地(gitclone仓库地址)

二,创建新分支:基于主分支main/master创建新分支(gitswitch-cdev)

三,在本地进行开发与提交

1,工作区修改文件,提交到暂存区(gitadd-A)

2,提交版本到本地仓库(gitcommit-m“描述”)

3,添加远程仓库别名gitremoteaddorigin仓库地址)

四,推送到远程仓库(gitpushoriginmain)

五,创建PullRequest,基于目标分支创建PR,请求更改合并到主分支

六,代码审查,团队成员审查PR,并提出修改建议,开发者根据反馈修改代码并提交版本

七,合并PR,审查通过后将目标分支合并到主分支上(gitmergedev)

八,删除合并合并后的主分支

九,同步主分支,拉取最新的版本和分支信息到本地,保持同步

十,解决冲突,多人修改同一文件时出现冲突,手动解决标记已解决,之后提交版本

十一,持续集成,团队成员通过CI或CD工具进行自动化,保证代码质量

十二,定时同步,开发者定期拉取最新版本和分支信息,减少冲突