简介:什么是Git?
Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型项目到大型项目的所有内容。
那么为什么是 Git?有什么好处?
想象一个不使用 Git 的场景。
有一个大项目,有 100 名开发人员正在从事该项目。
![](https://i-blog.csdnimg.cn/blog_migrate/a2dbab6288828f3bd86df67b2166305f.png)
开发人员过去常常将他们的代码提交到中央服务器,而没有自己的副本。
其他开发人员不知道对源代码所做的任何更改。
任何开发人员之间都没有沟通。
下面我们来分析一下使用Git后的场景。
![](https://i-blog.csdnimg.cn/blog_migrate/81779845616ac351725934be86234ef2.png)
每个开发人员在其本地系统上都有完整的代码副本。
对源代码所做的任何更改都可以被其他人跟踪。
开发人员之间有定期的沟通。
因此,对于涉及数千名开发人员的大型项目,Git 可以帮助这些开发人员以结构化的方式高效地协作工作。了解更多。
学习 GIT:从基础到高级概念
1. Git 的使用
Git 用于跟踪源代码中的更改。
用于源代码管理的分布式版本控制工具。
允许多个开发人员一起工作。
支持非线性开发,因为它有数千个并行分支。
2. Git的特点
免费和开源
跟踪历史
支持非线性开发
创建备份
可扩展
支持协作
分支更容易
分布式开发。
3. Git 工作流程
下图显示了git 工作流图:
![](https://i-blog.csdnimg.cn/blog_migrate/50fbe45c1165c4072ea123e4e2b762b6.png)
在Git中,工作流主要分为三个区域——
工作目录- 这是您修改现有文件的区域。
暂存区(索引) - 在此,暂存工作目录中的文件并添加快照。
Git 目录或存储库- 它基本上是您执行所有需要进行的更改的地方,即执行对分支的提交、检查分支、进行更改等。
4.安装Git:在Windows/Linux/Mac 操作系统中安装
在 Windows 上安装 Git -
从这里下载最新版本的 Git。
启动安装程序后,按照屏幕上的命令并按“下一步”完成安装。
打开命令提示符并运行以下命令以使用您的用户名和电子邮件在您的 PC 上配置 Git。
$ git config --global user.name "username"
$ git config --global user.email "user_emails@gmail.com"
这会使用您的用户名和电子邮件在您的 PC 上配置 Git。
在 Linux 上安装 Git -
您可以使用命令apt-get在 Linux 上安装 Git :
$ sudo apt-get update
$ sudo apt-get install git
使用以下命令配置您的用户名和电子邮件:
$ git config --global user.name "user_name"
$ git config --global user.email "user_email@gmail.com"
在 Mac 操作系统上安装 Git -
从这里下载最新版本的 Git。
打开安装程序并按照说明进行操作。
现在,由于安装了 Git,打开命令行并配置您的用户名和用户电子邮件。
$ git config --global user.name "user_name"
$ git config --global user.email "user_email@gmail.com"
5. 克隆
git clone是一个用于克隆或复制目标存储库的命令。
下图显示了git clone命令的图示。使用该命令,创建原始存储库的副本。
![](https://i-blog.csdnimg.cn/blog_migrate/17f77b4f635e5714043540a41ba53dfd.png)
如何克隆存储库?
打开 Github 并导航到需要克隆的目标存储库。
在 repo 名称下,单击选项卡Clone 或 Download。
出现一个名为Clone with HTTPS的选项。
复制克隆 URL。
打开命令行并使用命令:git clone <repo_URL>
这样就可以克隆目标仓库了。
从存储库克隆一个特定的分支。
git clone 的一个非常有用的特性是它允许克隆目标存储库的特定分支,而不必克隆整个存储库。
要克隆特定的分支,需要使用命令-b指定分支。使用以下命令:
git clone -b <Branch_name> <Repo_URL>
6. 分支
Git 中的分支用于保存您的更改,直到它们准备就绪。
您可以在主分支(main)保持稳定的情况下在分支上进行工作。完成工作后,您可以将其合并到主分支。
为了创建一个新分支,使用以下命令:
git branch <branch_name>
例如 -
git branch demo
此命令从 Main 分支创建一个名为demo的新分支:
![](https://i-blog.csdnimg.cn/blog_migrate/5cff666e1d166db9b46c580dcbabd1db.png)
该图显示有主要分支。
还有两个分支 small feature 和 large feature 分开工作。
两个独立分支的工作完成后,您可以将其合并到主分支中。
7. Git 切换分支
使用git checkout命令,我们可以从一个分支切换到另一个分支。
命令 :
git checkout <branch_name>
8.创建远程分支
Git 不允许在远程存储库上创建新的独立分支。但是,你要使一个分支远程,我们可以推送一个现有的本地分支。
创建远程分支的步骤如下:
创建本地分支并切换到该分支:
git checkout -b <branch_name>
推入本地分支:
git push -u origin <branch_name>
注意:origin是remote的默认名称
现在,如果有人想获取一些信息,可以简单地运行:
git fetch
git checkout <branch_name>
9. 删除分支
一旦在分支上完成工作并与 Main 分支合并,就可以删除该分支。
以下命令用于删除分支:
git delete -d <branch_name>
注意:该命令删除了分支的副本,但原始分支仍然可以存在于远程存储库中。
要删除远程分支,请使用以下命令:
git push origin --delete <branch_name>
10. Git 签出
Git checkout 用于命令 Git 在哪个分支上进行更改。Checkout 仅用于更改存储库中的分支。它还可以用于恢复文件。
下图描述了创建不同分支并在需要时切换到分支的场景,即我们可以从主分支切换到不同的分支,反之亦然。
![](https://i-blog.csdnimg.cn/blog_migrate/5d48a92ddda104ef32a217dc97ceca0a.png)
Git Checkout Branch
要签出或创建分支,可以使用以下命令:
git checkout -b <branch_name>
这将简单地切换到新分支branch_name。
Git Checkout Tag
在处理大型代码库时,很容易找到一些参考点。这就是使用Checkout Tag的地方。
以下命令用于指定标记名以及将检出的分支。
git checkout tag</tag> <branch_name>
11. GIT 状态
git status主要用来显示暂存区和仓库的状态。它帮助我们跟踪所做的所有更改,指出未跟踪的文件。
命令:
git status
添加文件后的git状态
使用以下命令将文件添加到存储库:
touch file.txt
执行 git 状态。
将显示一条消息,描述对存储库所做的更改。
提交后删除文件后的git状态
使用以下命令删除文件:
git rm file.txt
执行git status。
将显示一条消息,说明该文件已被删除。
12. Git 提交
Git commit 用于记录存储库中的所有更改。git commit 将提交所有更改并为其创建一个 commit-id 以跟踪所做的更改,如下图所示。
如图所示,命令git commit创建一个commit-id来跟踪更改并将所有更改提交到 git 存储库。
![](https://i-blog.csdnimg.cn/blog_migrate/a5a751a5747a1bb8b3918d8055be35ff.png)
命令:
git commit
git commit -m
-m和commit一起让我们在命令行上编写提交消息。
命令:
git commit -m "Commit message"
git commit -am
-am与commit一起用于在命令行上为已经暂存的文件写入提交消息。
命令:
git commit -am "Commit message"
git commit -amend
修改用于编辑最后一次提交。如果我们需要更改最后提交的消息,可以使用此命令。
命令:
git commit -amend
git rm
rm代表删除。它用于删除一组文件。git rm 命令用于从工作树和索引中移除或删除文件。
命令:
git rm <file_name>
现在,如果您使用命令git status,它会显示该文件已被删除。
13. Git 合并
Git merge 是一个允许您合并 Git 分支的命令。它保留了完整的历史和时间顺序,并维护了分支的上下文。
下图演示了我们如何通过从主分支分支来创建不同的特征,以及我们如何在最终审查后将新创建的特征合并到主分支。
![](https://i-blog.csdnimg.cn/blog_migrate/b2aac9d1afabf6cc56cb47dcaff93768.png)
命令git merge用于合并分支。
命令 :
git merge <branch_name>
14.GIT 变基
Git Rebase 是将一系列提交组合成新的基础提交的过程。
变基的主要原因是维护线性项目历史。
当你变基时,你“拔出”一个分支并将其“重新插入”到另一个分支(通常是主分支)的尖端。
变基的目标是从一个特性分支中获取所有提交并将其放在主分支上。
以下变基命令用于变基提交:
git rebase <branch_name>
15. Git 获取
Git Fetch只会将最新的更改下载到本地存储库中。它会下载自上次获取以来其他开发人员已推送到远程存储库的新更改,并允许您稍后使用Git Merge手动查看和合并。由于它不会更改工作目录或暂存区域,因此可以安全使用。
下图显示了命令 git fetch 的工作。它获取在远程存储库中所做的所有最新更改,并让我们进行相应的更改。
![](https://i-blog.csdnimg.cn/blog_migrate/e910c166af08cc553744568145c9aeab.png)
使用的命令是:
git fetch <branch_name>
16. Git Pull 远程分支
您可以将已从分叉的远程存储库中所做的任何更改提取到本地存储库。
如下图所示,使用 git pull 命令,可以从远程存储库中获取所有更改和内容,并可以立即在本地存储库中更新以匹配内容。
![](https://i-blog.csdnimg.cn/blog_migrate/2b282a929094c3cce61439a5461109ab.png)
我们可以使用git pull命令简单地拉取远程存储库。语法如下:
git pull
该命令等同于
git fetch origin head
使用以下命令检查是否有任何更改:
git pull <RemoteName> <BranchName>
如果没有变化,它将显示“Already up to date”。否则,它将简单地将这些更改合并到本地存储库中。
17. Git 存储
有时在大型代码库中,可能会出现一些情况,我们不想提交我们的代码,但同时又不想丢失未完成的代码。这就是git stash发挥作用的地方。git stash命令用于将工作目录和索引的当前状态记录在一个 stash 中。
它将未完成的代码存储在一个 stash 中,并清除当前分支中任何未提交的更改。现在,我们可以在一个干净的工作目录上工作。
如果将来我们再次需要访问该代码,我们可以简单地使用存储并将这些更改应用回工作存储库。
如下所示,使用命令git stash,我们可以暂时存储我们对工作副本所做的更改,并可以处理其他内容。稍后,当需要时,我们可以git stash pop 并再次开始处理它。
![](https://i-blog.csdnimg.cn/blog_migrate/8291ab77d15c4b646b0e93945a94eb68.png)
如何在 Git 中存储更改?
存储的语法如下:
git stash
假设您在网站上工作,代码存储在存储库中。
现在假设,您有一些名为design.cssand的文件design.js。现在您想存储这些文件,以便以后在处理其他事情时可以再次使用它们。
因此,稍后您可以使用git stash list命令查看所有更改。
掉落藏匿处
如果您不再需要存储,可以使用以下命令将其删除:
git stash drop <stash_id>
如果你想删除所有的藏品,只需使用:
git stash clear
18. Git-Ignore
有时,我们可能希望 Git 在提交时忽略一些文件。例如,包含密码、API 等的私有文件或文件夹。这些文件是特定于用户的,因此我们可以使用 .gitignore 忽略它们。
.gitignore在项目目录中自动生成,并忽略提交到存储库的文件。
如何使用.gitignore?
按照以下步骤添加您希望 Git 忽略的文件。
在您的 PC 上打开您的项目目录。
在其中创建一个.gitignore文件。
在.gitignore中写下你希望 Git 忽略的所有文件的名称。
现在将 .gitignore 添加到您的存储库中。
现在,如果你检查你的 repo 的状态,你会看到,所有写在.gitignore文件中的文件都被忽略了。
19. 高级 Git 概念
git pull --rebase
Git rebase 用于将提交从一个分支重写到另一个分支。为了将未发布的本地更改与已发布的远程更改结合起来,git pull执行了。
使用git pull --rebase,未发布的更改将再次应用于已发布的更改,并且不会将新提交添加到历史记录中。
git merge --squash
squash与 git merge 一起生成了工作树。它的索引方式与真正的合并相同,但丢弃了合并历史。
命令:
git merge --squash origin/main
什么时候使用git merge --squash?
当您将 main 合并到您的分支并解决冲突时。
当您需要覆盖原始提交时。
git reflog
reflog记录在存储库中所做的每个更改。除此之外,如果某些分支从回购中丢失,可以使用此命令进行恢复。
命令:
git reflog
git revert
还原只是意味着撤消更改。因此,它是 Git 中的撤消命令。与传统的撤销操作不同,revert 命令不会删除任何数据。git revert 是一个提交操作,因为它撤销指定的提交。
命令:
git revert
选项:
还原提交:
此选项用于还原提交。
命令:
git revert <commit_id>
在还原提交之前编辑提交消息:
以防万一,我们想在恢复之前编辑提交消息,-e 用于相同的目的。
命令:
git revert -e <commit_id>
git bisect
Git bisect 是一个用于调试的 git 工具。假设,你有一个很大的代码库,一些提交导致了一个错误,但你不确定是哪个提交导致了它。
Git bisect 遍历所有以前的提交并使用二进制搜索来查找有问题的提交。
git bisect命令用于找到如图所示的平分位置。它将您的历史一分为二(划分)在好的和坏的提交范围之间。然后,它遍历此范围之间的每个提交 ID,并在每个快照中允许您测试代码。
![](https://i-blog.csdnimg.cn/blog_migrate/19b261a83a6d7d2610478cfdfb9f5e4a.png)
它的应用如下:
git bisect start- 开始平分
git bisect good v1.0- 提及最后的工作提交。
git bisect bad- 提到当前提交有一个错误。
它将返回导致错误的提交,并且可以有效地调试问题。
git blame
git blame 用于了解谁/哪个提交负责存储库中的最新更改。通过这个可以看到每一行的作者/提交。
命令:
git blame <file_name>
此命令显示负责更改所有代码行的提交。
git cherry-pick
从一个分支中选择一个提交并将其应用到另一个分支在 Git 中被称为cherry picking 。以下是挑选提交的步骤:
访问您要申请提交的分支并使用以下命令:
git switch master
运行以下命令:
git cherry-pick <commit_id
Git 子模块
子模块是一种工具,允许将外部存储库附加到特定路径的另一个存储库中。它允许我们将一个 git 存储库作为另一个 git 存储库的子目录。
命令:
添加 git 子模块:这将 git URL 作为参数并将指针 repo 克隆为子模块。添加 git 子模块的语法是:
git submodule add <URL_link>
git 子模块初始化
git submodule init是将映射从 .gitmodules 文件复制到 ./.git/config 文件中。git submodule init具有接受显式模块名称列表的扩展行为。
这启用了仅激活在存储库上工作所需的特定子模块的工作流。
命令:
git submodule init
Git 子树
git subtree 允许您将一个存储库作为子目录嵌套在另一个存储库中。它是 Git 项目管理项目依赖关系的几种方式之一。
git-subtree 是一个包装器 shell 脚本,以促进更自然的语法。这实际上仍然是 contrib 的一部分,并没有通过通常的手册页完全集成到 git 中。
子树只是一个子目录,可以以您想要的任何方式提交到您的项目、从中分支以及与您的项目合并。
命令:
添加:假设您有一个本地存储库,您希望
将外部供应商库添加到该存储库。在这种情况下,我们会将 git-subtree 存储库添加为 ~/git-extensions/ 中现有 git-extensions 存储库的子目录:
git subtree add --prefix=git-subtree --squash \<Git_repo_link>
pull :它类似于从存储库中添加前缀的拉取。
命令:
git subtree pull --prefix <URL_link>
Git 子模块 VS 子树
Git 子模块 | Git 子树 |
它是指向另一个存储库中的提交引用的链接 | 代码合并到外部存储库的历史记录中 |
要求子模块可在服务器(如 GitHub)中访问 | Git 子树是分散的,这基本上意味着它的组件在一堆连接的计算机之间共享。 |
Git 子模块更适合基于组件的开发,您的主项目依赖于另一个组件(repo)的固定版本。 | Git 子树更像是一个基于系统的开发,你的 all repo 一次包含所有内容,你可以修改任何部分。 |
适用于较小的存储库大小 | 适用于更大的存储库大小 |
20. Git 命令
下表显示了最常用的 Git 命令:
S. 没有 | 命令名称 | 使用 |
1 | git init | 初始化本地 Git 存储库 |
2 | git add | 将一个或多个文件添加到暂存区 |
3 | git commit -m “提交信息” | 将更改提交到 head 但不提交到远程存储库。 |
4 | git status | 检查当前存储库的状态并列出已更改的文件。 |
5 | git log | 提供在分支上进行的所有提交的列表 |
6 | git diff | 查看您对文件所做的更改 |
7 | git push origin <branch name> | 将分支推送到远程仓库,以便其他人可以使用它。 |
8 | git config --global user.name “Name” | 通过配置作者姓名告诉 Git 你是谁 |
9 | git config --global user.email user@email.com | 通过配置作者电子邮件 ID 告诉 Git 你是谁。 |
10 | git clone <存储库名称> | 从远程源创建 Git 存储库副本 |
11 | git remote add origin <server> | 将您的本地存储库连接到远程服务器并添加服务器以便能够推送它。 |
12 | git branch <branch_name> | 创建一个新分支 |
13 | git checkout<branch_name> | 从一个分支切换到另一个分支 |
14 | git merge <branch_name> | 将分支合并到活动分支 |
15 | git rebase | 在另一个基本提示之上重新应用提交 |
16 | git checkout -b <branch_name> | 创建一个新分支并切换到它 |
17 | git stash | 将更改存储到脏工作目录中 |
18 | git pull | 将本地存储库更新为最新的提交 |
19 | git revert <commit_id> | 还原提交更改 |
20 | git clean -n | 显示将从工作目录中删除哪些文件。使用 -f 标志代替 -n 标志来执行清理。 |
21 | git log --summary | 查看更改(详细) |
22 | git diff HEAD | 显示工作目录和上次提交之间的差异。 |
23 | git log --oneline | 查看更改(简要) |
24 | git reflog | 显示对本地存储库 HEAD 的更改日志。添加 --relative-date 标志以显示日期信息或 --all 以显示所有参考。 |
25 | git rebase -i <base> | 以交互方式将当前分支变基到 <base> 上。启动编辑器以输入有关如何将每个提交转移到新基础的命令。 |
26 | git restore --staged <file_name> | 重置暂存文件 |
27 | git rm -r [file_name] | 删除文件(或文件夹) |
28 | git config --list | 列出配置文件中设置的所有变量及其值 |
29 | git branch -d <local_branch> | Git 删除本地分支 |
30 | git push -d <remote_name> <branch_name> | Git 删除远程分支 |
31 | git stash pop | 取消存储更改 |
32 | git commit -am | -am 与命令一起用于在命令行上为已经暂存的文件写入提交消息。 |
33 | git commit -ammend | 修改用于编辑最后一次提交。如果我们需要更改最后提交的消息,可以使用此命令。 |
34 | git rm | git rm 命令用于从工作树和索引中移除或删除文件。 |
35 | git pull --rebase | Git rebase 用于将提交从一个分支重写到另一个分支。 |
36 | git merge --squash | squash 与 git merge 一起生成了工作树。它的索引方式与真正的合并相同,但丢弃了合并历史。 |
37 | git revert -e <commit_id> | 在还原之前编辑提交消息,-e 用于相同的用途。 |
38 | git bisect | Git bisect 遍历所有以前的提交并使用二进制搜索来查找有问题的提交。 |
39 | git blame | git blame 用于了解谁/哪个提交负责存储库中的最新更改。 |
40 | git cherry-pick | 从一个分支中选择一个提交并将其应用到另一个分支在 Git 中被称为 cherry picking。 |
结论
因此,我们了解了 Git 如何使管理大型软件代码库变得更容易、如何提交更改、克隆存储库、分支如何工作以及许多减轻开发人员生活负担的 git 命令。
为了测试您对 Git 的理解,提供了一些 MCQ。选择正确的选项。