Git小白入坑总结(部分)

发布时间 2023-09-03 00:33:00作者: ^_^ok

本地仓库的创建和初始化

直接在对应文件夹下用git init可以初始化一个本地仓库,然后文件夹里会自动生成.git文件夹,该文件夹是隐藏文件夹。这样本地仓库就初始化完成了。

git操作远程仓库

git操作远程仓库无非就是拉取/查看代码、上传代码。首先拉取代码有两条命令可以实现:

  • git pull
  • git clone

这两个的区别,这篇文章有较详细说明。

git clone

命令为:git clone https......,或者使用ssh秘钥,使用ssh秘钥前提是要先在远程仓库增加public key。

git clone之后,它会把远程仓库的整个项目克隆(或者说复制)到当前文件夹,但当前文件夹(test git)仍未初始化,我们点进去复制下来的JNU-Cplusplus-labs,发现他里面已经有.git文件夹了,也就是克隆下来的项目文件夹就是一个git仓库。

我们点进去克隆下来的项目文件夹JNU-Cplusplus-labs,在这里重新打开git bash,输入git config --list查看配置信息,发现他已经连上了远端仓库,可以进行拉取、上传等操作了。只不过我这里示例使用的是https连接,所以要每次输入账号密码,如果clone时使用的是ssh秘钥,就可以方便很多。

git pull

git pullgit pull origin master就是拉取代码的命令(master为指定远端的分支),每次拉取后,都会更新远端仓库到本地。但是和git clone的区别是,git pull前必须先初始化本地仓库,并且连接远端仓库,还要有操作权限(这个待验证)。

也就是说,我们必须先使用git init,先初始化仓库,然后再使用命令git remote add git@......,连接远端仓库,然后才可以使用git pull命令拉取代码。git push上传代码也一样,要建立本地仓库并且连接远端,这个git push中再介绍详细步骤。

  1. git init,初始化仓库
  2. git remote add git@......,连接远端仓库
  3. git pull,拉取代码

总结git pullgit clone的区别:

  • git clone直接把项目仓库从远端克隆下来了,通俗点说就是在操作的文件夹路径下(实例中的test git),把远端仓库的整个文件夹(JNU-Cplusplus-labs)拷进来了。所以当你要操作远端仓库时,还要点进JNU-Cplusplus-labs 文件夹里再打开git bash
  • git pull 就是拉取代码操作,换句话说,只是把远端仓库的代码更新到本地,所以在此之前要确保有本地仓库(初始化),并且连接了远端。git pullgit push都是同步功能(两个方向不同),所以pull后当前路径test git里的内容是JNU-Cplusplus-labs 里面的东西,理解为:test git 文件夹是一个本地仓库,JNU-Cplusplus-labs 文件夹是一个远端仓库 。真正做项目时最好把本地仓库名改为和远端仓库一样,或者先clone,再进行后续的pullpush,这样就可以省去额外的初始化和连接操作。
  • 不论pull还是clone,都是针对远端的一个分支。默认是master或main分支,其他指定分支需要在命令后面输入对应参数

git push

pushpull操作类似,一个拉取代码,一个上传提交代码,所以前提必须要有一个本地仓库并且和远端建立了连接。在此前提下,步骤如下:

  1. git add filename.txt,先把文件添加到暂存区,使用git status可以查看暂存区内容
  2. git commit -m “message”,message为本次提交的注释如:“增加xxx功能”。
  3. git push为远端的分支。

此时查看远端就会发现代码已经更新。关于暂存区的知识,可参考这篇文章

git push 的命令格式一般是
git push <远程主机名> <本地分支名>:<远程分支名>
例如:git push origin master:master
当然,一般情况下,我们都不用写后面的,直接 git push 即可。

建议,push之前先pull一下,防止其他成员更新了远端仓库,自己直接push会把那些内容删除。原因是本地仓库没有,push会把远端与本地同步。(这篇文章已验证)

对Git连接GitHub过程的理解

场景:

  1. 我们老师要求作业提交到GitHub上,于是问我们每个人要GitHub账号,添加到项目的团队成员。
  2. 我之前创建的GitHub账号(12345@qq.com)因为不活跃被封了,于是创建了一个新的账号(54321@163.com)
  3. 按照网上所述配置好git,但是由于误操作,配置时把git的user.email设为了之前的12345@qq.com。并且生产SSH秘钥时后面的邮箱也是这个,即命令:ssh-keygen -t rsa -C "12345@qq.com",然后添加到新的GitHub账号(54321@163.com) SSH keys中。
  4. 完成作业后提交,发现提交成功,操作人是12345@qq.com。疑惑,老师并没有添加我这个(12345@qq.com)GitHub账号,为什么我有权限可以提交成功?

经查阅,总结对这个过程中涉及到的邮箱的理解。原文章:对Git用户名与Github账户关系的理解

  • ssh-keygen -t rsa -C "12345@qq.com"

    此处的邮箱最简单,因为他没有任何意义。这只是生成的SSH秘钥的一个标签,SSH秘钥是你的电脑生成的,所以只与电脑相关联(SSH协议只认机器)。因此建议把这里的邮箱改为电脑的标签,以便以后容易记起来该秘钥是对应那台机器。

    为什么要把本机生成的SSH秘钥添加到GitHub上呢?因为添加后,当在本地电脑使用git操作GitHub远程仓库时,由于GitHub账号连接了本地电脑的秘钥,所有会被认为使用对应GitHub账号进行了操作。

  • GitHub账号 (54321@163.com)

    接着上面,如我在本地 push 代码到远程仓库,由于本地电脑与54321@163.com账号关联了(使用SSH通信),所以远程仓库认为是该GitHub账号进行了提交代码操作。同样的,如果我这个GitHub账号没有权限,那么在本地git就不能访问该远程仓库。

    我理解连接远程仓库时的链接(git@github.com:......),只是帮我们本地仓库指定了一个远程的对象,具体访问操作还是看关联的GitHub账号,若GitHub账号没有权限访问操作,则本地也没有权限,只是指定了对象而已。

  • 本地设置的user.email(12345@qq.com)

    这里的邮箱对push等操作没有实际意义的作用,只是一个自报家门的名称而已。通过该邮箱远程仓库才知道本次操作是谁完成的,也就是说,理论上你可以随便设置(不提倡),但最好设成与GitHub账号一致。原参考文章:对给git配置邮箱和用户名的理解

    1、为什么要配置用户名和邮箱?

    因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址(名字和邮箱都不会进行验证),这样远程仓库才知道哪次提交是由谁完成的。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

    2、配置的用户名和邮箱对push代码到远程仓库有什么影响?

    首先,配置的用户名和邮箱对push代码到远程仓库时的身份验证没有作用,即不用他们进行身份验证;他们仅仅会出现在远程仓库的commits里。

    其次,按正常操作来说,你应该配置你的真实用户名和邮箱,这样一来在远程仓库的commits里可以看到哪个操作是你所为。

    最后,这个用户名和邮箱是可以随便配置的(不提倡),如果你配置的邮箱是github里真实存在的邮箱,则commits里显示的是这个邮箱对应的账号;如果配置的邮箱是一个在github里不存在的邮箱,则commits里显示的是你配置的用户名。

通过以上理解,自然不难明白为什么我可以提交作业,并且提交人显示之前被封了的账号。

可以交作业是因为我本地电脑使用SSH协议与当前GitHub账号(54321@163.com)关联,而老师给了我这个账号权限,因此我能够在本地进行相关的远程仓库操作。

由于git配置邮箱时误使用了之前被封的那个账号(12345@qq.com),所以提交人显示12345@qq.com。

git的分支操作

网上教程挺多,以后有空或者使用到了再更。