锦通 发表于 2024-8-21 01:19:25

【Git Bash】简明从零教学

Git 的作用

官网先容

Git 作为一个免费的、开源的分布式 版本控制系统,可以高效地处置惩罚包括轻量、重量级在内的各种项目。Git 有廉价的本地库,方便的暂存地区和多个工作流分支等特性。
简明概要

同一项目 Project 在开辟过程中大概出现形如 Project_20230616_byLee,Project_20230617_byMa,Project_20230630_backUp,Project_20230701_rollBackOn0617,Project_20230701_modified,Project_20230703_finalByMa 等多个协同开辟者版本、多个备份版本、跨版本回滚修改、跨协同开辟者打包拷贝的混乱环境。为避免此,我们必要利用 Git 的如下特性:


[*]管理本地(客户端)项目资源
   如记录文档修改内容,新建项目版本号、分支(branch) 等。开辟者为避免项目开辟出现致命错误而无法回退到最近一次可行现场,偶然会对上一可靠版本进行拷贝备份,但这样操作会开辟过程中出现多个备份,占用了大量的存储空间。为此,Git 管理应运而生。


[*]将本地项目资源与远端代码托管中心(服务端)进行互联
   开辟者可将本地资源推送(push)上传至远端进行云备份,同时多个开辟者也可对此云项目进行拷贝(copy)、下拉(pull)至本地进行异地多分支开辟,经合并(merge)后推送至远端主分支。常见的远端有 GitHub、Tencent CODING DevOps 等。


[*]为 Windows OS 提供 Linux 系统下令行的交互终端
   在 Windows cmd 下无法执行 mkdir、ls、touch、vim、cp、rm 等常用 Linux 指令,但在 Git Bash Terminal 的资助下可以实现此类交互。
Git 下载链接

官方地址:https://git-scm.com/
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git 的初始设置

https://i-blog.csdnimg.cn/blog_migrate/60527e88353c41ca3b8ef9c97c3e1d37.png
定位到项目文件夹,右击鼠标在菜单栏选择 Git Bash Here,进入Terminal。并键入:
git -v
git -h
以检察已安装的 Git 版本号和资助文档,查验是否安装乐成。
https://i-blog.csdnimg.cn/blog_migrate/05a100c0bdc2e21788a09f25063c9c7c.png
   注意,Git Terminal 的复制快捷键为 ctrl + insert ,粘贴快捷键为 shift + insert。
设置用户

起首需为本台设备上的开辟者设置 用户名、邮箱 等信息,用于记录项目各版本下的 录入人签名 以区分差别操作者身份,以及用于后续的 远端辨认。
   如某一项目分居实验室、寝室两地开辟,我们可以将实验室设备用户名命为 my-lab,将寝室设备用户名命为 my-laptop,这样可以在改项目回滚时确定某一功能块的修改者。


[*]设置用户名
git config --global user.name "your name"


[*]设置用户邮箱
git config --global user.email "youremail@github.com"
   如果读者想要在后续的远端部分使用 GitHub 作为资源库,发起用户名、邮箱与 GitHub 注册信息同一,以便管理。但二者并无一定接洽。


[*]检察已设置的用户信息
cat ~/.gitconfig
https://i-blog.csdnimg.cn/blog_migrate/a26c8938824aed6c3c5cab8f8390e303.png
初始化本地库

如今采用如下指令在当前项目目次下建立一个 git 本地库:
git init
ls ./.git
执行完毕后,可以看到本地的项目目次文件夹内出现了一个名为 .git 的隐藏文件夹,内部存有一些设置信息,如索引、提交记录等。
https://i-blog.csdnimg.cn/blog_migrate/7c8b6de6d0ff65098aca80544841dd0f.png
Git 状态查询

Git 可记录当前项目的各个版本号以及其对应的修改记录,并支持回滚。Git 目前的状态可通过如下指令进行查询:
git status
https://i-blog.csdnimg.cn/blog_migrate/115746bbc87a63c2c03653dd3f287c0b.png
制止目前,由于文件夹内没有增删文件、修改文件内容的操作发生,以是 Terminal 自然会表现 no commits yet。我们如今创建一个新的文档并定名为 test.txt,作为轻量级的项目示例。(如果读者已经拥有现成项目并知悉项目变动,可跳转至下一末节。)
https://i-blog.csdnimg.cn/blog_migrate/8d542dd3ecfe98b1893d9cc146e6f3e7.png
创建好 test.txt 后,再次执行状态查询指令,我们发现 Terminal 中输出了未被追踪文件(Untracked files),并被标记为了赤色。
   test.txt 作为新建的文件,与 Git 中记录中 版本汗青堆栈 出现的文件目次,和当前的 暂存区 中出现的文件目次存在冲突,以是被标记为了赤色。后续开辟者必要将 test.txt 添加(add)至 暂存区 并提交(commit)至 版本汗青堆栈,才可在 Git 中完成记录。后面的章节会提到其工作机制以及操作细节。
Git 工作机制

Git 的工作流如图所示,框内部分为本地工作机制,框外传递部分为面向远端的工作机制:
https://i-blog.csdnimg.cn/blog_migrate/39533a14d85bcf808e9f25ff9b157938.png
本地工作机制

在项目的当前 工作目次(Workspace) 下,开辟者进行编写、新建、删除文件或文件内容。对于已修改的文件目次大概文件内容,开辟者可以将其添加(add)至 暂存区(stage),在所有标红提示的 未被追踪文件 完成添加后,我们再一并将它们提交(commit)至 本地的版本汗青堆栈(Local Repository) 中。
远端工作机制

如第一节中提到的 Git 作用,开辟者可以将 本地堆栈 推送(push)到位于 GitHub 的 远端堆栈(Remote Repository) 作为代码托管;将 远程堆栈 的分支最新内容完全拉取(pull)至本地 工作目次 并与当前本地分支直接合并,或将 远程堆栈 的分支最新内容拿取(fetch)至 本地堆栈 但不做合并。
Git 的本地管理操作

如状态查询和工作机制章节中提到的情景,我们必要做出一些操作,来使得 Git 记录下本地的所有修改。同时需支持对修改记录的日记进行查询,以完成项目的版本穿梭。
以下是一些常用的 Git 本地管理相干下令:
指令作用1git add <pathspec>将文件 pathspec 添加至暂存区2git commit -m <message>提交本次修改并做 message 批注3git reflog检察各提交的引用日记4git log检察各提交的日记5git reset --hard <reflog>
穿梭(回滚)到 reflog 对应的项目版本 add 将修改添加至暂存区

通过指令 git add <pathspec>,我们可以添加 git status
中被标红的 未被追踪文件 至暂存区,如:
git add test.txt
git status

再次检察 git status
,可以发现该文件已被标记为绿色。
https://i-blog.csdnimg.cn/blog_migrate/c2ca252cd0a8156ea3527b176a243781.png
   键入 tab 可自动补全子目次名。
commit 将暂存区提交至本地堆栈

通过指令 git commit -m <message>,我们可以提交暂存区内容至本地堆栈,如:
git commit -m "This is my first commit, and a new file is created." test.txt
https://i-blog.csdnimg.cn/blog_migrate/81f1f2f27df8f6526141a0fb0ca96ced.png
如今我们来模拟版本迭代的环境:
https://i-blog.csdnimg.cn/blog_migrate/22d895995e555aaa5abbd37c5ec45b30.png
如图所示,当 commit 完成后,我们又对 test.txt 的文件内容进行了修改,添加了两行笔墨。当同一文件被提交后再次被修改,检察 git status
依然会标记该文件为 未被追踪文件。此时我们必要将该文件再次 add 至暂存区,并进行二次 commit,以完成记录:
git status
git add test.txt
git status

git commit -m "This is my second commit, and the file is modified." test.txtgit status
https://i-blog.csdnimg.cn/blog_migrate/ebfaca70a6bad759e6bde163b854ebaa.png
操作完成后可发现文件内容修改已被记录,目前的工作区是干净的。
日记查询



[*]下令 git reflog 用于检察当前堆栈的引用日记(Reference log):引用日记记录了堆栈中分支、标签和 HEAD 移动的汗青记录。
[*]下令 git log 用于检察 Git 堆栈的提交日记:它表现了每个提交的作者、提交时间、提交信息等。
git reflog
git log
https://i-blog.csdnimg.cn/blog_migrate/6b6b4a665481b2e4b222bf7d083ff603.png
版本穿梭

Git HEAD 默认指向提交后的最新的版本,通过以下指令修改 Git HEAD 指向的引用版本号,可以进行本地堆栈回滚,同时本地工作区也会同步回滚:
git reset --hard <reflog>


[*]穿梭到 test.txt 为空时的 the first commit 版本:
https://i-blog.csdnimg.cn/blog_migrate/fb876f0bf84da92c8c428d02b9b954f5.png
[*]穿梭到 test.txt 有内容时的 the second commit 版本:
https://i-blog.csdnimg.cn/blog_migrate/307c8b4af54a2f32aa473e28cd6bafaf.png
同理,此指令支持多文件项目的版本回滚。
Git 分支

Git 分支(branch) 是一种用于在开辟过程中并行工作的功能。它允许开辟人员在不影响主分支的同时,与其他人合作开辟新的功能或解决问题。在 Git 中,可以创建,切换和合并分支。分支的底层管理逻辑由指针完成,当前视角 HEAD 指向当前分支。
https://i-blog.csdnimg.cn/blog_migrate/f23910b350d1c71748d5f911a309d98a.png


[*]分支可使得多个开辟者 同时且并行 推进各功能开辟,提高开辟服从;
[*]各分支的修改与开辟 不影响已经提交 的代码(如 主分支 master);
[*]各分支的修改内容 可以出现重叠,但提交后合并时需经过冲突判断,并由开辟者操作选择终极保存部分;
[*]某一分付出现崩溃或开辟失败,不会对其他分支有任何影响,仅在出现问题的分支上做版本穿梭回滚即可。
读者可以跳转至 A successful Git branching model 检察各较为成熟的分支团队开辟模子,如在 主分支(master) 可分出 热补丁(hotfix),发布版(release),开辟版(develop),特性(feature) 分支供团队各职能部分开辟。此文章剩余部分仅对学生常见的多人开辟、多地开辟场景做示例(如小组作业合作、实验室与寝室跨地开辟)。
https://i-blog.csdnimg.cn/blog_migrate/a139453730b2a37ed24c74bd113b684e.png
以下是一些常用的 Git 分支相干下令:
指令作用1git branch -v
检察各分支2git branch <new-branch>创建名为 new-branch 的新分支3git checkout <branch>切换到名为 branch 的分支4git checkout -b <branch>创建并切换到名为 branch 的分支5git merge <branch>将名为 branch 的分支合并到 当前 分支上6git branch -d <branch>删除名为 branch 的分支 检察分支

我们可以使用如下指令来检察本地堆栈中包含的 所有开辟分支,目前所处的分支将会被 标记为绿色,且在绝对路径后的 括号内 会有当前分支对应的名称标识:
git branch -v
https://i-blog.csdnimg.cn/blog_migrate/aaddfb71736b77d57c86373179576f01.png
可以看到当前项目的本地堆栈内仅包含一个 主分支(master),我们位于主分支上,且其被标记为了绿色。
创建与切换分支

我们使用如下指令创建一个名为 dev 的新分支,并将视角切换到该分支上:
git branch dev
git checkout dev
git brach -v
此时,当前所处分支 dev 被标记为了绿色,且括号内展示了当前分支的名称标识 (dev):
https://i-blog.csdnimg.cn/blog_migrate/83e6399a35db1181556c60952dba857d.png
跨分支修改与合并

接下来我们在 dev 分支上对 text.txt 的文件内容进行异步修改,将修改结果添加到暂存库,并提交至对应的堆栈分支:
   此处为了方便演示,修改文本内容可以使用 vim editor,教程可访问 https://www.openvim.com/。我们也可直接在 txt 中进行修改。
git checkout devvim test.txtcat test.txtgit status
git add test.txtgit commit -m "The first commit on branch dev: contents modified." https://i-blog.csdnimg.cn/blog_migrate/56d2608f127352609dc3786939549bb8.png
https://i-blog.csdnimg.cn/blog_migrate/c0fadcc7f5a8feb75357959da8c2f45d.png
可以发现 dev 分支上的文件内容已发生改变。如今我们将视角切换到主分支 master 上:
git checkout master
cat test.txt
https://i-blog.csdnimg.cn/blog_migrate/d6e894627eead0fe50b8fed7f491d136.png
由于 分支之间的开辟进度在合并之前互不影响,可以发现文件内容 又回到了修改之前的状态(the second commit on branch ‘master’)。如今我们将分支 dev 上的修改内容合并到主分支(当前分支):
git checkout mastergit merge devcat test.txtgit status
git branch -v
git reflog https://i-blog.csdnimg.cn/blog_migrate/abdf05c1cdbb8d8ed16d87d8c6630002.png
至此我们才可以在主分支内看到合并过来的 dev 分支上的修改内容。
   注意,dev 分支固然已经合并到了 master 分支上,但是 dev 分支自己依然存在。修改 master 的内容如果 正确 add 并 commit,则 不会 对 dev 进行 随动修改,同样地,切换到 dev 分支上后进行修改 并正确 add 且 commit,master 的内容也 不会随动修改。如果 没有提交 commit 随即切换了分支,那么我们将会看到另一分支的 内容被随动修改(因为所有改动依然停留在工作区而没有上传至 Git 管理系统)。
合并冲突

在重量级项目的分支开辟中,往往会合并时出现同一文件的同一位置(如某一行)对应了两种差别修改内容,自动合并产生了歧义。为了演示这一现象,我们又从主分支创建了分支 dev2。创建分支后 对二者做了如下面的修改内容,add 至暂存区并 commit:
git checkout dev2
vim test.txt
git add test.txt
git commit -m "Merge conflict test on dev2."

git checkout master
vim test.txt
git add test.txt
git commit -m "Merge conflict test on master."
https://i-blog.csdnimg.cn/blog_migrate/6853d3ff03203ceba436b0acdb47447b.png
https://i-blog.csdnimg.cn/blog_migrate/f6bf0b8b682a7180768dade5a821c528.png
此时两分支内都对文档的后几行进行的修改,但修改内容差别。以是在主分支上,dev2 合并过来时出现了冲突现象(Merge conflict in test.txt,Unmerged paths: both modified):
git reflog git merge dev2git status
cat test.txt https://i-blog.csdnimg.cn/blog_migrate/17e09cb7a627021469c981a1ff9bf573.png
其中冲突部分,<<<<<<< HEAD 与 ======= 之间对应的为当前分支的文档内容,======= 与 >>>>>>> dev 之间对应的为 dev 分支的文档内容。 手动删除多余内容,保存兴趣内容后,add 至暂存区并提交,即可解决冲突:
vim test.txtcat test.txtgit status
git add test.txtgit commit -m "merge after conflict"git status
git branch -v
git reflogcat test.txt https://i-blog.csdnimg.cn/blog_migrate/4f929dd6061a4aa023c4bec05fef3726.png
https://i-blog.csdnimg.cn/blog_migrate/8d4b337c533271a9825d26a822e5a2f7.png
https://i-blog.csdnimg.cn/blog_migrate/7474e59fbf663438e024b19491be960e.png
可以看到括号内提示的主分支合并中 (master|MERGING) 状态改为了正常 master。
Git 的远端操作

结合本地管理操作与分支的运用,我们可以将本地的项目内容向远端的代码托管中心进行交互了。此处的远端堆栈以 GitHub 为例,创建一个私有堆栈(不开源)并定名为 GitProject:
https://i-blog.csdnimg.cn/blog_migrate/c9fa29a08193366fc0fa77ba3370626a.png
常见的远端交互指令如下:
指令作用1git remote -v检察当前所有远端堆栈的地址及别名2git remote add <name> <url>添加一个新的远端堆栈 url 并定名为别名 name3git push <name> <branch>将本地分支 branch 推送到远端堆栈 name 上4git push <name> -d <remote-branch>将远端堆栈 name 上的 remote-branch 分支删除5git clone <repo>将远端堆栈 repo 的所有内容拷贝下来到本地当前目次6git pull <repo> <remote-branch>将远端堆栈 repo 上的 remote-branch 分支下拉到本地并与当前本地分支直接合并7git fetch <repo>将远端堆栈 repo 上的所有分支拿取到本地并但不合并8git fetch <repo> <remote-branch>将远端堆栈 repo 上的 remote-branch 分支拿取到本地并但不合并 clone,pull,与 fetch 的区别如图;其中 fetch 仅将远端堆栈的分支副本拿取下来,但工作区的工作目次并不会发生改变,而 pull 则是对分支副本与堆栈资源内容均做了下拉,工作区的工作目次内容会发生改变:
https://i-blog.csdnimg.cn/blog_migrate/ad0ea17eaf0c7273fd80baba83d74589.png
与远端建立连接

以前面在 GitHub 上的创建的 GitProject 为例,我们必要先获取其 ssh 地址并为其创建别名:
git remote add github-ssh "git@github.com:Sycamore-Ma/GitProject.git"
git remote -v
远端堆栈对应的 SSH 地址可在如图位置找到。
https://i-blog.csdnimg.cn/blog_migrate/c255a5e8c6cf3d1e5e5b770c84144598.png
https://i-blog.csdnimg.cn/blog_migrate/1c39d3027863b417216a8cf8eb070bee.png
SSH 秘钥协议

由于远端堆栈受 SSH 秘钥掩护,以是本地在向远端进行推送或拉取时,必要事先使用如下指令(默认回车)生资本计算机的公共秘钥,找到在本地计算机的秘钥文本存储位置,并将其粘贴至远端堆栈的协议中:
ssh-keygen
https://i-blog.csdnimg.cn/blog_migrate/13062ab21a6647c894353f59f9b3f808.png
https://i-blog.csdnimg.cn/blog_migrate/b9f948a01e8c4f60027d7cf683a77f62.png
https://i-blog.csdnimg.cn/blog_migrate/33660c1508b588d4eff5d84209f1ded2.png
详细操作流程读者可访问链接:如何解决 git@github.com permission denied (publickey). fatal could not read from remote repository。
   如果未能解决 SSH 秘钥问题,在向远端私有堆栈推送或拉取时,辨认秘钥会出现 git@github.com: Permission denied (publickey).、fatal: Could not read from remote repository. 等错误。
同样地,GitHub 上可以邀请其他成员使用 Git 管理系统进行协同开辟,读者可移步至 Git&GitHub 团队协作 了解详情。
https://i-blog.csdnimg.cn/blog_migrate/24e08f66bd6bf43e42375416aa1e538f.png
远端的推送与拉取

通过以下指令,我们可以将本地的 master 分支推送至 github-ssh 别名对应的远端堆栈:
git push github-ssh master
https://i-blog.csdnimg.cn/blog_migrate/0a9bb089cf0320ce636c30483770e60f.png
可以看到 GitHub 代码托管已经出现了新内容,远端分支为 master,与本地 master 分支同等。
https://i-blog.csdnimg.cn/blog_migrate/ea57b409f92c8552ddebe2a117722db5.png
https://i-blog.csdnimg.cn/blog_migrate/da67820510f900b1137e07567381b177.png
https://i-blog.csdnimg.cn/blog_migrate/4ce6ab9280b30f904d17e27d57e69c55.png
同样地我们可以在另外一台设备上测试拉取(该设备秘钥已经达成协议,此处不赘述),我们创建一个新的空文件夹,并在其路径上 Bash,完成前面章节的 初始化 与远端连接工作,执行远端拉取:
git initgit remote add github-ssh "git@github.com:Sycamore-Ma/GitProject.git"
git remote -v
git pull github-ssh mastergit status
git branch -v
git reflog https://i-blog.csdnimg.cn/blog_migrate/6430de0527ba00584d3832d6500d3830.png
https://i-blog.csdnimg.cn/blog_migrate/6d6ce1001ee8c41fef4be1bbb172d76b.png
https://i-blog.csdnimg.cn/blog_migrate/e1e5221060956dbdeab6a47b7cc00547.png
可以看到,另外一台设备也分布式地获取了远端代码托管中心的所有资源,可用于后续的协同修改、合并、推送。这样跨地开辟的需求就达成了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Git Bash】简明从零教学