Git 远程操作:克隆、推送、拉取与冲突解决

文章目录

远程操作

理解分布式版本控制系统

通常所说的所有内容(工作区,暂存区,版本库等等)都是在本地的。 Git本质是分布式版本控制系统可以简单理解为每个人电脑上都有一个完整的版本库,多个人通过把各自的修改推送给对方,看到对方的修改来完成协作。

在实际使用分布式版本控制系统的时候,通常有一台中央服务器来方便"交换"修改,这样就不怕本地出现故障了。

远程仓库

由于GitHub访问速度较慢,下面采用Gitee来演示远程操作:

新建远程仓库

操作步骤为:进入码云,点击"新建仓库",填写基本信息(仓库名称、路径、归属、仓库介绍),选择开源/私有/企业内部开源,可选择初始化仓库(设置语言、gitignore、开源许可证)、设置模板(添加Readme、Issue、Pull Request模板文件)、选择分支模型,最后点击"创建"。

创建成功后,可对远程仓库进行基本设置(选择开源或私有),需遵守仓库公开须知,如承诺内容不违反法律法规、不侵犯版权等,也可选择合适的开源许可证。

刚创建的仓库有且只有一个默认的master分支,之前在本地学习过的分支也会在远程仓库中被管理。

示例如下:(这里先选择最简单的master分支模型,语言设置为C++)

创建完成第一个板块保存代码:


第二个板块可以交流业务,修复bug,提出问题等等:

第三个板块用来控制合并请求,将分支随便合并是极其不稳定的行为,合并时需要生成和并请求,由管理员同意后才可以进行合并:

关于.gitignore的配置

配置Git来忽略特殊文件,可以在 Git 工作区的根目录下创建一个特殊的.gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件了。gitee 在创建仓库时就可以生成,为了方便演示,手动删除gitee自动生成的,手动创建一个.gitignore文件,test.so文件:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.so

no changes added to commit (use "git add" and/or "git commit -a")

查看仓库状态时,test.so仍然出现了,虽然是untracked状态,此时在.gitignore添加内容:

bash 复制代码
# 省略选择模本的内容
...
# My configurations:
*.so

再次查看,发现没有test.so的踪迹了,证明过滤功能有效。

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore

no changes added to commit (use "git add" and/or "git commit -a")

如果想要强制添加被过滤的文件,使用git add -f [filename]命令,又或者可以在.gitignore中添加!文件名,那么test.so又可以被追踪了:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ cat .gitignore
*.so

!test.so
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   .gitignore

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.so

no changes added to commit (use "git add" and/or "git commit -a")

如果不知道该文件是否被过滤,使用git check-ignore -v 文件名查看过滤信息:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git check-ignore -v test.so
.gitignore:1:*.so       test.so
#这说明test.so文件受到*.so的过滤影响

关于命令的配置

Git支持对命令进行简化。配置别名时,--global参数是全局参数,意味着这些命令在这台电脑的所有Git仓库下都有用;如果不加,仅针对当前仓库起作用

bash 复制代码
语法:git config [--global] alias.简化命令 '原命令'

示例如下:

tips:使用git log --pretty=oneline --abbrev-commit可以查看历史记录

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git config --global alias.lpa 'log --pretty=oneline --abbrev-commit'
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ lpa
Command 'lpa' not found, but there are 26 similar ones.
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git lpa
5395672 (HEAD -> master, origin/master, origin/HEAD) 。gitignorep配置
499648c update file.txt. 模拟其他主机推送了代码,导致本地仓库落后于远程仓库的情景
9bf6683 test new file
9ba8240 Initial commit

克隆远程仓库

克隆/下载远端仓库到本地,需要使用git clone命令,后面跟上远端仓库的链接,远端仓库的链接可从仓库的"克隆/下载"选项中获取。

SSH协议和HTTPS协议是Git最常使用的两种数据传输协议。使用HTTPS方式时,没有要求,可以直接克隆下来。

使用HTTPS方式:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~$ git clone https://gitee.com/dai-renwen/remote_gitcode.git
Cloning into 'remote_gitcode'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (9/9), 14.24 KiB | 7.12 MiB/s, done.

进入仓库后使用git remote查看远程仓库信息:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git remote
origin
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git remote -v
origin	https://gitee.com/dai-renwen/remote_gitcode.git (fetch)
origin	https://gitee.com/dai-renwen/remote_gitcode.git (push)
  1. git remote 输出 origin

    表示当前本地仓库关联了一个名为 origin 的远程仓库。
    origin 是 Git 对"默认远程仓库"的约定名称(通常是你克隆仓库时的原始远程仓库),不是固定的,可以修改,但默认情况下都用这个名字。

  2. git remote -v 输出

    • https://gitee.com/dai-renwen/remote_gitcode.git 是远程仓库的实际地址(这里是 Gitee 上的仓库地址)。
    • (fetch) 表示:从这个远程仓库拉取(获取) 数据到本地时,使用这个地址。
    • (push) 表示:将本地的提交推送到远程仓库时,使用这个地址。

使用SSH方式:

直接像Https那样git clone可以吗?试试就知道了:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~$ git clone git@gitee.com:dai-renwen/remote_gitcode.git
Cloning into 'remote_gitcode'...
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协议使用了公钥加密和公钥登陆机制,体现了其实用性和安全性,使用此协议需要将公钥放上服务器,由Git服务器进行管理使用SSH方式克隆仓库,若未添加公钥到远端库,服务器会拒绝clone链接,需进行如下设置:

  • 第一步:创建SSH Key
    在用户主目录下,查看是否有.ssh目录及该目录下的id_rsaid_rsa.pub文件,若没有,执行以下命令创建(输入自己的邮箱,一路回车使用默认值):
bash 复制代码
#1 生成 RSA 密钥
ssh-keygen -t rsa -C 邮箱
bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~$ ssh-keygen -t rsa -C "3484725023@qq.com" 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/drw1/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/drw1/.ssh/id_rsa
Your public key has been saved in /home/drw1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Kny9jyzF3Ftja3WehJHTGunZpqKndfSTfEVYwQRkRrs 3484725023@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|            o*+oo|
|            o .+ |
|             .= .|
|             *.o |
|       oS.  .EO .|
|   .   o+ . ==+++|
|    o o..  = =+Bo|
|     o.. ooo+. .+|
|       .++=..    |
+----[SHA256]-----+

顺利的话,在用户主目录的.ssh目录下会有id_rsa(私钥,不可泄露)和id_rsa.pub(公钥,可公开)两个文件:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~$ ls ./.ssh
id_rsa  id_rsa.pub  known_hosts
  • 第二步:添加公钥到远端仓库
    操作步骤:进入码云个人主页,点击"设置",选择"SSH公钥"选项,填写公钥标题(随意命名),将id_rsa.pub文件中的公钥内容粘贴到"公钥"输入框,点击"确定",输入账号密码完成认证。


  • 设置完成后,再次使用SSH方式克隆:
bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~$ git clone git@gitee.com:dai-renwen/remote_gitcode.git
Cloning into 'remote_gitcode'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (9/9), 14.24 KiB | 14.24 MiB/s, done.

若有多个人协作开发,GitHub/Gitee允许添加多个公钥,只需将每个人电脑上的Key添加到GitHub/Gitee,即可在每台电脑上往GitHub/Gitee提交推送。

向远程仓库推送

本地克隆成功远程仓库后,可向仓库提交内容,例如新增file.txt文件:

新建文件

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ touch file.txt
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ vim file.txt
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ cat file.txt
this is a new file int the remote-gitcode.

提交文件到本地仓库

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git add file.txt
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git commit -m "test new file"
[master 9bf6683] test new file
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

提交时注意:若之前设置的全局name和e-mail与gitee上的用户名和邮箱不一致,或从未设置过,会报错,需重新配置并确保与gitee一致。

将本地仓库内容推送至远程仓库需使用git push命令,该命令用于将本地的分支版本上传到远程并合并,命令格式如下:

bash 复制代码
git push <远程主机名> <本地分支名>:<远程分支名>

远程主机名本地/远程分支名在特定条件下可以省略:

  1. 远程主机名(可省略)

    默认情况下,Git 仓库的远程主机名通常为 origin(克隆仓库时自动创建的默认远程名)。

    如果你的仓库只有且仅有一个远程主机(几乎所有普通场景都是如此),且远程主机名是 origin,则可以省略远程主机名

  2. 本地分支名和远程分支名(可省略)
    情况1 :本地分支与远程分支同名,且无需指定特殊映射

    如果本地分支名和远程分支名相同 (例如本地 main 对应远程 main),可以省略冒号和远程分支名,直接写成: git push <远程主机名> <分支名>
    情况2 :本地分支已与远程分支建立追踪关系(推荐)

    如果本地分支通过 git push -u <远程主机名> <分支名>git branch --set-upstream-to 设置了上游分支,则可以完全省略分支名 ,直接执行: git push (本地master默认与远程master建立关系)
    情况3 :仅省略本地分支名

    如果只写 :<远程分支名>(省略本地分支名),表示「删除远程分支」(将空的本地分支推送到远程分支,等效于删除)。

最常用的简化形式

  1. 推送当前分支到同名远程分支(默认远程 origin,且已关联):git push

  2. 推送指定分支到同名远程分支(默认远程 origin):git push 分支名

  3. 推送指定分支到不同名远程分支(默认远程 origin):git push 本地分支名:远程分支名

示例如下:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_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 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 6642f3aa
To gitee.com:dai-renwen/remote_gitcode.git
   9ba8240..9bf6683  master -> master

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

拉取远程仓库

现在在Gitee上修改file.txt来模拟其他主机推送了代码,导致本地仓库落后于远程仓库的情景:

为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。Git 提供了git pull命令,该命令用于从远程获取代码并合并本地的版本。格式如下:

bash 复制代码
git pull <远程主机名> <远程分支名>:<本地分支名>

远程主机名分支名 的省略规则与 git push 类似:

  1. 远程主机名(可省略)

    默认远程主机名为 origin(克隆仓库时自动创建)。若仓库只有一个远程主机(且名为 origin),则可省略远程主机名

  2. 分支名(可省略的情况)
    情况1 :省略本地分支名(默认合并到当前检出分支)

    若省略 <本地分支名>(即只写 <远程分支名>),Git 会将拉取的远程分支直接合并到当前正在检出的本地分支 (通过 git status 可查看当前分支)。
    情况2 :本地与远程分支同名且有追踪关系(可省略冒号及右侧本地分支名)

    若本地分支(如 main)与远程分支(如 origin/main同名 ,且已通过 git branch --set-upstream-togit push -u 建立追踪关系(即「上游分支」),则可省略冒号和本地分支名,直接写:git pull <远程主机名> <分支名>
    情况3 :已建立追踪关系(可完全省略分支名和主机名)

    若当前本地分支已与某远程分支建立追踪关系 (本地master默认与远程master建立关系) ,则可完全省略所有参数 ,直接执行:git pull

最常用的简化形式

  1. 拉取远程分支并合并到当前分支(默认远程 origin):git pull 远程分支名(例如 git pull origin dev

  2. 已建立追踪关系:git pull

示例如下:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git pull origin master:master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), 1.12 KiB | 1.12 MiB/s, done.
From gitee.com:dai-renwen/remote_gitcode
   9bf6683..499648c  master     -> master
   9bf6683..499648c  master     -> origin/master
warning: fetch updated the current branch head.
fast-forwarding your working tree from
commit 9bf66838b79336d62ae98386d6544558a790fcbd.
Already up to date.

drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ cat file.txt
this is a new file int the remote-gitcode.
Here,we simulate the newly added code pushed by other hosts.

标签管理

标签(tag)可简单理解为对某次commit的标识,相当于起别名,方便快速定位某一次重要提交!

创建标签

切换到需要打标签的分支,使用 git tag [name] 打新标签,默认给当前最新commit打标签,并使用git tag查看所有标签。示例如下:

默认标签:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag v1.0
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag
v1.0

指定标签:

bash 复制代码
# 查看历史记录
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git log --pretty=oneline --abbrev-commit
5395672 (HEAD -> master, tag: v1.0, origin/master, origin/HEAD) 。gitignorep配置
499648c update file.txt. 模拟其他主机推送了代码,导致本地仓库落后于远程仓库的情景
9bf6683 test new file
9ba8240 Initial commit

# 打标签
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag v0.9 499648c
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag
v0.9
v1.0

指定说明标签:

bash 复制代码
git tag -a [name] -m "XXX" [commit_id]
bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag -a v0.8 -m "9bf6683 test new file" 9bf6683 
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag
v0.8
v0.9
v1.0

查看标签信息

bash 复制代码
git show [tagname] #查看标签信息

示例如下:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git show v0.8
tag v0.8
Tagger: dai-renwen <3484725023@qq.com>
Date:   Mon Oct 27 15:07:01 2025 +0800 #可以查看创建时间

9bf6683 test new file #标签说明

commit 9bf66838b79336d62ae98386d6544558a790fcbd (tag: v0.8) #对应哪一次提交
Author: dai-renwen <3484725023@qq.com>
Date:   Sun Oct 26 09:06:34 2025 +0800

    test new file

diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..a0ce182
--- /dev/null
+++ b/file.txt
@@ -0,0 +1 @@
+this is a new file int the remote-gitcode.

操作标签

bash 复制代码
git tag -d [tagname] # 删除本地标签:若标签打错删除

示例如下:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag -d v0.9
Deleted tag 'v0.9' (was 499648c)
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag
v0.8
v1.0

注:创建的标签仅存储在本地,不会自动推送到远程,打错的标签可在本地安全删除。

推送标签

bash 复制代码
git push origin <tagname> #- 推送某个标签到远程
git push origin --tags #一次性推送所有本地标签到远程

示例如下:

bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_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 a941c8a4
To gitee.com:dai-renwen/remote_gitcode.git
 * [new tag]         v1.0 -> v1.0
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git push origin --tags
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 654cef9f
To gitee.com:dai-renwen/remote_gitcode.git
 * [new tag]         v0.8 -> v0.8

删除远程标签

需先从本地删除,再从远程删除。例如删除远程v1.0标签:

  • 先删除本地标签
bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag -d v1.0
Deleted tag 'v1.0' (was 5395672)
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git tag
v0.8
  • 再删除远程标签
bash 复制代码
git push origin :tagname
bash 复制代码
drw1@iZn4adgxsi96b0p10hxn1fZ:~/remote_gitcode$ git push origin :v1.0
remote: Powered by GITEE.COM [1.1.5]
remote: Set trace flag 9b4138a0
To gitee.com:dai-renwen/remote_gitcode.git
 - [deleted]         v1.0
相关推荐
程序员小崔日记15 小时前
如何将代码轻松上传到 Gitee?Git 使用全攻略!
git·gitee·上传
HelloGitHub15 小时前
《HelloGitHub》第 119 期
开源·github
冬奇Lab1 天前
一天一个开源项目(第35篇):GitHub Store - 跨平台的 GitHub Releases 应用商店
开源·github·资讯
Jahzo1 天前
openclaw桌面端体验--ClawX
人工智能·github
逛逛GitHub1 天前
6个粉丝推荐的 GitHub 项目,收藏一波。
github
爱可生开源社区1 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
MaoPou1 天前
Hello Haxe篇
github
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
Bigger2 天前
为什么你的 Git 提交需要签名?—— Git Commit Signing 完全指南
git·开源·github
DianSan_ERP2 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet