Java-常见面试题收集(十二)

二十一 Git

1 介绍 Git,Github,Gitee,Gitlab

Git、GitHub、Gitee和GitLab都是与版本控制和代码托管相关的工具,但它们在功能和使用上有所不同。

Git是一个开源的分布式版本控制系统,主要用于敏捷高效地处理任何或小或大的项目版本管理。它是Linus Torvalds为了帮助管理Linux内核开发而开发的,目的是有效、高速地处理从很小到非常大的项目版本管理。

GitHub是一个基于web的版本控制和协作平台,主要用于存储、管理和分享开源代码和项目。它提供了基于Git的版本控制功能,使得多个开发者可以在同一个代码库中协同开发,并且能够轻松地跟踪代码的变化。此外,GitHub还提供了问题跟踪、代码审查、代码片段分享、自动化测试等功能,帮助开发者更加高效地进行开发和协作。

Gitee(码云)是开源中国推出的基于Git的代码托管平台,提供中国本土化的代码托管服务。它是企业级研发效能平台,为企业和个人提供代码托管、项目管理、持续集成等一系列研发工具和服务。

GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。它主要针对软件开发过程中产生的代码和文档进行管理,提供丰富的协作功能,如请求合并、问题追踪和代码审查等。GitLab还具有更好的集成性,可以与许多第三方工具集成。

Git是一个版本控制系统,而GitHub、Gitee和GitLab则是基于Git的代码托管和协作平台。它们各自有不同的特点和优势,用户可以根据实际需求选择适合自己的平台。

2 SVN 与 Git 的区别

java 复制代码
1.Git 是一个分布式的版本控制工具,SVN 是集中版本控制工具
2.Git 属于第 3 代版本控制工具,SVN 则属于第 2 代版本控制工具
3.Git 客户端可以在其本地系统上克隆整个存储库,SVN 的版本历史记录存储在服务器端存储库中
4.Git 即使离线也可以提交,SVN 只允许在线提交和回滚
5.Git 的 Push/pull 操作更快,而 SVN Push/pull 操作较慢
6.Git 工程可以用 commit 自动共享,但 SVN 没有任何东西自动共享

3 Git 中的"裸存储库"

Git中的"裸存储库"(bare repository)是一种特殊类型的仓库,它不包含工作目录。这意味着裸存储库中不包含项目文件的实际可编辑版本,只包含Git的版本控制数据,即.git目录下的内容。

裸存储库主要用于共享、协作和作为中央仓库,因为它们提供了一种轻量级的方式来共享代码库,占用的空间更小,传输速度更快。由于裸存储库没有工作目录,因此无法进行文件编辑和合并,只能进行push和fetch操作,不能进行直接的commit或merge操作。

通常,在初始化远程服务器仓库时,使用git init --bare 命令来建立一个裸存储库。这个命令会在指定目录下创建一个裸的Git仓库,其项目目录下就是标准仓库.git目录里的内容,没有工作空间。这个仓库只保存Git历史提交的版本信息。

4 Git 中创建存储库

1.创建新的本地仓库:

首先,打开你的命令行工具(在macOS和Linux中是终端,在Windows中是命令提示符)。

使用cd命令进入你想要初始化为Git仓库的目录。如果这个目录还不存在,你可以使用mkdir命令创建它,然后再进入该目录。

在项目目录中运行git init命令。这将在当前目录下创建一个新的子目录.git,其中包含所有必需的Git仓库文件。此时,项目目录还是空的。

添加项目文件到目录,使用git add命令将文件添加到仓库的暂存区,然后使用git commit命令提交更改。

2.从现有仓库克隆:

找到要克隆的现有仓库的地址。这通常可以在Git托管平台(如GitHub、GitLab、Gitee等)上找到。

在你的计算机上选择一个文件夹作为克隆的目标目录。可以通过命令行进入该文件夹或者在文件管理器中打开该文件夹。

在命令行工具中执行git clone 命令,其中是要克隆仓库的地址。

现在,你已经成功克隆了现有的Git仓库。通过提交命令,你的更改将永久保存到存储库中。

5 Git 常用的命令

java 复制代码
git init:初始化一个新的Git仓库。

git add <file>:将文件添加到暂存区,准备提交。

git commit -m "message":提交暂存区的更改到仓库,并附加一条消息。

git status:显示工作区和暂存区的状态。

git diff:显示未暂存的更改。

git log:查看提交历史记录。

git show <commit_id>:查看特定提交的详细信息。

git branch:列出所有分支,或者创建新分支。

git checkout <branch>:切换到指定分支。

git merge <branch>:合并指定分支到当前分支。

git pull:从远程仓库拉取并合并更改。

git push:将本地更改推送到远程仓库。

git reset --hard <commit_id>:将当前分支的HEAD重置为指定提交,丢弃之后的所有更改。

git cherry-pick <commit_id>:选择某个提交,并将其应用在当前分支上。

git stash:暂存当前更改,以便稍后可以恢复。

git stash pop:恢复暂存的更改并删除stash。

git remote add <remote_name> <remote_url>:添加远程仓库。

git remote -v:查看已配置的远程仓库信息。

git remote rm <remote_name>:删除远程仓库。

git clone <repository-url>:克隆一个远程仓库到本地。

6 git clone、git pull、git merge、git fetch 四个命令的区别

git clone:

功能:git clone 命令用于克隆一个已存在的 Git 仓库到本地。这包括仓库中的所有历史记录、分支和标签等。

使用场景:当你想要从远程服务器获取一个完整的仓库副本并在本地进行开发时,使用 git clone。
git pull:

功能:git pull 命令用于从远程仓库拉取最新的更改,并尝试将其合并到当前分支。这实际上相当于先执行 git fetch,然后执行 git merge。

使用场景:当你在本地仓库工作,并希望获取远程仓库的最新更改时,使用 git pull。注意,如果本地有未提交的修改,并且与远程的更改有冲突,git pull 可能会产生冲突,需要手动解决。
git merge:

功能:git merge 命令用于将两个或多个分支的更改合并到一个分支中。

使用场景:当你想要将某个分支(如特性分支或修复分支)的更改合并到主分支或其他分支时,使用 git merge。
git fetch:

功能:git fetch 命令用于从远程仓库获取最新的提交历史和分支信息,但不会自动合并或修改本地代码。它只是更新本地仓库的远程分支指针。

使用场景:当你想要查看远程仓库的最新更改,但暂时不想合并到本地仓库时,使用 git fetch。你可以使用 git log 命令查看拉取下来的更改,决定是否要合并。

来说,git clone 用于获取完整的仓库副本,git pull 用于拉取并合并远程仓库的更改,git merge 用于合并不同分支的更改,而 git fetch 则只获取远程仓库的更改信息而不进行合并。这些命令在 Git 的日常使用中都非常常见,掌握它们对于有效地进行版本控制至关重要。

7 push 之前一定要进行哪个操作

在Git中,执行push操作之前,通常建议进行pull或fetch操作,以便获取远程仓库的最新更改,并避免潜在的合并冲突。这是因为如果在你上次拉取代码之后,其他开发者已经向远程仓库推送了更改,那么直接推送你的更改可能会导致冲突。

git rebase 命令的作用

8 git rebase 命令的作用

git rebase命令的作用在于重新设置(reapply)提交基(base),即将一个分支的提交应用到另一个分支上。这样做的目的主要是创建一个更线性、整洁的提交历史。

合并提交:通过将多个连续的提交合并成一个更大的提交,使提交历史更加清晰和易于理解。

移动提交:将当前分支上的提交移动到另一个分支上,从而将某些特定提交应用到其他分支上。

消除冲突:在合并提交或移动提交时,可能会出现冲突。git rebase命令可以帮助我们解决这些冲突,使得合并或移动过程更加平滑。

保持分支整洁:通过使用git rebase将提交应用到目标分支上,可以保持分支的线性提交历史,避免出现分支上过多的合并提交。

9 如何查看分支提交的历史记录与某个文件的历史记录

要查看分支提交的历史记录,可以使用Git命令行工具或Git客户端。在命令行工具中,使用以下命令:

java 复制代码
git log <branch_name>

<branch_name>是要查看的分支名称,比如master。执行这个命令后,会显示出指定分支的所有提交记录,从最近的开始显示。如果使用Git客户端,可以在图形界面中选择相应的分支,并点击"提交记录"或"Commit History"选项,即可查看该分支的提交历史记录。

查看某个文件的历史记录,同样可以使用Git命令行工具。以下是具体的命令:

java 复制代码
git log <文件路径>

这个命令会显示文件的提交历史,包括提交的哈希值、作者、提交日期和提交的注释等信息。

查看文件的修改内容,可以使用以下命令:

java 复制代码
git show <文件路径>

这个命令会显示指定提交中文件的修改内容,包括新增、删除和修改的行等详细信息。

查看文件的变更差异,比如在两个提交之间文件的差异,可以使用以下命令:

java 复制代码
git diff <commit1> <commit2> -- <文件路径>

和是两个提交的哈希值或引用,--是用来分隔提交和文件路径的。这个命令会显示两个提交之间文件的变更差异。

查看文件的修改历史,包括每一行修改的最后一次提交的作者和提交的注释等信息,可以使用以下命令:

java 复制代码
git blame <文件路径>

详细查看Git仓库中分支的提交记录以及文件的历史记录。

10 git revert 和 git reset 的区别

git revert命令的作用是撤销某个或某些提交的修改,但并不会改变提交历史。它会创建一个新的提交来撤销之前的修改,这样历史提交记录不会被更改,只是增加了新的提交来抵消之前的更改。因此,使用git revert不会破坏其他人的工作,因为撤销的更改是通过新的提交来实现的。git revert可以撤销一个或多个连续的提交,也可以撤销暂存区的提交,并且提供了多种选项,如是否生成新的提交等。

而git reset命令则是将HEAD、索引和工作树重置到指定的状态。它实际上是将Git仓库中的工作树、索引以及提交历史重置到指定的提交记录。根据使用的选项不同,git reset的效果也有所不同。例如,使用--soft选项时,只会重置HEAD和索引,不会修改工作树中的文件内容;使用--mixed选项时,除了重置HEAD和索引,还会重置工作树中的文件内容;使用--hard选项时,会将HEAD、索引和工作树全部重置到目标提交记录,删除所有未提交的更改。需要注意的是,使用--hard选项时需要特别小心,因为它会删除所有未提交的更改。

git revert和git reset的主要区别在于它们处理历史提交记录的方式不同。git revert通过创建新的提交来撤销之前的更改,保留历史提交记录;而git reset则是直接重置提交历史,可能会删除未提交的更改。因此,在使用这两个命令时,需要根据具体的需求和场景来选择合适的命令。

11 git merge 和 git rebase 的区别

git merge的主要操作是将源分支的所有更改合并为一个新的提交。这个新提交有两个父提交,分别指向合并之前的两个分支。因此,使用merge命令合并分支会保留每个分支的提交历史记录,使得提交历史清晰地展示哪些分支在何时进行了合并。此外,原始分支的历史在merge操作中保持不变,不会被修改。这种合并方式通常适用于长期维护的分支(如feature分支或develop分支)合并到主分支(如master或main)或其他稳定分支的场景。

git rebase的操作方式则有所不同。它会把当前分支的提交"移动"到目标分支的最新提交之后,并创建一个新的提交历史记录。这实际上是将源分支的提交逐个应用在目标分支的顶部,使它们看起来像是在目标分支上连续提交的。因此,rebase会改变提交历史,使得提交历史更加线性和干净。但这也可能使得分支之间的关系变得不那么清晰,并可能丢失源分支的合并信息。

由于rebase改变了提交历史,它可能需要更多的工作来解决冲突。在rebase过程中,如果遇到冲突,需要手动解决冲突,然后继续rebase过程。相比之下,merge操作在合并时会直接处理冲突,使得解决冲突的过程更为直接。

12 Git 的复刻(fork)、分支(branch)和克隆(clone)之间的区别

复刻(fork)是指在GitHub、GitLab等代码托管平台上创建一个项目仓库的完整副本到自己的账户下。这个副本是独立的,你在复刻的仓库上的更改不会影响原始仓库,直到你决定通过发起拉取请求(pull request)贡献你的更改。复刻允许你在不影响原始仓库的情况下自由地试验和更改项目,是开源协作的基础,使得任何人都可以对项目做出贡献。

分支(branch)是仓库内部的一个独立线路,允许你在隔离的环境中进行开发或修复。分支与复刻的区别在于,分支是在同一个仓库内部创建的,它允许你在相同的仓库内安全地开展新的开发或修复工作,而不会影响到主分支或其他分支。

克隆(clone)是Git中用于复制仓库的一个功能,它将一个已经存在的Git仓库复制到本地,使得用户能够在本地查看或修改该项目。克隆操作是将一个仓库的源代码复制到另一个位置(通常是本地计算机),这样你就可以在本地进行工作,而不会影响远程仓库。

相关推荐
忒可君5 分钟前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
斌斌_____20 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
木心28 分钟前
Git基本操作快速入门(30min)
git·github
路在脚下@29 分钟前
Spring如何处理循环依赖
java·后端·spring
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
LXL_241 小时前
Git_撤销本地commit_查找仓库中大文件
git
上等猿1 小时前
集合stream
java
java1234_小锋1 小时前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i1 小时前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动