Git
Git
Git是一种分布式版本控制系统,它的原理和工作流程如下:
原理:
- 分布式版本控制系统:Git使用分布式的版本控制系统,每个开发者都有一个完整的代码仓库的副本,不依赖于中央服务器。
- 快照:Git不保存文件的变化差异,而是保存文件在不同版本中的快照。每次提交都会生成一个快照,包含了当前工作目录的所有文件状态。
- 三层架构:Git的数据存储分为三层:工作目录、暂存区(Index)、仓库(Repository)。工作目录是开发者工作的文件夹,暂存区是用于准备提交的文件存放的区域,仓库是保存所有历史提交的地方。
- 哈希值:Git使用哈希值来唯一标识每个提交和文件内容。通过哈希值可以快速定位文件内容或者提交版本。
工作流程:
- 克隆仓库:首先,开发者需要克隆(clone)远程仓库到本地,获取代码仓库的副本。
- 添加修改:开发者在工作目录中进行修改,并将修改后的文件添加到暂存区。
- 提交更改:开发者将暂存区中的修改提交(commit)到本地仓库,生成一个新的提交记录。
- 推送到远程:开发者可以将本地的提交推送(push)到远程仓库,与其他开发者共享。
- 拉取更新:开发者可以从远程仓库拉取(pull)最新的更新,合并到本地仓库,保持代码同步。
- 分支管理:开发者可以创建新的分支(branch),在不同的分支中进行开发工作,然后合并(merge)到主分支。
- 版本回退:开发者可以回退(reset)到任意历史版本,查看历史提交记录,或者创建新的分支进行实验性开发。
什么是版本控制系统?为什么需要版本控制系统?
版本控制系统(Version Control System,VCS)是一种用于管理和追踪文件或代码变化的工具。它记录文件的修改历史和不同版本之间的差异,并提供了协作、追踪和管理代码的功能。
版本控制系统的主要作用包括:
- 版本管理:版本控制系统可以记录文件的修改历史,包括每个版本的变动内容、作者和时间等信息。这使得开发者可以追踪和查看文件的演变历程,了解每个版本的变更细节。
- 团队协作:版本控制系统支持多人协作开发,不同开发者可以在同一个代码库上独立工作,并通过版本控制系统合并彼此的修改。它提供了分支(Branch)和合并(Merge)的功能,使得团队成员可以并行开发不同的功能或修复不同的 bug。
- 错误恢复和回滚:版本控制系统允许开发者在出现错误或问题时回滚到之前的版本。当代码出现问题或引入 bug 时,可以轻松地恢复到之前的稳定状态,避免损失和影响。
- 版本比较和差异查看:版本控制系统可以比较不同版本之间的差异,并展示修改的具体内容。这有助于开发者了解代码的变化,审查和审计代码改动,以及解决冲突和合并代码。
- 分布式开发:一些版本控制系统(如Git)采用分布式架构,每个开发者都可以在本地拥有完整的代码仓库。这使得开发者可以离线工作、快速提交和切换分支,更加灵活地进行开发。
Git常用命令
获取 Git 仓库
有两种取得 Git 项目仓库的方法。
- 在现有目录中初始化仓库: 进入项目目录运行
git init
命令,该命令将创建一个名为.git
的子目录。 - 从一个服务器克隆一个现有的 Git 仓库:
git clone [url]
自定义本地仓库的名字:git clone [url] directoryname
更新到本地仓库
- 检测当前文件状态 :
git status
- 把文件添加到暂存区:
git add filename
(针对特定文件)、git add *
(所有文件)、git add *.txt
(支持通配符,所有 .txt 文件) - 忽略文件:
.gitignore
文件 - 提交更新:
git commit -m "代码提交信息"
(每次准备提交前,先用git status
看下,是不是都已暂存起来了, 然后再运行提交命令git commit
) - 跳过使用暂存区域更新的方式 :
git commit -a -m "代码提交信息"
。git commit
加上-a
选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤。 - 移除文件:
git rm filename
(从暂存区域移除,然后提交。) - 对文件重命名:
git mv README.md README
(这个命令相当于mv README.md README
、git rm README.md
、git add README
这三条命令的集合)
推送改动到远程仓库
- 如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
1 |
|
- 比如我们要让本地的一个仓库和 GitHub 上创建的一个仓库关联可以这样
1 |
|
- 将这些改动提交到远端仓库:
1 |
|
可以把 master 换成你想要推送的任何分支
如此你就能够将你的改动推送到所添加的服务器上去了。
远程仓库的移除与重命名
- 将 test 重命名为 test1:
git remote rename test test1
- 移除远程仓库 test1:
git remote rm test1
查看提交历史
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的工具是 git log
命令。git log
会按提交时间列出所有的更新,最近的更新排在最上面。
可以添加一些参数来查看自己希望看到的内容:
只看某个人的提交记录:
1 |
|
撤销操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令尝试重新提交:
1 |
|
取消暂存的文件
1 |
|
撤消对文件的修改:
1 |
|
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
1 |
|
分支操作
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认”的分支。在其他分支上进行开发,完成后再将它们合并到主分支上。
我们通常在开发新功能、修复一个紧急 bug 等等时候会选择创建分支。单分支开发好还是多分支开发好,还是要看具体场景来说。
创建一个名字叫做 test 的分支
1 |
|
切换当前分支到 test(当你切换分支的时候,Git 会重置你的工作目录,使其看起来像回到了你在那个分支上最后一次提交的样子。 Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样)
1 |
|
查看本地分支信息
1 |
|
你也可以直接这样创建分支并切换过去(上面两条命令的合写)
1 |
|
切换到主分支
1 |
|
合并分支(可能会有冲突)
1 |
|
把新建的分支删掉
1 |
|
将分支推送到远端仓库(推送成功后其他人可见)
1 |
|
查看远程仓库分支
1 |
|
删除远程仓库分支
1 |
|
commit和push的区别
在 Git 版本控制系统中,”commit”(提交)和 “push”(推送)是两个常用的操作,它们的用途和作用如下:
Commit(提交):Commit 操作用于将当前工作目录的修改内容保存为一个新的提交(commit)。Commit 操作只会将修改的内容保存到本地仓库,生成本地的提交历史。每个提交都包含了一系列文件的变动,并附带了一个描述该提交的消息。Commit 是将代码变动永久记录在版本库中的步骤,它将当前修改的状态固定下来,并生成一个唯一的标识符(commit ID)。每个提交都构成了项目的一个快照,可以用于回退、比较和追溯代码的历史。
Push(推送):Push 操作用于将本地的提交推送到远程仓库。当你在本地仓库进行了一系列的提交后,如果希望将这些提交分享给其他开发者或备份到远程服务器,你需要执行 Push 操作。Push 将本地的提交上传到远程仓库,并更新远程仓库的分支状态,使得其他开发者可以访问和获取这些提交。
fetch和pull的区别
“fetch” 和 “pull” 是 Git 版本控制系统中常用的两个命令,它们用于从远程仓库获取更新。它们的区别如下:
- Fetch:Fetch 命令用于从远程仓库下载最新的提交和分支信息,但不会自动合并或更新本地分支。它会将远程仓库的提交和分支信息下载到本地,并更新远程分支的引用。使用 Fetch 命令后,你可以查看远程仓库的新提交和分支信息,但不会自动应用到当前工作分支。
- Pull:Pull 命令是 Fetch 命令的扩展,它会自动从远程仓库下载最新的提交、分支信息,并尝试将这些更新合并到当前工作分支。它包含了 Fetch 和合并两个步骤,使得代码更新更加方便。当你执行 Pull 命令时,它会自动下载远程仓库的更新,并尝试自动合并到当前工作分支。
merge和rebase的区别
合并(Merge):合并操作将两个或多个分支的修改内容合并到一个新的提交中。当你执行合并操作时,版本控制系统会自动创建一个新的合并提交,将不同分支的修改内容合并在一起。合并的结果是一个包含了来自不同分支的修改的新提交。合并会保留原有分支的提交历史,因此可以清晰地看到哪些分支进行了合并。
变基(Rebase):变基操作将当前分支的修改内容重新应用到目标分支的顶部。它会将当前分支的修改提交逐个应用到目标分支上,形成一系列新的提交。通过变基,可以使得当前分支的提交历史看起来像是在目标分支的顶部进行的连续修改。变基的结果是一个线性的提交历史,使得项目的提交历史更加干净整洁