章
目
录
欢迎来到Git面试准备指南,我们将讨论初学者和经验丰富的专业人士最常见的 Git 面试问题。无论您是为了DevOps或测试面试做准备,还是想要提高您的Git技能,这个面试题教程将通过深入探讨与Git的基本概念和实践相关的一些最常被问到的面试问题来帮助您。
我们将涵盖所有重要的主题,如分支、仓库管理、处理合并冲突以及协作工作流程。通过探讨这些问题,您将更深入地了解Git版本控制系统,并更好地应对开发项目中的现实挑战。
Git面试问题 – 基本概念
1.什么是版本控制系统?
版本控制系统(Version Control System,VCS)是一种帮助跟踪和管理文件和代码随时间变化的软件。它允许多人协作开发项目,追踪修订版本,并在需要时轻松返回以前的版本。
主要有三种类型的版本控制系统:
- 本地版本控制系统(Local Version Control System,LVCS):在LVCS中,版本控制数据库存储在本地计算机上。更改和修订在本地仓库内进行跟踪,该仓库位于用户的计算机上。然而,这种类型的系统缺乏协作功能,不支持团队开发。
- 集中式版本控制系统(Centralized Version Control System,CVCS):在CVCS中,版本控制数据库存储在中央服务器上。用户可以从服务器检出文件,进行更改,然后提交回服务器。这允许多用户协作在同一个项目上,并提供对仓库的集中控制。然而,CVCS的一个缺点是,如果中央服务器崩溃,协作者无法执行某些操作,直到服务器恢复。
- 分布式版本控制系统(Distributed Version Control System,DVCS):在DVCS中,每个用户都有一个包含完整版本历史的本地仓库。这意味着每个用户都有项目仓库的完整副本,包括所有分支和修订版本。用户可以在其本地仓库上独立工作,并将更改与其他仓库同步。DVCS更好地支持分布式和去中心化的工作流程,允许用户脱机工作并更有效地协作。
2.Git中的”Origin”是什么?
在Git中,”origin”指的是我们从中克隆的远程仓库。当我们从远程服务器克隆一个仓库时,Git会自动创建一个名为”origin”的远程引用,它指向原始的远程仓库。
默认情况下,当我们克隆一个仓库时,Git会设置”origin”并将其与我们克隆的原始仓库关联起来。我们可以通过运行命令’git remote -v’来验证这一点。这个命令会显示与我们的本地仓库关联的远程仓库列表,以及它们的URL。
git remote -v
origin https://github.com/lokeshgupta1981/Spring-Boot3-Demos.git (fetch)
origin https://github.com/lokeshgupta1981/Spring-Boot3-Demos.git (push)
请注意,“origin”只是一个未硬编码的别名,可以使用以下命令提示符进行更改:
git remote rename origin newName
3.我们如何在Git中配置全局用户名和电子邮件?
设置全局一致的用户名和电子邮件地址非常重要,因为 Git 使用此信息将提交与正确的作者关联起来。它有助于识别每个提交的人员,并允许在项目内进行适当的协作和归属。
要在 Git 中配置全局用户名和电子邮件,我们可以使用以下命令:
git config --global user.name "MyName"
git config --global user.email "myname@gmail.com"
这些命令将全局设置用户名和电子邮件,这意味着它们将用于您计算机上的所有 Git 存储库,除非在存储库级别覆盖。
您可以通过运行以下命令来验证更改。这些命令将分别显示配置的用户名和电子邮件。
git config --global user.name # Prints 'lokeshgupta1981'
git config --global user.email # Prints 'howtodoinjava@gmail.com'
4. Git 中的“暂存区”是什么意思?
Git 中的“暂存区域”也称为“索引”,是一个中间区域,在将文件提交到 Git 存储库之前,在此区域准备对文件的更改。
当我们对项目文件进行更改时,Git 提供了一个两步过程来提交这些更改。暂存区域充当工作目录(进行修改的位置)和存储库(存储提交的位置 => .git 文件夹)之间的桥梁。通过使用暂存区,我们可以将不相关的更改分成多个提交或有选择地包括特定的修改,同时排除其他修改。这为我们提供了在更改成为项目历史的一部分之前审查和完善更改的机会。
5. Git 中的分叉、分支和克隆之间的区别?
分叉、分支和克隆都是 Git 操作,在版本控制工作流程中具有不同的用途。在深入研究之前,让我们先对它们进行比较。
以下是 Git 中分叉、分支和克隆的表格比较:
特征 | 分叉 | 分枝 | 克隆 |
---|---|---|---|
目的 | 在您的 GitHub 帐户上创建远程存储库的副本。 | 在 Git 存储库中创建单独的开发线。 | 在您的计算机上创建 Git 存储库的本地副本。 |
所有权 | 创建一个由您拥有的完全独立的存储库。 | 在同一存储库中,分支归原始存储库所有。 | 本地副本;所有权没有变化。 |
起源 | 源自远程存储库,通常位于 GitHub 上。 | 源自现有的本地或远程存储库。 | 源自现有的远程或本地存储库。 |
改变可见性 | 在创建拉取请求之前,在分叉中所做的更改独立于原始存储库。 | 在分支中所做的更改将被隔离,直到您将它们合并回主分支。 | 在将更改推送到远程存储库之前,更改都是本地的。 |
用例 | 通常用于为开源项目做出贡献或创建单独的副本供个人使用。 | 用于协作环境中的功能开发、错误修复和隔离更改。 | 用于处理存储库的本地副本,通常用于个人开发。 |
分叉
分叉是一个与远程存储库相关的概念,特别是在 GitHub、GitLab 和 Bitbucket 等平台上。分叉在我们自己的帐户中创建原始存储库的副本。
要在 GitHub(或类似平台)上分叉存储库,通常在存储库页面上有一个“分叉”按钮。单击此按钮将在您的 GitHub 帐户中创建原始存储库的分支。
当我们想要为开源项目做出贡献或创建我们自己的独立项目版本时,通常会使用分叉。分叉存储库与原始存储库分开,允许我们进行更改、实验和提交拉取请求,而不会影响原始项目。
分枝
分支允许在存储库中创建单独的开发线。它使我们能够彼此独立地处理不同的功能、错误修复或实验。
要在 Git 中创建分支,我们使用以下命令:
git branch <branch_name>
通过创建分支,我们实质上创建了一个新的时间线,我们可以在不影响主分支(通常称为“master”或“main”)的情况下进行更改。一旦我们对分支中所做的更改感到满意,我们就可以将分支合并回主分支以合并更改。
分支是协作开发的强大工具,使多个开发人员能够同时处理不同的任务,同时保持干净且有组织的提交历史记录。
克隆
克隆创建远程存储库的本地副本。当我们克隆存储库时,我们会将整个项目的历史记录、文件和分支下载到本地计算机。
要将远程存储库克隆到本地计算机,我们使用以下命令:
git clone <repository_url>
克隆在本地存储库和远程存储库之间建立连接,使我们能够获取更新、推送更改以及与其他人协作。当我们想要开始使用现有存储库时,通常会进行克隆。
6. 什么是 Git Stash?
Git Stash 是 Git 中的一个功能,它允许我们暂时保存已经在我们的工作目录中进行的更改,而不进行提交。它提供了一种存储我们的修改并切换到不同分支或应用其他操作的方式,而无需提交不完整或实验性的更改。
Stashes 存储在本地,并不会推送到远程仓库,因此非常适合个人的工作流组织和实验。
git stash 命令用于创建和管理 stashes。以下是与 Git stash 相关的一些常见用例和命令:
创建一个 stash:
git stash save "Stash message"
该命令将我们的修改保存到一个新的 stash 中,并可选择提供一个描述 stash 的消息。Git 将撤销工作目录中的更改,使其保持干净。
查看stash
git stash list
该命令显示您已创建的 stash 列表,以及它们的 stash 引用和消息。
应用一个 stash
git stash apply stash@{n} // n in [0.....P]
这个命令将特定 stash 中的更改应用到当前分支上。stash@{n} 中的 “n” 是指 stash 在 stash 列表中的引用编号。默认情况下,它应用最近的 stash。
应用并删除一个 stash
git stash pop stash@{n}
这个命令将从特定 stash 应用更改并在一步中从 stash 列表中删除它。它等效于应用 stash 然后使用 git stash drop
来删除它。
将 stash 应用到不同分支
git stash branch branch-name stash@{n}
这个命令会创建一个新分支(new-branch-name
),并将特定 stash 中的更改应用到该分支上。这是一种方便的方式,在单个步骤中切换到新分支并应用你的 stash 更改。
丢弃(删除)一个 stash
git stash drop stash@{n}
这个命令从 stash 列表中移除特定的 stash 而不应用其中的更改。
Git stash 在我们正在进行某项工作但需要切换到不同的任务或分支时非常有用。它允许我们暂时保存我们的更改,切换上下文,然后稍后回到保存的状态继续之前的工作。这种方式让我们能够在离开的地方继续工作。
7. ‘ git fetch ‘ 和 ‘ git pull ‘之间有什么区别?
和都用于从远程存储库获取更改并将其合并到本地存储库中。然而,它们在处理获取的更改和更新本地分支的方式上有所不同。git fetch
git pull
git fetch
以下是和之间的主要区别git pull
:
git fetch
- 从远程存储库检索最新更改,包括新分支、提交和标签,而不自动将它们合并到当前分支中。
- 更新远程跟踪分支(例如,
origin/master
)以反映远程存储库的状态。 - 不修改您的本地分支或工作目录。
- 允许我们在手动合并之前检查和审查获取的更改,从而提供决定如何集成更改的机会。
要从远程存储库获取最新更改,我们使用以下命令:
git fetch origin
git pull
- 执行
git fetch
随后将获取的更改自动合并到当前分支中。 - 更新远程跟踪分支和本地分支,合并获取的更改。
- 如果当前分支有本地修改,
git pull
则尝试自动合并更改。如果存在冲突,则需要手动解决。 - 自动更新您的工作目录以反映合并的更改。
要从远程存储库中提取最新更改,我们使用以下命令:
git pull
在选择使用 git fetch 还是 git pull 时,取决于我们的工作流程以及对集成更改的控制级别。
- 如果我们想在合并之前审查更改并对集成过程有更多的控制,那么使用 git fetch 是合适的。
- 如果我们更喜欢自动化的方法,并且对自动合并更改有信心,那么使用 git pull 可能更加方便。
8. 解释一下 Git checkout、rebase 和 merge?
这是 Git 中的三个重要命令,用于管理分支并将更改从一个分支合并到另一个分支。
git 命令 | 目的 | 常见用例 |
---|---|---|
checkout | 切换到不同的分支或提交,使其成为当前工作分支/提交。 | – 创建分支并在分支之间切换 – 检查特定提交以进行检查或测试 |
rebase | 将更改从一个分支重新应用到另一分支。通常用于维护线性提交历史记录。 | – 将功能分支集成到主分支中 – 维护干净、线性的提交历史记录 |
merge | 将一个分支的更改合并到另一个分支。保留提交,创建合并提交。 | – 将功能分支集成到主分支 – 合并来自多个贡献者的更改 |
让我们逐一解释一下:
git checkout
用于git checkout
在项目的不同分支或版本之间切换。
要切换到另一个分支,我们使用以下命令:
git checkout <branch-name>
- 当您运行时
git checkout <branch-name>
,它会更新您的工作目录以匹配指定分支的内容。 - 您还可以使用
git checkout
切换到特定提交或标签,从而允许您查看历史记录中特定状态的项目。 - 此外,还
git checkout -b <new-branch-name>
可以创建一个新分支并通过单个命令切换到该分支。
git rebase
用于git rebase
将一个分支的更改集成到另一个分支,通常用于将功能分支的更改合并到主分支中。
假设我们有两个分支:源分支(我们称之为“feature”)和目标分支(通常是“master”或“main”)。“feature”分支包含一些更改,我们希望将这些更改合并到“master”分支中。但是,我们不想执行标准合并,因为我们想维护线性提交历史记录。
首先,您需要确保您位于目标分支(git checkout master)。在这种情况下,它将是 master,然后,启动 rebase 命令,指定要 rebase 到当前分支(目标分支)的源分支。
git rebase feature
- 当您运行 时
git rebase <target-branch>
,Git 会识别当前分支和目标分支的共同祖先,然后将当前分支的提交重新应用到目标分支之上。 - Rebase 通过按顺序放置提交来允许线性历史记录,使其看起来好像更改是直接在目标分支之上进行的。
- 这可以帮助维护干净的提交历史记录,特别是在处理长期存在的功能分支时。
git merge
将git merge
不同分支的更改合并到当前分支中。
要将分支的更改合并到目标分支,我们使用以下命令(在git checkout <targer-branch>之后):
git merge <source-branch>
- 当您运行时
git merge <source-branch>
,Git 会创建一个新的提交,将源分支中的更改合并到当前分支中。 - 合并提交保留了两个分支的历史记录,包括它们分歧的点。
- 默认情况下,如果可能,Git 会执行“快进”合并,这意味着它将当前分支指针向前移动到源分支的提交,而不创建额外的合并提交。
- 但是,如果由于不同的更改而无法进行快进合并,Git 会执行“递归”或“非快进”合并,创建新的合并提交。
9. git cherry-pick 命令的用途是什么?
“ git cherry-pick ”命令用于将特定提交从一个分支应用到另一个分支。它允许我们选择单独的提交并将它们应用到不同的分支,将它们的更改合并到目标分支中。
以下是我们如何使用git cherry-pick
命令:
- 识别提交:确定要应用于另一个分支的提交。您可以找到提交哈希值或使用其他 Git 命令(例如
git log
或 )gitk
来可视化提交历史记录。 - 切换到目标分支:确保您位于要应用所选提交的分支上。您可以使用
git checkout
切换到目标分支。 - 运行
git cherry-pick
:执行git cherry-pick
命令,后跟要应用的提交的提交哈希值。例如:
git cherry-pick <commit-hash>
需要注意的是,git cherry-pick
复制所选的提交,并将它们作为新的提交应用到目标分支上。这意味着新的提交将具有不同的提交哈希值,因为它们是原始提交的独立副本,而不是原始提交的直接传输。这一点非常重要,因为它会导致目标分支上的提交历史与源分支上的提交历史不同。
10.解释 Git 中的重置(Resetting)和回滚(Reverting)
在 Git 中,重置和回滚是两种不同的方法,用于撤销更改。它们用于纠正错误、撤销提交或将存储库恢复到先前的状态。
行动 | git重置 | Git 恢复 |
---|---|---|
目的 | 将 HEAD 和分支指针移动到指定的提交。 | 创建一个新的提交来撤消特定提交所做的更改。 |
常见用例 | – 在推送到远程存储库之前在本地撤消提交 – 重新组织提交历史记录 – 从暂存区域删除更改 |
– 安全撤消提交而不更改提交历史记录 – 协作代码更正 |
git重置
将git reset
当前分支指针移动到特定提交,从而有效地将分支重置为该提交。
#假设我们有这样的提交历史:A - B - C - D(master)
#执行硬重置以将分支指针移动到提交B,丢弃C和D中的更改。
git reset --hard B
重置命令有三种模式:soft、mixed 和 hard。
- 软重置(git reset –soft)将分支指针移动到指定的提交,同时保留暂存区和工作目录中的更改。它允许您“撤销”提交并基于先前状态进行额外修改。
- 混合重置(默认行为,git reset –mixed)将分支指针移动到指定的提交,重置暂存区但保留工作目录中的更改。它“取消暂存”更改,允许您在提交之前再次修改和暂存它们。
- 硬重置(git reset –hard)将分支指针移动到指定的提交,丢弃暂存区和工作目录中的任何更改。它完全删除更改,将分支和整个存储库恢复到指定提交的状态。
git revert
git revert 创建一个新的提交,撤销了先前提交中的更改。它提供了一种安全的方式来撤消提交,而不会改变提交历史记录。
git revert C # 这个命令会创建一个新的提交,撤销了提交 C 中的更改。
git revert
创建新的提交来反转指定提交引入的更改,而不是修改或删除现有提交。每个恢复提交都专门用于撤消特定提交的更改,确保提交历史记录保持完整。
11.“ .gitignore ”文件的用途是什么?
该.gitignore
文件指定了故意未跟踪的文件和目录,这些文件和目录不应提交到存储库。它允许我们定义 Git 在跟踪更改和暂存文件时应忽略的文件和目录名称模式。
使用“ .gitignore ”文件的一些常见用例和好处包括:
- 忽略构建工件,例如编译的二进制文件、目标文件、日志文件或临时文件。
- 忽略单独管理的依赖项或库。在存储库中包含这些依赖项是不必要的,并且可能会导致存储库臃肿。
- 忽略包含 API 密钥、数据库凭据或特定于环境的设置等敏感信息的配置文件。
- 忽略与其他团队成员无关的个人开发环境文件,例如项目设置、编辑器备份文件或缓存文件。
以下是包含 3 个条目的.gitignore
文件示例:
# Ignore build artifacts
*.exe
*.o
*.log
# Ignore dependency directories
/node_modules
/vendor
# Ignore sensitive configuration files
config.ini
secrets.json
12. Git reflog和log有什么区别?
主要git log
用于查看特定分支或提交的提交历史记录,而git reflog
更专注于跟踪整个存储库中的引用移动,这使其对于恢复和调试目的特别有用。
方面 | git log |
git reflog |
---|---|---|
目的 | 显示分支的提交历史记录。 | 显示存储库的参考日志。 |
常见用例 | – 审查项目历史记录 – 检查提交消息和随时间所做的更改。 |
– 恢复丢失的提交或分支 – 调试和了解存储库中的更改。 |
git log
该git log
命令提供存储库中按时间顺序提交的列表,显示提交哈希、作者、日期和提交消息等详细信息。默认情况下,它显示当前分支的提交历史记录,从最近的提交开始并按时间倒退。各种选项和标志允许自定义,例如按作者、日期范围或分支进行过滤。
#查看当前分支的提交历史
git log
要以紧凑的一行格式显示提交历史记录,我们使用以下命令:
git log --oneline
git reflog
另一方面,git reflog
提供引用(分支或标签)更新和修改提交指针的其他操作的详细日志。
# 查看存储库的 reflog(引用日志)
git reflog
与 不同的是git log
,引用日志会记录影响提交历史记录的分支移动和操作,即使不创建新的提交也是如此。它是恢复丢失的提交或可能被意外删除或移动的分支的宝贵工具,在发生错误或不可预见的事件时充当安全网。
13.“ git bisect ”命令的用途是什么?
该git bisect
命令对提交历史记录执行二分搜索,以识别引入错误或导致回归的特定提交。它通过有效地缩小要调查的提交范围,有助于隔离和查明负责特定问题的提交。
以下是git bisect
工作原理的概述:
- 识别已知的好的和坏的提交:首先识别项目历史记录中的两个提交:一个代表已知的良好状态(不存在错误或问题的提交),另一个代表已知的坏状态(不存在错误或问题的提交)存在错误或问题)。
- 启动二等分过程:用于
git bisect start
开始二等分过程。使用 指定已知git bisect good <commit>
良好状态的提交哈希值,使用 指定已知git bisect bad <commit>
不良状态的提交哈希值。Git 将在已知的好状态和坏状态之间创建一系列提交。
git bisect start
git bisect good <good_commit_hash>
git bisect bad <bad_commit_hash>
14. 我们如何在 Git 中将多个提交压缩为单个提交?
为了在 Git 中将多个提交压缩为单个提交,我们可以使用交互式变基功能。确保我们位于包含我们想要压缩的提交的分支上。
运行以下命令启动交互式变基:
git rebase -i HEAD~n
将 n 替换为要合并的提交数量。例如,如果我们想要合并最后的 3 个提交,可以使用 HEAD~3。
接下来,将会打开一个交互式文本编辑器,显示了我们在前一步中指定的提交列表。每个提交前面都会有单词“pick”。
要压缩提交,请将除第一个提交之外的所有提交的“pick”更改为“squash”(或“s”)。将第一个提交保留为“pick”,因为它将是生成的提交消息。如果需要,您还可以通过移动文本编辑器中的行来重新排列提交的顺序。
- 保存并退出文本编辑器。
- 将打开另一个文本编辑器,允许您修改提交消息。您可以合并压缩提交的提交消息或写入新消息。根据需要编辑消息,保存并退出编辑器。
- Git 将执行变基,将提交压缩为单个提交。
- 如果变基成功,您将看到一条消息,表明变基已完成。
- 如果存在任何冲突,Git 将停止 rebase 过程并允许我们解决它们。解决冲突后,用于
git rebase --continue
继续变基过程。 - 如有必要,将更改推送到远程存储库。
警告:压缩提交时要小心,因为它会重写历史。如果提交已经被推送到共享存储库并且其他人已经基于这些提交进行了工作,那么通常不建议压缩它们,因为这可能会导致其他团队成员发生冲突。
15、如何判断某个分支是否已经合并到Master中?
为了判断某个分支是否已经合并到master
Git中的分支中,我们可以运行以下命令:
git checkout master
然后运行以下命令,替换<branch_name>
为我们要检查的分支名称:
git branch --merged <branch_name>
- 如果该分支已合并到
master
,则运行此命令后显示的分支列表中将出现该分支。 - 如果该分支尚未合并到 中
master
,则不会出现在合并分支列表中。
或者,我们可以使用以下命令来查看合并分支的简明视图:
git branch --merged
此命令将列出已合并到当前分支(master
在本例中)的所有分支。
Git 面试问题 – 存储库和操作
16. 什么是 Git 存储库?如何初始化 Git 存储库?
Git 存储库是 Git 跟踪和管理一组文件和目录更改的存储位置。它包含对文件所做的所有更改的完整历史记录,使我们能够跟踪和恢复更改、与其他人协作以及维护项目的不同版本。
要初始化目录中的 Git 存储库,我们可以使用该git init
命令。我们是这样做的:
cd /path/to/your/local-repo-path
git init
此命令在当前目录中初始化一个空的 Git 存储库。Git 创建一个隐藏.git
目录,用于存储所有存储库数据,包括提交历史记录和配置。
17. 如何显示版本库的当前状态,包括修改的文件和分支信息?
要显示存储库的当前状态,包括修改的文件和分支信息,我们可以使用该git status
命令。
git status
# Sample Output
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: spring-boot-actuator-example/pom.xml
modified: spring-boot-actuator-example/src/main/java/com/howtodoinjava/demo/SimpleRestController.java
modified: spring-boot-actuator-example/src/main/resources/application.properties
modified: spring-webflux-demo/src/test/java/com/howtodoinjava/demo/EmployeeControllerTest.java
no changes added to commit (use "git add" and/or "git commit -a")
此命令将显示我们的存储库当前状态的摘要。它将向我们显示以下信息:
- 我们当前所在的分支。
- 未跟踪的文件(Git 当前未跟踪的文件)。
- 已修改的文件(已修改但未暂存的文件)。
- 暂存文件(已修改并暂存以供下一次提交的文件)。
- 分支状态(例如,“您的分支已更新为‘origin/master’”)。
18. 如何连接本地仓库到远程仓库?
要将本地存储库连接到远程存储库,我们需要将远程 URL 添加到本地 Git 存储库。此远程 URL 指向我们要存储和同步代码的远程存储库的位置(例如,在 GitHub、GitLab 或 Bitbucket 上)。
git remote add origin <remote_url>
此命令添加一个名为“ origin ”的远程(如果愿意,我们可以选择不同的名称)并将其与指定的远程 URL 关联。
Git 面试问题 –分支和操作
19. 如何列出已有的分支?如何创建新分支?
要列出现有分支,我们可以使用“gitbranch”命令。它显示存储库中所有分支的列表,并突出显示当前分支。
git branch
要创建新分支,我们可以使用以下命令:
git branch <branch-name>
20. 如何切换到特定分支?
我们可以使用以下命令切换到特定分支:
git checkout <branch-name>
21. 如何将不同分支的更改合并到当前分支?
确保我们位于要合并更改的分支(例如main分支)后,使用merge命令将指定分支的更改合并到当前分支。
git checkout < main-branch >
git merge <branch-name>
22.如何删除Git中的分支?
要删除分支,我们可以传递标志-d
。
git branch -d <branch-name>
Git 面试问题– 添加、提交、合并、差异
23. 如何将文件添加到暂存区?
要将文件添加到暂存区,我们使用git add命令:
git add <file>
要快速将所有文件添加到暂存区,可以使用一个点(“.”)而不是指定特定的文件名:
git add .
24. 如何使用描述性消息在暂存区提交更改?
将文件添加到暂存区域后,我们可以使用以下命令提交更改:
git commit -m "message".
将“message”替换为总结更改的描述性消息。
25. 如何将提交的更改推送到远程存储库?
要将提交的更改推送到远程存储库,我们使用以下命令:
git push <remote-name> <branch-name>
26. 如何撤消 Git 中的最后一次提交?
要撤消最后一次提交,同时将更改保留为未提交的修改,我们可以使用以下命令:
git reset HEAD~1
这将把 HEAD 指针向后移动一个提交。更改仍然在您的工作目录中,允许我们对它们进行修改或创建新的提交。
27. 什么是合并冲突,如何解决?
当 Git 由于同一行代码上的修改冲突而无法自动合并来自不同分支的更改时,就会发生合并冲突。
要解决合并冲突,我们需要手动编辑冲突文件,以选择所需的更改。解决冲突后,我们可以添加并提交更改以完成合并。
28. 如何从远程存储库中提取更改?
要从 Git 中的远程存储库提取更改,我们可以使用该git pull
命令。该git pull
命令从远程存储库获取最新更改并将它们合并到我们的本地分支中。
git pull origin <branch-name>
例如,如果我们想从master
分支中提取更改,我们可以使用git pull origin master
. 如果我们克隆存储库,默认远程名称通常是origin
,但如果您自定义它,它可能会有所不同。
如果有任何冲突,Git 会通知我们,我们需要手动解决冲突。如果合并成功,我们的本地分支将使用远程存储库中的最新更改进行更新。
在拉取更改之前,建议提交或存储本地更改以避免冲突。如果您有未提交的更改,Git 可能会拒绝拉取,直到您提交或存储它们。
29. 如何显示两次提交之间的差异?
要显示两个 Git 提交之间的差异,可以使用以下命令:
git diff <commit1> <commit2>
30. 如何在 Git 中恢复提交?
要恢复提交并创建一个撤消更改的新提交,我们可以使用以下命令:
git revert <commit-hash>
将 <commit> 替换为您要恢复的提交哈希。Git 将创建一个新的提交来撤消在指定提交中所做的更改。
31.如何查看Git中的提交历史记录?
Git 中的每个分支都维护自己的提交历史记录。要访问和查看与特定分支关联的提交,我们可以使用以下命令:
git log branch-name
以下是使用“git log”的不同场景:
- 不指定分支名称:“git log”显示当前签出的分支的提交历史记录。如果没有签出分支,它会显示整个存储库的提交历史记录。
- 使用特定分支名称:“git log <branch-name>”显示指定分支的提交历史记录,包括其父分支共享的任何提交。
32. 如何取消暂存文件?
要在 Git 中取消暂存文件,我们可以使用以下命令:
git reset HEAD -- path/to/file
与递归使用“ git add ”类似,您可以按目录取消暂存文件或执行批量取消暂存操作。要立即取消所有内容,请从存储库的根目录运行以下命令:
git reset HEAD -- .
33. 如何从远程存储库中删除文件?
要从远程存储库中删除文件,可以使用以下命令:
git rm <file>
这将从工作目录和 Git 存储库中删除该文件。删除文件后,您需要提交并推送更改以更新远程存储库。
结论
总之,这份关于常见 Git 面试问题和答案的综合指南对 Git 版本控制系统中的基本概念和实践进行了彻底的探索。
通过深入研究存储库管理、分支、合并、解决冲突和协作工作流程等主题,您可以对 Git 的关键方面有深入的了解。