Git的原理与使用 -- 远程操作
目录
- 理解分布式版本管理系统
- 新建远程仓库
- 克隆远程仓库
- 向远程仓库推送
- 拉取远程仓库
- 忽略特殊文件
- 配置命令别名
- 标签管理
- 推送标签
理解分布式版本管理系统
我们知道了什么是版本管理系统,那什么是分布式版本管理系统呢?
版本管理系统:一个帮你“记录文件每次改动、并能随时切换到任何历史版本”的时光机器和协作工具。它的核心是 “集中管理” ,所有人都围绕着一个中央服务器工作。
分布式版本管理系统:像一个开源项目。每个参与者(你、我、他)都克隆了一份完整的源代码和历史。我们可以在自己的副本上任意修改,最后再把大家的成果合并到一起。

新建远程仓库
创建远程项目仓库:

填写基本信息:

初始化仓库
- 请选择语言:是选择你仓库里面保存的是什么语言的文件,主要目的就是识别您仓库里保存的是什么编程语言的文件。
- 添加.
gitignore:选择一个文件,这个文件里面保存的是你上传远程仓库时,要忽视的文件名或者是带改后缀民的文件,有时的需要上传的文件很对,但是里面有一些文件你不需要上传,手动设置比较麻烦,所以可以使用.gitignore文件来忽视你不想上传的文件。- 添加开源许可证:开源许可证就是一种“使用说明书”或“法律合同”,它附在你的源代码上,明确地告诉别人:他们能用你的代码做什么?他们需要遵守什么条件?他们不需要遵守什么条件?在保护你作为原作者权益的基础上,授予他人使用你代码的自由和权利。
设置模板
Readme文件:选择Readme模板文件,帮助别人更好的认识你的仓库,相当于是你的仓库的介绍和使用说明,也就是一个项目的“自我介绍”和“使用说明书”。
Issue模板文件:在你的仓库里面如果有人发现了你的项目的文件的问题或者错误,可以向你提交Issue文件,而Issue模板文件会提供这样一个模板。
Pull Request模板文件:一般开发人员不会自己将当前分支合并到master分支上,当你用其他分支向master主分支合并时,为了安全考虑,你需要创建一个合并申请单给管理员审核,不用自己直接进行合并。
仓库的管理人员一般有这四类
创建成功

我们可以对远程仓库进行⼀个基本的设置:开源or私有

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

克隆远程仓库
克隆远程仓库的方式常见的有两种HTTPS和SSH ,SSH 协议和 HTTPS 协议是 Git 最常使用的两种数据传输协议。SSH 协议使用了公钥加密和公钥登陆机制,体现了其实用性和安全性,使⽤此协议需要将我们的公钥放上服务器,由 Git 服务器进行管理。使用 HTTPS 方式时,没有要求,可以直接克隆下来。


第一种方式:HTTPS克隆,直接复制

在本地仓库使用git clone命令进行克隆,克隆成功后本地会有一个gitcode仓库
[zx@aliyun myGit]$ git clone https://gitee.com/moeqwer/gitcode.git
Cloning into 'gitcode'...
Username for 'https://gitee.com': 15775461363 --用户名可以是你的电话
Password for 'https://15775461363@gitee.com':
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (4/4), 1.80 KiB | 1.80 MiB/s, done. --克隆成功
[zx@aliyun myGit]$ ll
total 0
drwxrwxr-x 3 zx zx 55 Oct 30 14:40 gitcode
git config user.name 命令用于设置或查看你在本地 Git 仓库中提交代码时使用的“作者姓名”。把它想象成你在每次提交代码时,在记录本上签下自己的名字。这个名字不会用于登录远程仓库,它的唯一作用是:告诉所有人,这一笔代码是谁提交的。当你在查看项目历史(git log)时,看到的提交者名字就是由 user.name 和 user.email 决定的。
git config user.email 命令用于设置或查看你在本地 Git 仓库中提交代码时使用的“作者邮箱”。核心作用就是为你的代码提交提供“联系方式”。
git config user.email 就是为你本地提交的代码 “留下联系方式”,它和 user.name 一起构成了你的提交者身份,并会随着提交历史被永久记录。
[zx@aliyun gitcode]$ git config user.name 'moeqwer'
[zx@aliyun gitcode]$ git config user.email '2186814725@qq.com'
第二种方式:SSH克隆,直接复制
[zx@aliyun myGit]$ git clone git@gitee.com:moeqwer/gitcode.git
Cloning into 'gitcode'...
The authenticity of host 'gitee.com (180.76.198.77)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'gitee.com,180.76.198.77' (ECDSA) to the list of known hosts.
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository. -- 如果直接克隆会失败,需要在远程添加公钥Please make sure you have the correct access rights
and the repository exists.
使用 SSH 方式克隆仓库,由于我们没有添加公钥到远端库中,服务器拒绝了我们的 clone 链接。需要我们设置⼀下:
第⼀步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和 id_rsa.pub 这两个文件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建SSH Key:
[zx@aliyun ~]$ tree .ssh
.ssh
└── known_hosts -- 我这里没有,需要自己创建0 directories, 1 file
使用这个命令可以创建SSH密钥。
ssh-keygen -t rsa -b 4096 -C "你的邮箱地址@example.com"
一路enter就可以了。
[zx@aliyun ~]$ ssh-keygen -t rsa -b 4096 -C "2186814725@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/zx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
......
[zx@aliyun ~]$ tree .ssh
.ssh
├── id_rsa
├── id_rsa.pub
└── known_hosts
0 directories, 3 files
顺利的话,可以在用户主目录里找到 .ssh 目录,里面有 id_rsa 和 id_rsa.pub 两个文件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放心地告诉任何人。
第二步:添加自己的公钥到远端仓库。复制 id_rsa.pub里面的内容到远程仓库中,在设置中添加公钥。


公钥添加成功

第三步:在本地克隆远程仓库,克隆好仓库之后需要设置你的user.name和user.email,同HTTPS一样,这里就不再赘述了。
[zx@aliyun myGit]$ git clone git@gitee.com:moeqwer/gitcode.git

[zx@aliyun myGit]$ ll
total 0
drwxrwxr-x 3 zx zx 55 Oct 31 16:30 gitcode
[zx@aliyun myGit]$ tree gitcode/
gitcode/
├── README.en.md
└── README.md
0 directories, 2 files
当我们从远程仓库克隆后,实际上 Git 会自动把本地的 master 分支和远程的 master 分支对应起来,并且,远程仓库的默认名称是 origin 。此时可以使用git remote -v命令查看远程仓库中的详细信息。
[zx@aliyun gitcode]$ git remote -v
origin git@gitee.com:moeqwer/gitcode.git (fetch)
origin git@gitee.com:moeqwer/gitcode.git (push)
这表示:
有一个叫 origin 的远程仓库,因此origin 就是仓库名称
它的地址是 git@gitee.com:moeqwer/gitcode.git
用于拉取(fetch)和推送(push)代码
注意:如果有多个人协作开发,GitHub/Gitee 允许添加多个公钥,只要把每个人的电脑上的
Key 都添加到 GitHub/Gitee,就可以在每台电脑上往 GitHub/Gitee 上提交推送了。
向远程仓库推送
推送是分支与分支之间的推送,本地分支推送到远程分支需要对两个分支建立连接,克隆仓库是会自动把本地分支master与远程仓库中的master分支建立连接。
git push的使用语法:
git push [远程仓库名] [本地分支名]:[远程仓库的分支名]git push [远程仓库名] [本地分支名] --如果本地分支名和远程仓库的分支名相同,可以省略只写本地分支名
[zx@aliyun gitcode]$ git push origin master:master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 307 bytes | 307.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 3341578c
To gitee.com:moeqwer/gitcode.gita23ff72..03e17e5 master -> master
查看远端,推送成功

推送成功!这里由于我们使用的是 SSH 协议,是不用每⼀次推送都输入密码的,方便了我们的推送操作。如果你使用的是 HTTPS 协议,有个麻烦地方就是每次推送都必须输入口令。
拉取远程仓库
我们修改当前的远程仓库中file.txt文件的内容
修改前:

修改后:

远程仓库中的file.txt文件已经被修改了,但是本地仓库中file.txt的内容并没有被修改。
[zx@aliyun gitcode]$ cat file.txt
hello file
此时远程仓库中的内容是比本地仓库中的内容更新,所以我们需要在本地仓库拉取远程仓库,与本地仓库进行合并。
git pull命令语法:
git pull [远程仓库名] [远程仓库的分支名]:[本地分支]git pull [远程仓库名] [远程仓库的分支名] -- 如果远程仓库的分支名和本地分支相同,可以省略本地分支名称
[zx@aliyun gitcode]$ git pull origin master:master
.......
[zx@aliyun gitcode]$ cat file.txt
hello file
xxx coding ...
我们发现,拉取成功了!
忽略特殊文件
在创建初始化仓库时,会让我们选择.gitignore模板文件,这个文件里面的内容,就是我们想要忽略的文件名。你在初始化仓库时可以选择你想要的模板文件,后面也可以自己添加你想要忽略的文件名到该文件中,git版本管理器会自动忽略掉该文件,不会推送到远端。

如果在创建时没有选择,可以在本地仓库创建并推送到远端。
[zx@aliyun gitcode]$ vim .gitignore --创建.gitignore文件
[zx@aliyun gitcode]$ cat .gitignore
a.so --忽略a.so文件
*.ini --忽略以.ini结尾的文件
可以看到当我们创建了a.so文件时,git并没有帮我们追踪该文件,git status并没有显示让我们commit a.so文件,只显示了.gitignore文件。
[zx@aliyun gitcode]$ touch a.so
[zx@aliyun gitcode]$ git add .
[zx@aliyun gitcode]$ git status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: .gitignore
如果我们就想将a.so文件推送到远端,可以使用git add -f a.so,将a.so文件强制推送到远端。
[zx@aliyun gitcode]$ git add -f a.so
[zx@aliyun gitcode]$ git status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: .gitignorenew file: a.so
如果所有的以.ini结尾的文件我都不想推送到远端,就想把abc.ini文件推送到远端,可以使用强制推送,也可以指定文件排除,在 .gitignore 规则外的写法就是 ! +文件名,所以,只需把例外文件添加进去即可。
[zx@aliyun gitcode]$ vim .gitignore
[zx@aliyun gitcode]$ cat .gitignore
a.so
*.ini
!abc.ini
[zx@aliyun gitcode]$ touch abc.ini
[zx@aliyun gitcode]$ git add .
[zx@aliyun gitcode]$ git status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: .gitignorenew file: a.sonew file: abc.ini -- abc.ini被git管理了,可以推送到远端了
如果遇到某一个文件,你想添加到仓库中,但是并没有被添加进去,我们可以使用git check-ignore -v 文件名来查看忽略原因。
[zx@aliyun gitcode]$ touch b.ini
[zx@aliyun gitcode]$ git add .
[zx@aliyun gitcode]$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: .gitignorenew file: a.sonew file: abc.ini
[zx@aliyun gitcode]$ git check-ignore -v b.ini --查看忽略原因
.gitignore:2:*.ini b.ini
[zx@aliyun gitcode]$ cat .gitignore
a.so
*.ini -- 以.ini结尾的文件名都会被忽略
!abc.ini
配置命令别名
在我们使用Git 期间,有些命令敲的时候着实让人头疼(太长了。。),幸运的是,git支持对命令进行简化!
举个例子,将 git status 简化为 git st ,对应的命令为:
[zx@aliyun gitcode]$ git config --global alias.st 'status'
[zx@aliyun gitcode]$ git st
On branch master
Your branch is up to date with 'origin/master'.nothing to commit, working tree clean
--global是一个全局配置,针对的是本主机上所有的仓库的,如果不加上–global选选项的话,就只针对本仓库有效。
标签管理
标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项目发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样的标签来标识里程碑的意义。这有什么用呢?相较于难以记住的 commit id , tag 很好的解决这个问题,因为 tag ⼀定要给⼀个让人容易记住,且有意义的名字。当我们需要回退到某个重要版本时,直接使用标签就能很快定位到。所以说,打标签就是该commit id打的,帮助你更好的认识它,分辨它。
打标签使用的语法是:
git tag [标签] [commit id]
在Git中打标签非常简单,在打标签之前,需要切换到需要打标签的分支上。
[zx@aliyun gitcode]$ git checkout master
[zx@aliyun gitcode]$ git tag v1.0 -- 没有写commit id,默认是给最新的一次commit id打的标签
[zx@aliyun gitcode]$ git log --pretty=oneline --abbrev-commit
a9f95aa (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) my file.txt --最新的一次commit id
50ac551 mt
eba0f93 update file.txt.
[zx@aliyun gitcode]$ git tag v0.9 50ac551 --该commit id50ac551 打标签
[zx@aliyun gitcode]$ git log --pretty=oneline --abbrev-commit
a9f95aa (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) my file.txt
50ac551 (tag: v0.9) mt 这里可以查看到标签
eba0f93 update file.txt.
git tag命令可以查看标签
[zx@aliyun gitcode]$ git tag
v0.9
v1.0
tree .git可以查看到tag标签

Git 还提供可以创建带有说明的标签,用-a指定标签名,-m指定说明文字,格式为:
git tag -a [name] -m "XXX" [commit_id]
[zx@aliyun gitcode]$ git tag -a v0.8 -m'my file.txt' eba0f93 --需要携带-a选项和说明信息
[zx@aliyun gitcode]$ git log --pretty=oneline --abbrev-commit
a9f95aa (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) my file.txt
50ac551 (tag: v0.9) mt
eba0f93 (tag: v0.8) update file.txt.
03e17e5 file.txt
a23ff72 Initial commit
使用git show [标签名]可以查看该标签的详细信息。
[zx@aliyun gitcode]$ git show v0.8
tag v0.8
Tagger: 15775461363 <2186814725@qq.com>
Date: Fri Oct 31 18:04:45 2025 +0800my file.txtcommit eba0f93ea07572927346150fddbe556bdb502462 (tag: v0.8)
Author: moeqwer <2186814725@qq.com>
Date: Fri Oct 31 09:05:56 2025 +0000update file.txt.Signed-off-by: moeqwer <2186814725@qq.com>diff --git a/file.txt b/file.txt
index f7ca42b..b68ca75 100644
--- a/file.txt
+++ b/file.txt
@@ -1 +1,2 @@hello file
+xxx coding ...
\ No newline at end of file
如果你发现标签打错了,你也可以删除标签。
[zx@aliyun gitcode]$ git tag -d v0.8
Deleted tag 'v0.8' (was 069475c)
[zx@aliyun gitcode]$ git tag --标签出现的顺序不是按照时间顺序,而是按照字母顺序出现的
v0.9
v1.0
推送标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令 git push origin [tagname]
[zx@aliyun gitcode]$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag fb4f5495
To gitee.com:moeqwer/gitcode.git* [new tag] v1.0 -> v1.0


使用git push origin --tag命令,可以将所有的标签推送到远端。
[zx@aliyun gitcode]$ git tag
v0.9
v1.0
[zx@aliyun gitcode]$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 56436290
To gitee.com:moeqwer/gitcode.git* [new tag] v0.9 -> v0.9

当然,可以在本地删除远端标签。
[zx@aliyun gitcode]$ git tag -d v0.9 --删除本地标签
Deleted tag 'v0.9' (was 50ac551)
[zx@aliyun gitcode]$ git push origin :v0.9 --删除远端标签
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 6342faab
To gitee.com:moeqwer/gitcode.git- [deleted] v0.9
[zx@aliyun gitcode]$ git push origin :refs/tags/v1.0 --删除远端标签
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 6846609d
To gitee.com:moeqwer/gitcode.git- [deleted] v1.0

远端删除成功!




