Git(分布式版本控制系统)系统学习笔记【并利用腾讯云的CODING和Windows上的Git工具来实操】
Git的概要介绍
1️⃣ Git 是什么?
Git 是一个 分布式版本控制系统(DVCS),用于跟踪代码的变更、协作开发和管理项目历史。
- 由 Linus Torvalds(Linux 之父)在 2005 年开发,主要用于 代码管理。
- 适用于个人开发、团队协作、开源贡献等场景。
- Git 的数据存储方式类似于 快照(snapshot),而不是文件的逐行变更记录,这让它速度快、占用空间少。
2️⃣ Git 的特点
特点 | 解释 |
---|---|
分布式 | 每个开发者都有完整的代码库副本,即使远程仓库宕机,本地仍然可用。 |
高效 | Git 使用 快照 方式存储变更,速度快,占用空间少。 |
支持分支(Branching) | 分支切换快速,适用于多人协作和并行开发。 |
强大的合并(Merge)功能 | 处理多人开发的代码合并,减少冲突。 |
代码回滚 | 任何时候都可以回到历史版本,避免误删文件或错误修改。 |
3️⃣ Git 的基本概念
📌 仓库(Repository)
- 本地仓库:你的电脑上的 Git 项目目录,存储所有文件、提交历史等。
- 远程仓库:托管在 GitHub、GitLab、Gitee、腾讯云的CODING等平台上,方便协作。
📌 提交(Commit)
- 把代码的当前状态记录到 Git 历史中,每次提交都会生成一个唯一的 commit ID。
📌 分支(Branch)
- 主分支(main 或 master):通常是稳定版的代码。master 分支是早期的Git的 默认主分支,而main分支是Git 2.28+ 之后的默认主分支。
- 开发分支(develop / feature):用于开发新功能,最终合并到主分支。
📌 合并(Merge)
- 把不同分支的代码合并到一起,解决冲突并整合新功能。
📌 远程(Remote)
origin
:默认的远程仓库,通常指向 GitHub / GitLab 上的仓库。后面有对origin
的详细介绍哈。upstream
:通常指原始项目(开源贡献时常见)。
4️⃣ Git 的常用命令
👉 初始化 Git 仓库
git init # 在当前目录初始化一个 Git 仓库
👉 克隆(Clone)远程仓库
git clone https://github.com/user/repo.git # 复制远程仓库到本地
👉 添加文件到暂存区
git add <文件名> # 添加指定文件到暂存区
git add . # 添加所有文件
👉 提交代码
git commit -m "提交说明" # 提交代码并附带描述
👉 查看状态
git status # 查看当前仓库状态(哪些文件被修改、哪些在暂存区)
👉 查看历史记录
git log # 查看提交历史
git log --oneline --graph # 简洁模式,带分支图
👉 创建分支
git branch <分支名> # 创建新分支
git checkout <分支名> # 切换到指定分支(Git 2.23 以前)
git switch <分支名> # 切换到指定分支(Git 2.23 及以上)
👉 合并分支
git merge <分支名> # 把指定分支合并到当前分支
👉 远程操作
git remote -v # 查看远程仓库
git push origin main # 推送 main 分支到远程仓库
git pull origin main # 拉取远程 main 分支最新代码
👉 撤销修改
git reset --hard HEAD~1 # 撤回上一次提交
git checkout -- <文件名> # 撤销文件修改
5️⃣ Git 的工作流
🚀 本地开发
-
创建或克隆仓库:
git init git clone https://github.com/user/repo.git
-
编辑代码并提交
git add . git commit -m "修改了功能A"
-
推送到远程
git push origin main
🚀 团队协作
- 从远程拉取代码
git pull origin main
- 创建新分支并开发
git checkout -b feature-xxx
- 合并回主分支
git checkout main git merge feature-xxx
🚀 开源贡献
- Fork 远程仓库
- Clone Fork 仓库
- 修改代码
- 提交 Pull Request(PR)
6️⃣ Git 与 GitHub 的关系
- Git 是一个 版本控制工具,用于管理本地代码。
- GitHub / GitLab / Gitee 是 远程仓库托管平台,用于存储 Git 代码,方便团队协作。
7️⃣ 总结
✅ Git 是一个强大的 分布式版本控制系统,适用于个人开发、团队协作和开源贡献。
✅ 通过 commit、branch、merge、push 等命令,可以高效管理代码。
✅ Git + GitHub 结合使用,可以更好地进行远程协作。
Git中的master分支与main分支
在 Git 版本控制系统中,master
和 main
分支都指的是项目的主要分支,但它们有一些历史和默认行为上的区别。
1️⃣ master
分支:Git 早期默认主分支
master
是 Git 早期版本(Git 2.28 之前)的默认主分支,通常用于存储稳定的代码。- 几乎所有 Git 项目都曾使用
master
作为主要分支,并且 GitHub、GitLab 这些平台最初也默认创建master
作为主分支。 master
这个名字来源于软件开发中的“主版本”(master version)。- 由于历史原因,某些团队仍然沿用
master
作为默认主分支。
2️⃣ main
分支:Git 2.28+ 之后的新默认主分支
- Git 2.28(2020 年发布)开始,Git 官方把默认主分支名称从
master
改为main
。 - 主要原因是 “master” 一词可能带有历史争议(涉及主从关系 master/slave)。
- GitHub、GitLab 等平台也逐渐采用
main
作为默认主分支。 - 现在新创建的 Git 仓库默认主分支是
main
,而不是master
。
3️⃣ master
vs. main
的区别
对比项 | master | main |
---|---|---|
默认分支 | Git 2.28 之前的默认主分支 | Git 2.28+ 之后的新默认主分支 |
历史背景 | 传统上使用,几乎所有项目都曾使用 | 现代 Git 推荐的默认名称 |
命名争议 | 有历史争议(与 master/slave 关系有关) | 更中性、更现代的命名 |
使用情况 | 旧项目、老习惯仍然沿用 | 新建 Git 仓库默认使用 |
4️⃣ 如何将 master
改为 main
如果你的仓库仍然使用 master
,但你想改为 main
,可以执行以下操作:
✅ 1. 在本地重命名 master
为 main
git branch -m master main # 重命名本地 master 为 main
✅ 2. 推送 main
到远程,并让它成为默认分支
git push -u origin main # 推送 main 分支并设置上游
✅ 3. 删除远程的 master
(可选)
git push origin --delete master # 删除远程 master 分支
或者,你可以在 GitHub/GitLab 上手动更改默认分支,然后删除 master
。
5️⃣ 如何在 Git 2.28 及以上版本中默认使用 main
如果你的 Git 版本 >= 2.28,可以设置 main
作为默认主分支:
git config --global init.defaultBranch main
这样,以后使用 git init
初始化新仓库时,默认主分支就会是 main
,而不是 master
。
6️⃣ 结论
✅ master
是 Git 早期默认的主分支,Git 2.28 之后改用 main
。
✅ 现代 Git 仓库通常使用 main
作为默认分支,但 master
仍然被许多老项目沿用。
✅ 你可以手动将 master
改为 main
,也可以修改 Git 设置让 main
成为默认主分支。
远程仓库 origin 是什么意思?
问题来源
在博文https://blog.csdn.net/wenhao_ir/article/details/144322621 中,我们在更新本地仓库时用到了下面的命令:
git pull origin
这里边就出现了关键词origin
,下面这就对这个关键词`origin进行介绍?
远程仓库 origin
是什么?
在 Git 中,origin
是 远程仓库(remote repository) 的默认名称,通常指向你克隆(git clone
)的那个仓库。它是一个 本地 Git 仓库对远程仓库的引用,用于拉取(pull
)、推送(push
)代码。
origin
由哪里来的?
-
当你运行
git clone <仓库地址>
时,Git 自动创建一个名为origin
的远程仓库引用,指向你克隆的远程仓库。例如:git clone https://github.com/user/repo.git
这相当于执行:
git remote add origin https://github.com/user/repo.git
-
你可以查看当前仓库的远程信息:
git remote -v
典型输出:
origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push)
结果中:fetch
对应的URL 用于 从远程仓库获取更新,即命令 git fetch
和 git pull
会使用它。
git fetch
只是从远程仓库获取最新的提交,但不会合并到本地分支。git pull
相当于git fetch
+git merge
,会把远程的最新提交合并到当前分支。
结果中:push
对应的URL 用于 将本地提交推送到远程仓库,即 git push
命令会使用它。
- 当你运行
git push origin main
,Git 会把main
分支的最新提交推送到origin
远程仓库。
origin
的常见用法
-
拉取远程代码
git pull origin main # 从 origin 的 main 分支拉取更新
-
推送本地代码
git push origin main # 将本地 main 分支推送到 origin
-
查看远程仓库
git remote -v # 查看当前配置的远程仓库
-
添加/修改远程仓库
git remote add origin https://github.com/user/repo.git # 添加远程仓库 git remote set-url origin https://github.com/user/new-repo.git # 修改远程仓库地址
-
删除远程仓库
git remote remove origin
多个远程仓库的情况
-
origin
只是一个默认名称,你可以添加多个远程仓库,比如:git remote add upstream https://github.com/original-owner/repo.git
这里
upstream
就是另一个远程仓库。 -
当你有多个远程仓库时,你需要明确指定你要操作的远程,例如:
git pull upstream main # 从 upstream 拉取最新代码 git push origin main # 推送到 origin
什么叫当前分支的上游分支?
1️⃣ 什么是上游分支(Upstream Branch)?
上游分支(Upstream Branch) 是 Git 远程仓库中与你的本地分支关联的分支。
通常,本地分支会与远程仓库的某个分支建立 跟踪(tracking)关系,这个远程分支就叫上游分支。
2️⃣ 为什么要有上游分支?
当本地分支有上游分支后,可以:
✅ 直接运行 git pull
,拉取远程更新(不用指定远程和分支)。
✅ 直接运行 git push
,推送代码到远程仓库(不用写 git push origin main
)。
✅ 让 Git 知道本地代码和远程仓库的对应关系,便于管理。
3️⃣ 如何查看当前分支的上游分支?
git branch -vv
示例输出:
* main 123abc [origin/main] Update README
dev 456def [origin/dev] Fix login bug
解释:
*
号表示当前所在的分支(main
)。[origin/main]
说明main
这个本地分支的上游分支是origin/main
(远程origin
的main
分支)。
我电脑上的某个本地仓库运行结果如下:
可见,我的这个本地仓库与远程仓库的master分支相关联。
或者:
git status
如果当前分支有上游分支,可能会看到:
Your branch is up to date with 'origin/main'.
表示当前分支与 origin/main
(远程 main 分支)是同步的。
4️⃣ 如何设置上游分支?
✅ 方法 1:推送时自动建立上游
git push -u origin main
-u
(或--set-upstream
)参数的作用是 让本地main
分支跟踪origin/main
作为上游分支。- 以后你就可以直接用
git pull
和git push
,不用每次都指定origin main
。
✅ 方法 2:手动设置
git branch --set-upstream-to=origin/main
或者:
git branch --set-upstream-to=origin/main mybranch # 为 mybranch 设置上游
✅ 方法 3:克隆时自动关联
如果你是通过 git clone
获取远程仓库,Git 默认会把 origin/main
作为 main
分支的上游,你可以直接 git pull
和 git push
。
5️⃣ 如何取消上游分支?
如果想让本地分支不再跟踪任何上游分支:
git branch --unset-upstream
或者:
git branch --unset-upstream mybranch # 取消 mybranch 的上游
6️⃣ 上游分支的作用总结
操作 | 没有上游分支时 | 有上游分支时 |
---|---|---|
git pull | 需要写 git pull origin main | 直接 git pull |
git push | 需要写 git push origin main | 直接 git push |
git status | 只能看到本地状态 | 能看到与远程的差异 |
7️⃣ 例子:完整的 Git 工作流
# 1️⃣ 克隆远程仓库,默认 main 跟踪 origin/main
git clone https://github.com/user/repo.git
cd repo
# 2️⃣ 创建新分支并推送,同时建立上游
git checkout -b feature-login
git push -u origin feature-login
# 3️⃣ 查看上游分支
git branch -vv
# 4️⃣ 直接拉取远程更新(无需指定分支)
git pull
# 5️⃣ 直接推送到远程仓库(无需指定分支)
git push
8️⃣ 总结
✅ 上游分支是远程仓库中,当前分支所跟踪的分支。
✅ 上游分支让 git pull
和 git push
更方便,无需手动指定远程分支。
✅ git push -u origin <分支>
可以自动设置上游分支,以后推送更轻松。
✅ git branch -vv
可以查看当前分支的上游分支。
✅ 可以用 --unset-upstream
取消上游分支的跟踪。
命令git pull
和git pull origin
的区别
在 git pull
和 git pull origin
之间,主要区别如下:
-
git pull
- 省略了远程仓库的名称(默认使用当前分支的上游分支)。
- 等价于
git pull <默认远程> <当前分支>
,其中默认远程通常是origin
,默认分支取决于当前分支的上游设置。 - 如果当前分支有跟踪的上游分支(比如
origin/main
),它会从这个分支拉取更新。 - 如果当前分支没有配置上游分支,会报错,需要手动指定远程仓库和分支。
-
git pull origin
- 明确指定了远程仓库
origin
,但没有指定分支。 - Git 会默认拉取
origin
上当前分支的对应上游分支(如果有的话)。 - 如果当前分支没有设置上游分支,则需要手动指定,如
git pull origin main
。
- 明确指定了远程仓库
在 git pull
和 git pull origin
之间,主要区别如下:
-
git pull
- 省略了远程仓库的名称(默认使用当前分支的上游分支)。
- 等价于
git pull <默认远程> <当前分支>
,其中默认远程通常是origin
,默认分支取决于当前分支的上游设置。 - 如果当前分支有跟踪的上游分支(比如
origin/main
),它会从这个分支拉取更新。 - 如果当前分支没有配置上游分支,会报错,需要手动指定远程仓库和分支。
-
git pull origin
- 明确指定了远程仓库
origin
,但没有指定分支。 - Git 会默认拉取
origin
上当前分支的对应上游分支(如果有的话)。 - 如果当前分支没有设置上游分支,则需要手动指定,如
git pull origin main
。
- 明确指定了远程仓库
什么时候用哪一个?
- 如果你通常只和
origin
交互,并且已经设置了正确的上游分支,可以直接用git pull
。 - 如果你有多个远程仓库,或者想确保拉取的是
origin
,可以用git pull origin
。
例子:
# 假设当前分支 main 关联了 origin/main
git pull # 拉取 origin/main 的更新
# 显式指定远程仓库
git pull origin # 也拉取 origin/main 的更新
# 拉取指定远程分支
git pull origin develop # 拉取 origin/develop 的更新
总结来说,在大多数情况下,git pull
和 git pull origin
的行为是一样的,区别在于是否明确指定远程仓库。
小结
origin
只是 Git 给远程仓库的默认名称,不是 Git 内置的特殊关键字。- 你可以改名或增加其他远程仓库,如
upstream
。 - 了解
origin
对管理 Git 远程仓库很重要。
Git中的Fork的介绍
Fork 是什么?
Fork(派生) 是 Git 托管平台(如 GitHub、GitLab、Gitee)提供的功能,用于从别人的仓库复制一份独立的副本到你的账户下。它是 远程仓库级别 的复制,不影响原仓库。
Fork 的特点
- 独立性:Fork 后,你的仓库是独立的,不会影响原始仓库(上游仓库)。
- 与原仓库解耦:你可以自由修改 Fork 过来的代码,而不会影响原作者的仓库。
- 可与上游同步:虽然 Fork 是独立的,但你仍然可以通过一些手动的操作保持与原仓库的同步。
Fork 和 Clone 的区别
操作 | Fork | Clone |
---|---|---|
作用 | 在 GitHub/GitLab 上复制一个远程仓库 | 将远程仓库下载到本地 |
位置 | 在你的 GitHub/GitLab 账户下创建一个副本 | 本地电脑 |
影响原仓库 | 不会影响 | 不会影响 |
远程关联 | origin 指向 Fork 仓库,可手动添加 upstream | origin 指向原仓库 |
简单理解:
- Fork:复制一个远程仓库到你的 GitHub 账户(远程复制)。
- Clone:把远程仓库(包括 Fork 过来的)下载到本地(本地复制)。
什么时候用 Fork?
-
开源项目贡献
- 你想为一个开源项目贡献代码,但没有直接的写入权限:
- Fork 这个项目到自己的账户。
- Clone 到本地进行修改。
- 提交更改并 push 到 Fork 仓库。
- 发起 Pull Request(PR) 请求合并到原仓库。
- 你想为一个开源项目贡献代码,但没有直接的写入权限:
-
个人备份
- 你可以 Fork 一个项目,以便自己维护或进行私人修改,而不影响原项目。
-
实验或定制开发
- 你想基于某个项目进行二次开发,比如:
- 添加自己的功能
- 进行定制修改
- 但不影响原仓库
- 你想基于某个项目进行二次开发,比如:
Fork 后的典型工作流程
1️⃣ Fork 原仓库
- 在 GitHub 上点击
Fork
,生成一个属于自己的副本。
2️⃣ 克隆 Fork 仓库到本地
git clone https://github.com/your-username/repo.git
cd repo
下面的第3步和第4步是为了Fork 仓库与原仓库的代码保持同步,有时候你Fork 了仓库,但过了很久之后你需要开发,此时就需要先让Fork 仓库与原仓库的代码保持同步。
假如你是刚刚Fork 了一个仓库,并且立即克隆到本地,那么你的 Fork 仓库和原始仓库(上游仓库)是完全同步的,不需要立刻进行同步操作。
3️⃣ 添加原始仓库(上游仓库)获取最新代码
git remote add upstream https://github.com/original-owner/repo.git
git remote -v # 确认 origin 和 upstream
4️⃣ 拉取最新更新
git fetch upstream # 获取原仓库的更新信息
git merge upstream/main # 将有更新的代码合并到本地 main 分支
5️⃣ 修改代码并推送
git commit -am "Added a new feature"
git push origin main # 推送到你的 Fork
6️⃣ 创建 Pull Request(PR)
- 在 GitHub 上访问 Fork 仓库,点击
Compare & pull request
,提交合并请求给原仓库。提交 Pull Request(PR)后,原仓库的维护者需要手动审核并确认,原仓库才会更新。
小结
✅ Fork 主要用于 GitHub/GitLab/Gitee 等托管平台,让你创建远程仓库的副本。
✅ 适用于开源贡献、代码备份、二次开发等场景。
✅ Fork 后你可以修改代码,并通过 Pull Request(PR) 提交更改。
✅ 可以手动同步原仓库的最新代码,以保持更新。
远程仓库的信息在本地是存储在哪里的?
提问:
Windows上安装了git克隆了某个仓库代码到本地,然后为什么我进入这个仓库代码的目录运行命令:
git pull origin
它就知道去互联网上的哪个仓库检查是否有更新呢?这个仓库地址是存放在哪里的?
答:
远程仓库的地址存储在本地仓库的 .git/config
文件中,git pull origin
会使用这个信息访问远程仓库。.git
目录是一个隐藏文件夹哈。
Windows上本地Git客户端的安装
详情见 https://blog.csdn.net/wenhao_ir/article/details/134596223
实际例子操作
在腾讯云的CODING上创建一个Git仓库
打开腾讯云的CODING的网址 https://coding.net/
然后用微信扫码登陆,这里我用的是我“昊虹AI笔记”的微信进行的登陆。
首先需要创建一个项目:
项目创建好后点击“代码仓库”:
创建代码仓库:
填写仓库信息然后完成创建。
完成创建后得到下面的提示:
注意上面的提示:
当您使用客户端克隆代码仓库时,终端提示的用户名是您在 CODING 个人设置 里填写的「手机」或「邮箱」。
后面在克隆仓库到本地时应该会用得着这一点。
还得到了仓库的地址:
HTTPS的地址如下:
https://e.coding.net/g-cyrz2558/swh_project01/swh_git_01.git
SSH的地址如下:
我们点击上图中的快速初始化仓库。
勾选上“启用README.md文件初始化仓库”,然后点击“快速初始化仓库”:
初始化仓库完成的界面如下:
里面目前就只有一个名为README.md的文件。
同时只有一个名为master的分支。
关于Git中master分支的概念,上面我已经介绍了,由此可见,腾讯云的CODING在主分支的命名上没有使用现在Git 2.28+的main来命名。
将远程建立的Git仓库克隆到本地
新建一个目录,名字就叫 my_git_repo
进入这个目录,然后右键点击
然后运行命令:
git clone https://e.coding.net/g-cyrz2558/swh_project01/swh_git_01.git
然后输入仓库管理帐号的帐号和密码:
2487872782@qq.com
密码略…
如果一个仓库是公开仓库,是不需要帐号和密码的,仓库是私有仓库还是公开仓库在创建仓库时可以选择。
仓库管理帐号的帐号和密码后,就开始拉取远程仓库到本地:
然后在目录E:\my_git_repo
下就有这个仓库形成的目录swh_git_01
了,如下图所示:
进入目录swh_git_01
看一看,发现远程master分支的文件被克隆到本地了。
README.md的内容如下:
查看本地仓库的配置信息
打开查看目录swh_git_01
下的隐藏目录:
从上面的配置信息中我们可以看出,名字 origin
指向的远程仓库为https://e.coding.net/g-cyrz2558/swh_project01/swh_git_01.git
,当前分支的上游分支为:master
用命令查看 origin
指向的远程仓库
我们上面已经通过查看文件"E:\my_git_repo\swh_git_01\.git\config"
分析出了 origin
指向的远程仓库,这里通过命令查看下:
首先进入目录:E:\my_git_repo\swh_git_01
,然后右键打开Git Bash
运行下面的命令:
git remote -v
这样就得到了remote的远程仓库的地址了,前面已经介绍过了,fetch用来从远程仓库向本地拉取信息的地址,而push则是本地向远程仓库推送信息的地址。
用命令查看当前分支的上游分支
这篇博文的前面我已经介绍过“当前分支的上游分支”的概念。
我们上面已经通过查看文件"E:\my_git_repo\swh_git_01\.git\config"
分析出了当前分支的上游分支,这里通过命令查看下:
首先进入目录:E:\my_git_repo\swh_git_01
,然后右键打开Git Bash
运行下面的命令:
git branch -vv
可见“当前分支的上游分支”是[origin/master]
,即本地分支会与远程仓库的分支master相关联。
再在本地的另一个目录中克隆一个这个仓库,便于后面测试pull功能
git clone https://e.coding.net/g-cyrz2558/swh_project01/swh_git_01.git
新建一个文件,并推送到远程仓库中
在本地仓库目录中新建文件 swh_code.txt,然后随意写入内容:
运行下面的一系列命令就可以推送到origin对应的远程仓库中:
cd /path/to/your/repository # 进入仓库目录
git add swh_code.txt # 添加文件
git commit -m "Add swh_code.txt" # 提交
git push origin main # 推送到远程仓库
01-添加文件
git add swh_code.txt
如果swh_code是目录,则像下面这样写(这将会添加 swh_code 目录下的所有文件和子目录。):
git add swh_code
02-提交:
git commit -m "Add swh_code.txt"
03-推送到远程仓库的master分支
git push origin master
如果是main分支则像下面这样写:
git push origin main
推送完成后我们再到远程仓库中去看一下。
有刚推送上去的文件了:
更新刚才克隆到本地的另一个本地仓库
本地仓库 E:\my_git_repo_2\swh_git_01
中目前还没有更新刚才更新到文件swh_code.txt
由于上一步中已经让远程仓库更新了,所以此时可以更新这个本地仓库了。
运行下面的命令:
git pull origin master
然后就有了…