Git 的原理与使用(中)(三)

简介: 别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。

Git 的原理与使用(中)(二)+ https://developer.aliyun.com/article/1521973?spm=a2c6h.13148508.setting.17.439a4f0eWJ4WIw


2.远程仓库


Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。


你肯定会想,至少需要两台机器才能玩远程库不是?但是我只有一台电脑,怎么玩?


其实一台电脑上也是可以克隆多个版本库的,只要不在同一个目录下。不过,现实生活中是不会有人这么傻的在一台电脑上搞几个远程库玩,因为一台电脑上搞几个远程库完全没有意义,而且硬盘挂了会导致所有库都挂掉,所以我也不告诉你在一台电脑上怎么克隆多个仓库。


实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。


完全可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作。好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。


这里贴一个博主本人的Github主页:GitHub,里面分享了一些开源项目,欢迎来访交流。


不过,Github是国外的网站,速度比较慢。而国内也有好用的开源平台,即Gitee(码云)。


这里采用码云来托管代码,我们从零开始来使用一下码云远程仓库。





新建远程仓库


1、新建远程项目仓库:





2、填写基本信息:





3、创建成功:





4、创建成功后,我们可以对远程仓库进行一个基本的设置:开源or私有






5、也可以在设置-仓库成员管理中管理协作者:




6、从创建好的远程仓库中我们便能看到,之前在本地学习过的分支,也存在于远程仓库中并被管理起来了。刚创建的仓库有且只有一个默认的master分支:




Issues


当把仓库设置为开源后,所有的用户都可以浏览这个仓库的内容。如果浏览者发现了你仓库中代码的bug,该怎么和你联系呢?

gitee和github都提供了Issues功能,这个功能是让仓库的浏览者和仓库的成员进行交流的地方。




点击「新建Issue」,就进入编辑Issue的页面:




选择完毕之后,点击「创建」,在Issues版块中就会显示刚才提交的问题:




如果已经处理完这个bug,那么可以继续进入问题详情更改问题的状态:





Pull Request

实际开发中,直接允许dev分支的内容合并到master分支上是非常不安全的,很容易影响master分支上代码的稳定性。


因此,在有dev分支与master分支合并的需要时,应当由开发者提出一个dev分支的PR(即Pull Request,合并申请单)给仓库的管理员,PR中需要包含dev分支的一些信息,如做了什么改动、为什么要合并等。只有仓库管理员同意了,才能将dev中的代码merge到master中去。


仓库的PR信息在Pull Request版块可以看:




在创建项目时,也可以选择Pull Request的模板。


克隆远程仓库


克隆/下载远端仓库到本地,需要使用 git clone 命令,后面跟上我们的远端仓库的链接。

远端仓库的链接可以从仓库中找到:选择“克隆/下载”获取远程仓库链接:




SSH协议和HTTPS协议是Git最常使用的两种数据传输协议。


SSH协议使用了公钥加密和公钥登录机制,体现了其实用性和安全性,使用此协议需要将我们的公钥放上服务器,由Git服务器进行管理(Git服务器就由gitee平台代替了,gitee平台上有地方可以配置本地服务器的公钥,等到使用ssh协议的时候再来配置)。


使用HTTPS方式时,没有任何要求,可以直接克隆下来。


HTTPS协议克隆

在执行克隆 git clone 操作时,不能在本地仓库(.git)所在的目录下执行,其他地方都可以执行:





origin是远程仓库默认的仓库名,可以用 git remote 命令来查询远程仓库信息:




上面显示了可以抓取和推送的origin的地址。如果没有push / fetch权限,就看不到相应的push / fetch的地址。fetch和push表示当前本地仓库拥有对远程仓库的抓取权限和推送权限:


克隆远程仓库后,所有的操作是在本地来完成的,本地提交的修改如何推送到远端呢?就要使用到push权限去push远端仓库的地址


fetch表示抓取,如果远程仓库中存在一些本地没有的内容时,就需要去远程仓库获取新的内容,这就要使用到fech权限。


有了这两个权限,才能让本地仓库和远程仓库之间有一些交互的操作。


SSH协议克隆


SSH协议使用的是公钥加密和公钥登录的机制。


如果要使用SSH协议来进行git仓库克隆,必须要把自己本地服务器上的公钥放到git服务器上来进行管理,才可以克隆成功。


可以在设置页中查看公钥的使用情况:






在没有配置任何公钥的情况下进行SSH克隆:




使用SSH方式克隆仓库,由于我们没有添加公钥到远端库中,服务器拒绝了我们的clone链接。需要我们设置一下。




如何在本地服务器上查看公钥的内容?


首先在用户主目录(即家目录,cd ~)下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa(私钥,保存在自己的服务器上,不对外展示)和id_rsa.pub(公钥)这两个文件。如果有公钥,那直接把公钥的内容复制到上面的页面中即可。




如果已经有了,可直接跳到下一步。如果没有,需要创建SSHKey。

~目录下使用命令:


ssh-keygen -t rsa -C "<你在gitee上绑定的邮箱地址>"

gitee上绑定的个人邮箱地址在设置页中查看:




此时命令就是:


ssh-keygen -t rsa -C "xxxxxxxxxx@qq.com"

注意输入自己的邮箱,然后一路回车,都使用默认值即可:




此时就把我们的公钥和私钥都创建好了。可以在用户主目录里找到 .ssh 目录,里面有 id_rsaid_rsa.pub 两个文件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去;id_rsa.pub 是公钥,可以放心地告诉任何人。




cat一下公钥,将其中的内容一字不差地复制粘贴到gitee的公钥配置页面即可。




然后添加自己的公钥到远端仓库:




配置好后可见:



点击确认后,需要对你进行认证,输入你的账号密码即可。至此,我们的准备工作全部做完,可以开始欢快地clone了~




done,成功!


如果有多个人协作开发,GitHub/Gitee允许添加多个公钥,只要把每个人的电脑上的公钥都添加到GitHub/Gitee,就可以在每台电脑上往GitHub/Gitee上提交推送了。


向远程仓库推送 push

当本地仓库的内容领先于远程仓库时,就可以通过本地向远程仓库推送的方式把本地最新的修改推送上去。


将远程仓库克隆下来后,依然要先配置本地git仓库的配置项,使用 git config -l 命令:



本地仓库的邮箱和用户名必须与远程仓库的邮箱用户名一致。如果之前配置过 --global 的config,那么远程仓库拉到本地时,user和email也会自动使用之前配置的global配置项。若本地的配置和远程仓库的配置不一样,则会出错;若从来没有配置过global配置项,那么克隆到本地的本地仓库是没有用户名和邮箱配置项的,第一次提交时也会报错,需要重新配置。


可直接更改:


git config --global user.email "<邮箱地址>"
 
git config --global user.name "<用户名>"


当我们从远程仓库克隆后,Git会自动把本地的master分支和远程的master分支对应起来,并且,远程仓库的默认名称是origin。


在本地我们仍然可以使用git remote命令来查看远程库的信息,或者用git remote -v显示更详细的信息。


如何把本地仓库中的修改推送到远程仓库中?



将本地仓库的内容推送至远程仓库,需要使用push命令,该命令用于将本地的分支版本上传到远程并合并,如果远程仓库下当前并没有push命令中指定的远程分支名,则会自动在远程创建。


命令格式如下:


git push <远程主机名> <本地分支名>:<远程分支名>
 
# 如果本地分支名与远程分支名相同,则可以省略冒号
git push <远程主机名> <本地分支名>

此时我们要将本地的master分支推送到origin主机的master分支:



推送成功!这里由于我们使用的是SSH协议,是不用每一次推送都输入密码的,方便了我们的推送操作。如果你使用的是HTTPS协议,有个麻烦地方就是每次推送都必须输入口令。


接下来看码云远端,就能看到本地的代码已经被推送上来了。


拉取远程仓库


当远程仓库的内容领先于本地仓库时,可以通过拉取远程仓库来把远程仓库的修改拉取到本地。


使用 pull 命令。


注意:不要直接在远程仓库更改任何的代码,如果要改,也要在本地改完再推送上去。


这里用于模拟远程仓库内容领先于本地仓库的情况:


1、在gitee上点击README.md文件并在线修改它。


2、修改内容。




此时,远程仓库是要领先于本地仓库一个版本,为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。


git pull

命令会从远程仓库获取更新,并自动将这些更新合并到当前所在的本地分支。【pull等于拉取+合并】


当运行 git pull 时,它其实执行了两个操作:git fetch 和 git merge。


首先,它使用 git fetch 从远程仓库获取最新的提交和文件,并将这些更新存储在本地的远程跟踪分支中(例如origin/main(远程跟踪分支的名称由远程仓库名和分支名组成,它们用斜杠 / 分隔))。


接着,它自动使用 git merge 将远程跟踪分支的内容合并到当前所在的本地分支。


Git提供了命令,该命令用于从远程获取代码并合并本地的版本。格式如下:


git pull <远程主机名> <远程分支名>:<本地分支名>
 
# 如果远程分支与当前分支名称相同,则冒号后面的部分可以省略。
git pull <远程主机名> <远程分支名>



同名分支对应关系时冒号可以省略:如果你当前的本地分支与远程分支存在同名且已经建立了追踪关系,那么可以直接执行 git pull,Git 会自动识别并拉取对应的远程分支。例如:


如果你当前在本地的 master 分支上,并且要拉取远程仓库的 origin/master 分支,那么可以省略冒号的使用。




通常情况下,如果没有指定远程仓库和分支,则会将与当前本地分支相关联的远程分支合并到本地分支。


如果你不在 dev 分支上,也可以使用以下方式在不用切换到dev分支的前提下就能将远程 origindev 分支到本地的 dev 分支上。


git pull origin dev:dev


3.配置Git


忽略特殊文件


在日常开发中,我们有些文件不想或者不应该提交到远端,比如保存了数据库密码的配置文件。


那怎么让Git知道呢?在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就不会追踪管理这些文件了。


不需要我们自己从头写.gitignore文件,gitee在创建仓库时就可以为我们生成。在创建git仓库时,有一个初始化仓库的选项,里面有一个“添加 .gitignore模板”:



当然,如果我们要写的是Java程序,那么就可以选择Java的.gitignore文件模板。


选择完毕后点击创建,就会在仓库中自动生成一个.gitignore文件,并且文件中的内容会根据我们所选的模板来进行初始化。


如果当时创建仓库的时候没有选择.gitignore文件模板,那么自己在工作区创建一个也是可以的。


例如我们想忽略以 .so 和 .ini 结尾所有文件,.gitignore 的内容如下:


#省略选择模本的内容
...
 
# Myconfigurations:
# 可以直接写文件名(指定某个确定的文件),也可以用通配符
*.ini
*.so

检验 .gitignore 的标准是 git status 命令是不是说 working tree clean 。我们发现Git 并没有提示在工作区中有文件新增,说明 .gitignore 生效了:




以下的演示中,.gitignore文件是本地新创建的,还没有commit或推送给远端,因此它本身的修改也会被记录,就没有显示working tree clean了。



但有些时候,你就是想添加一个文件到 Git,但由于这个文件被 .gitignore 忽略了,根本添加不了怎么办呢?


1、方法一


可以在add时加上 -f 选项进行强制add:


git add -f b.so


但不建议使用这种方式,因为最好不要违背.gitignore文件中的配置。


2、方法二


有些时候,当我们编写了规则排除了部分文件时,比如.*,但是我们发现 .* 这个规则把 .gitignore 也排除了。此时不想更改.gitignore规则又要做到不把.gitignore排除,可以在.gitignore文件中编辑规则:



把指定文件排除在 .gitignore 规则外的写法就是 ! +文件名,所以,只需把例外文件添加进去即可。





Changes to be commited:已经add了,提示需要commit


Changes not staged for commit:曾经已经提交过的文件,已经被git管理了,然后再去修改就会有这个提示。


Untracked files:新建的文件,git还未追踪管理它


如果一个文件没有被git管理,但又忘记是否存入.gitignore中,可以使用命令进行ignore规则检查:


git check-ignore -v <文件名>

来查看原因。



给命令配置别名


我们可以通过


git config [--global] alias.别名 原命令名


的方式来给git命令配置别名。


如将 git status 简化为 git st ,对应的命令为:


git config --global alias.st status

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。如果不加,那只针对当前的仓库起作用。



再来将git log -l配置为 git last ,让其显示最后一次提交信息:


git config --global alias.last 'log -1'



再将查看提交日志(--pretty=oneline意思是以一行的格式打印, --abbrev-commit意思是只打印commit id的前几位数)


git log --pretty=oneline --abbrev-commit这一命令配置为更为简短的git lpa




不过还是不推荐大家太早去使用它,还是应当所有的Git命令都手动输入,以尽快熟悉Git。


**小结

本篇涉及的部分git命令:


git cat-file -p :查看提交信息


git branch:显示当前所有分支


git branch <分支名>:创建分支


git checkout <分支名>:切换分支


git merge <分支名>:合并分支


git checkout <分支名>:切换分支


git branch -d <分支名>:删除分支(非强制)


git branch -D <分支名>:删除分支(强制)


git checkout -b <分支名>:创建并切换分支


git log --graph --abbrev-commit:查看分支合并情况


git stash:储藏工作区内容


git stash list:查看stash存放哪些内容


git stash pop:恢复工作区内容


git clone:克隆远程仓库


git push:将本地的分支版本上传到远程并合并


git fetch:从远程仓库获取最新的提交和文件


**下篇内容

Git 的原理与使用(下)-CSDN博客


七、标签管理


八、多人协作


九、企业级开发模型

相关文章
|
6月前
|
Linux 网络安全 开发工具
1.Git使用技巧-基础原理
1.Git使用技巧-基础原理
63 0
|
Linux 网络安全 开发工具
【Git】Git 原理和使用
【Git】Git 原理和使用
416 4
|
6月前
|
存储 开发工具 git
Git的基本操作和原理
Git的基本操作和原理
|
3月前
|
存储 开发工具 数据库
Git的工作原理是什么
【8月更文挑战第24天】Git的工作原理是什么
38 0
|
5月前
|
前端开发 持续交付 开发工具
详细介绍Git的基本原理、在前端开发中的应用以及如何使用Git来优化团队协作
【6月更文挑战第14天】Git是前端开发中的必备工具,它通过分布式版本控制管理代码历史,支持分支、合并和冲突解决,促进团队协作。在前端开发中,Git用于代码追踪、版本控制、代码审查和持续集成部署,优化团队协作。制定分支策略、编写清晰提交信息、定期合并清理分支以及使用Git钩子和自动化工具能进一步提升效率。理解并善用Git,能有效提升前端项目的质量和开发效率。
74 3
|
6月前
|
运维 测试技术 开发工具
Git 的原理与使用(下)(二)
新特性或新功能开发完成后,开发人员需合到 develop 分支。
54 2
|
6月前
|
存储 安全 开发工具
Git 的原理与使用(中)(二)
Fast Forward 模式(ff模式) 通常合并分支时,如果可以,Git 会采用 Fast forward 模式。
36 1
|
6月前
|
安全 Java 开发工具
Git 的原理与使用(中)(一)
分支是Git的杀手级功能之一。
45 1
|
6月前
|
存储 算法 开发工具
Git 的原理与使用(上) (二)
如果直接将某个文件拷贝到 .git 文件的同级目录gitcode下,此时这个文件是不会被Git管理的。
50 1
|
6月前
|
Linux 开发工具 git
Git 的原理与使用(下)(一)
在完成origin/dev分支合并到origin/master分支的操作后,origin/dev分支对于我们来说就没用了,那么dev分支就可以被删除掉。
60 0