Git 远程操作

理解分布式版本控制系统

本地操作的本质

我们目前讨论的所有概念------工作区、暂存区、版本库等------都发生在本地计算机上。Git作为分布式版本控制系统,意味着:

  • 每台参与开发的计算机都拥有完整的版本库

  • 无需网络连接即可进行本地版本管理

  • 每个开发者都可以独立工作,然后交换修改




分布式协作原理

假设你和同事都在修改文件A:

  1. 你在本地修改文件A并提交

  2. 同事在他的本地修改文件A并提交

  3. 双方只需将各自的修改推送给对方,即可看到对方的修改




分布式系统的优势

  1. 高安全性:每个计算机都有完整版本库,一台机器故障不影响其他

  2. 离线工作:无需网络即可进行版本管理

  3. 灵活协作:支持多种协作方式




中央服务器的角色

实际开发中,通常会设置一个中央服务器(如GitHub、Gitee):

  • 主要作用是方便开发者交换修改

  • 即使没有服务器,开发者之间仍可直接交换修改

  • 服务器可防止本地故障导致数据丢失





远程仓库概念

Git作为分布式系统,同一个仓库可分布在多台机器上

基本分布原理

  1. 最初只有一台机器拥有原始版本库

  2. 其他机器可"克隆"这个版本库

  3. 每台机器的版本库都是完整的,没有主次之分




实际应用模式

  1. 一台服务器作为中央仓库,24小时运行

  2. 每个开发者从服务器克隆仓库到本地

  3. 开发者将本地提交推送到服务器,也从服务器拉取他人提交




远程仓库服务

  • GitHub:全球最大的Git仓库托管服务

  • Gitee:国内流行的Git仓库托管服务(码云)

  • 自建Git服务器:适合企业内部使用





新建远程仓库

下面以 Gitee 为例,演示如何创建远程仓库。

创建步骤

1、访问Gitee并新建仓库



2、填写仓库信息

必填项说明:
  • 仓库名称:建议使用有意义的英文名(如:my-project)

  • 路径:自动生成,通常与仓库名一致

  • 仓库介绍:简要描述项目功能(可选但推荐填写)

  • 仓库公开性:选择"公开"(所有人可见)或"私有"(仅成员可见)

注意仓库名一定要有意义,但这里是测试就随意命名了



3、仓库初始化配置

初始化选项
  • 设置语言:选择项目主要使用的编程语言,帮助平台进行代码统计

  • .gitignore文件:选择项目类型,自动生成忽略规则模板

  • 开源许可证:选择适合项目的开源协议(如MIT、GPL等)


模板文件设置
  • ReadMe模板:自动生成项目说明文档框架

  • Issue模板:设置问题反馈的标准格式

  • Pull Request模板:设置分支合并请求的标准格式


选择分支模型
  • 单分支模型:适合简单项目

  • Git Flow模型:经典的分支管理策略

  • 其他模型:根据项目特点选择



5、创建成功



6、设置仓库可见性

新创建的仓库有且只有一个默认的master分支





克隆远程仓库

将远程仓库克隆到本地使用git clone命令。

获取仓库链接


注意: git clone命令要在非仓库目录下执行




克隆协议对比

HTTPS协议

Shell 复制代码
$ git clone https://gitee.com/null_mian/test.git
Cloning into 'test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (7/7), done.

$ ls test/
README.en.md  README.md

特点

  • 无需额外配置,可直接克隆

  • 每次操作可能需要输入账号密码

  • 适合临时访问



SSH协议

Shell 复制代码
# 由于我们没有添加本地库的公钥到远端库中,服务器拒绝了我们的clone链接
$ git clone git@gitee.com:null_mian/test.git
Cloning into 'test'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

特点

  • 需要配置SSH密钥

  • 一次配置,长期免密使用

  • 安全性更高


SSH密钥配置

1、检查现有密钥

Shell 复制代码
# 检查~/.ssh目录
$ ls ~/.ssh/
# 如果已有id_rsa和id_rsa.pub文件,可跳过生成步骤

2、生成SSH密钥

Shell 复制代码
# 注意要输入自己的邮箱,然后一路回车,使用默认值即可
$ ssh-keygen -t rsa -C "1234567890@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/HY/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/HY/.ssh/id_rsa.
Your public key has been saved in /home/HY/.ssh/id_rsa.pub.
···

注意:这里的邮箱是你本地Git配置的的邮箱


3、查看公钥

Shell 复制代码
$ ls 
id_rsa  id_rsa.pub  known_hosts

$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDMiJrB9GOMPVwYAn0V54faLqz7T/aHjFhOFPvSHhE5acyJLFzLlFgMrdvhbWHrleUupaexZMl0/QFr1B13sted0XkK23NgcwbFlD6DH+cuw9HppwhwjPAjn+U0MgQrEAbmalqz3uVmCVNz1pSDYUDw6Z99e3+wQ1TuulZ/pOI1F9HeWHdKdjPGMqQVVDJSRIWv/iv63TGCVJ9M+WR6tep0CTGPigX3fBLxE7TUUj0GKQGDg4D+BQJ0S6SxTZb9DZmRD5UmVoRq2/kGwlPcmcuibHYP6Ck5V0+cPqJGTbGrBt4iOUeTcwrpYJeEWn+J2odTPCG+il/tj8r8IdEXCDpd 1234567890@qq.com

补充: id_rsa是私钥,不能泄露出去,id_ras.pub是公钥,可以放心地告诉任何人


4、添加公钥到 Gitee

补充:点击确认后,需要对你进行认证,输入你的账号密码即可


5、使用SSH克隆

Shell 复制代码
$ git clone git@gitee.com:null_mian/test.git
Cloning into 'test'...
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (7/7), done.

$ ls test/
README.en.md  README.md

补充:多人协作的话,将他们的密钥也添加进来即可




查看远程仓库信息

克隆后,Git 会自动将本地仓库与远程仓库关联

Shell 复制代码
# 查看远程仓库名称
$ git remote
origin

# 查看详细信息
$ git remote -v
origin	git@gitee.com:null_mian/test.git (fetch)
origin	git@gitee.com:null_mian/test.git (push)

说明

  • origin是远程仓库的默认名称

  • fetch表示拉取权限

  • push表示推送权限

  • 如果没有推送权限,则看不到push地址





向远程仓库推送

当本地仓库有更新时,需要将更新push到远程仓库

本地修改并提交

Shell 复制代码
# 查看当前文件
$ ls -l
total 8
-rw-rw-r-- 1 HY HY 818 Dec 28 12:44 README.en.md
-rw-rw-r-- 1 HY HY 907 Dec 28 12:44 README.md

# 创建新文件并提交
$ vim file.txt
$ git add .
$ git commit -m "create file.txt"
[master 8c04ef2] create file.txt
 1 file changed, 1 insertion(+), 2 deletions(-)

注意 :本地namee-mail的配置要和远程仓库的一致,否则会出错




推送本地提交

使用git push命令将本地分支推送到远程仓库:

Shell 复制代码
# 基本语法
git push <远程主机名> <本地分支名>:<远程分支名>

# 如果本地分支名与远程分支名相同,可简写
git push <远程主机名> <本地分支名>


# 实际推送
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag 6f44998f
To git@gitee.com:null_mian/test.git
   5e9eeb7..8c04ef2  master -> master

注意git push推送的是分支,而不是整个仓库





拉取远程仓库

当远程仓库有更新时,需要将更新pull到本地仓库

远程仓库修改

注意 :实际开发中不要直接在远程仓库修改文件,此处仅为演示




拉取远程更新

使用git pull命令拉取远程更新并合并到本地:

Shell 复制代码
# 基本语法
git pull <远程主机名> <本地分支名>:<远程分支名>

# 如果本地分支名与远程分支名相同,可简写
git pull <远程主机名> <本地分支名>


# 实际拉取
$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From gitee.com:null_mian/test
 * branch            master     -> FETCH_HEAD
Updating 8c04ef2..7176cef
Fast-forward
 file.txt | 1 +
 1 file changed, 1 insertion(+)
 
# 查看更新内容
$ cat file.txt
hello git
第一次修改内容




Git配置优化

忽略特殊文件

某些文件不应提交到仓库(如配置文件、编译文件等),可通过.gitignore文件进行管理。

创建.gitignore文件

方式一:远程仓库初始化时创建

创建仓库时勾选生成.gitignore模板选项:


方式二:手动创建

如果初始化时没有创建,可以手动在工作区根目录创建:

Shell 复制代码
# 创建.gitignore文件
$ vim .gitignore

# 添加并提交
$ git add .
$ git commit -m "add .gitignore"
[master eb21de3] add .gitignore
 1 file changed, 2 insertions(+)
 create mode 100644 .gitignore
 
 # 推送到远程仓库
$ git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Powered by GITEE.COM [1.1.23]
remote: Set trace flag 594585a2
To git@gitee.com:null_mian/test.git
   7176cef..eb21de3  master -> master


忽略规则示例

Plain 复制代码
# 1. 忽略特定文件
[filename]

# 2. 忽略一类文件(使用通配符)
*.ini        # 忽略所有.ini文件
*.so         # 忽略所有.so文件
*.log        # 忽略所有日志文件

# 3. 忽略目录
temp/        # 忽略temp目录
build/       # 忽略build目录

# 4. 排除特定文件(在忽略规则中例外)
!demo.so     # 不忽略demo.so文件

# 5. 复杂模式
.*           # 忽略所有以'.'开头的隐藏文件
!.gitignore  # 但不忽略.gitignore本身


验证忽略结果

Shell 复制代码
# 创建应被忽略的文件
$ touch a.so b.ini

# 检查Git状态
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working directory clean

# 如果.gitignore配置正确,这些文件被追踪


特殊情况处理

1、强制添加被忽略的文件

有时需要临时添加被忽略的文件,可以用-f选项强制添加

Shell 复制代码
# 强制添加被忽略的文件
git add -f important.so

# 查看文件状态
git status

建议 :尽量别使用-f选项强制添加,我们可以添加一条例外规则来达到同等效果


2、检查忽略规则

当文件被意外忽略时,可以用git check-ignore命令检查是哪个规则导致的

Shell 复制代码
# 检查文件被哪个规则忽略
$git check-ignore -v a.so
.gitignore:3:*.so	a.so

# Git告诉我们,.gitignore的第3行规则忽略了该文件,
# 于是我们就可以知道应该修订哪个规则

3、排除规则

当使用通配符*忽略一类文件,但需要排除其中个别文件时

Shell 复制代码
# 错误示例:排除规则可能会失效
.*           # 忽略所有以.开头的文件
!.gitignore  # 试图不忽略.gitignore,但可能失效

# 正确示例:明确指定排除
.*                   # 忽略所有以.开头的文件
!.*/                 # 但不要忽略目录
!.gitignore          # 不忽略.gitignore文件



给命令重命名

Git支持为常用命令创建别名,提高效率。

创建别名

Shell 复制代码
# 基本语法
git config --global alias.<别名> '<原始命令>'

# 示例:为复杂日志命令创建别名
$git config --global alias.lgpa 'log --graph --pretty=oneline --abbrev-commit'

补充

  • --global:全局生效,所有仓库都可用

  • 不加该参数:仅当前仓库生效



使用别名

Shell 复制代码
$ git config --global alias.lgpa 'log --graph --pretty=oneline --abbrev-commit'

$ git lgpa
*   aa31f2e merge ReadMe
|\  
| * 19895ee modify ReadMe for dev1
* | df5d186 modify ReadMe for master
|/  
* 9663d75 insert(+) 1 in ReadMe for dev branch

建议:初学者建议先熟悉完整命令,熟练后再使用别名

相关推荐
cen__y4 分钟前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
xian_wwq30 分钟前
【学习笔记】AGC协调控制系统概述
笔记·学习
weixin_537217061 小时前
答辩ppt模板资源合集
经验分享
x_yeyue1 小时前
三角形数
笔记·算法·数论·组合数学
憧憬成为java架构高手的小白2 小时前
docker学习笔记(基于b站多个视频学习)【未完结】
笔记·学习
RainCity3 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
明天再做行么3 小时前
答辩ppt模板
经验分享
bukeyiwanshui3 小时前
20260518 Swift实验
git·swift
qziovv3 小时前
Git 回退场景
大数据·git·elasticsearch
東隅已逝,桑榆非晚3 小时前
字符函数和字符串函数
c语言·笔记