引言
再上一篇文章里我们已经安装并且配置好了GitHub的环境,接下来让我们去学习如何使用它。
一、仓库创建与基本代码提交
1、从本地开始追踪一个项目到 GitHub
假设你已经在本地有一个项目文件夹,想把它托管到 GitHub。
1、进入本地项目文件夹,初始化 Git 仓库
# 进入具体的项目文件夹
cd D:
cd python/pytest1
# 初始化 git 仓库,指定默认分支为 main(和 GitHub 一致)
git init --initial-branch=main
执行后终端提示 Initialized empty Git repository in ...,说明初始化成功。

2、将本地所有文件添加到暂存区,完成第一次提交
# 创建 .gitignore 文件(用于忽略不需要追踪的文件,比如 Python 的 __pycache__)
touch .gitignore
# 把文件夹里所有文件添加到 Git 暂存区(. 代表所有文件)
git add .
# 提交暂存区的文件到本地仓库(-m 后是提交说明)
git commit -m "first commit ^_^"
3、在 GitHub 上创建一个空的远程仓库
1、打开 GitHub,点击右上角「+」→ 选择「New repository」
2、填写仓库信息:Repository name:仓库名(建议和本地文件夹名一致),Description(可选):项目描述,Visibility:选「Public」或「Private」,重点:不要勾选「Add a README file」「Add .gitignore」「Choose a license」(这些会导致远程仓库非空,后续推送冲突),最后点击「Create repository」。
创建完成后,页面会显示仓库的 SSH 地址(如 git@github.com:你的用户名/learngit.git),先复制这个地址。
4、关联本地仓库和 GitHub 远程仓库
# 添加远程仓库(origin 是远程仓库的别名)
git remote add origin git@github.com:PLAYEROFMYLIFE/learngit.git
# 验证是否关联成功
git remote -v
5、将本地代码推送到 GitHub
# 把本地 main 分支推送到 origin 的 main 分支
# -u 是绑定默认推送分支,后续只需 git push 即可
git push --set-upstream origin main
打开 GitHub 仓库页面,刷新即可看到代码已经上传成功。

2、从仓库开始追踪一个项目
如果你先从 GitHub 上创建了一个仓库(或想克隆别人的仓库),可以这样操作:
git clone git@github.com:PLAYEROFMYLIFE/learngit.git
1、克隆仓库到本地
git clone git@github.com:PLAYEROFMYLIFE/learngit.git
2、本地修改文件并提交
进入克隆下来的文件夹,修改文件,然后执行:
# 查看修改状态
git status
# 添加修改到暂存区
git add filename
# 提交修改到本地仓库
git commit -m "modify commit"
# 推送到远程仓库
git push origin main
二、Git分支与版本控制
1、分支管理基础
分支允许你在不影响主代码的前提下独立开发新功能或修复 Bug,待改动完成后再将其合并回去,而 GitHub Flow 正是基于这一理念的轻量级分支策略,其核心在于始终保持主分支(main 或 master)处于可部署状态,所有新功能都在短期存在的功能分支上开发,完成后通过 Pull Request 合并回主分支。
1、分支的概念
假设你在写一篇论文,主分支main对应论文的终稿,如果你想加一个新章节,又担心影响已完成的内容,于是复制一份论文在副本上写作,这就是新建分支feature-新章节,在写新章节的过程中,发现原论文有个错别字,便切回原论文修改,这对应切回main分支修复Bug,新章节写完且确认无误后,将副本的内容合并回原论文,这就是合并feature分支到main分支。分支之间互不干扰,你可以在任意分支上修改代码而不会影响其他分支。
2、核心作用
1、隔离开发,避免代码混乱:Git中的分支管理通常将主分支(main/master)用于存放稳定、可发布的代码,并且严禁直接在上面进行修改,新功能的开发则在功能分支(feature/*)上进行,而Bug的修复则使用专门的Bug修复分支(bugfix/*/hotfix/*),这种分支策略确保了即使功能分支上的代码出现问题,也不会影响主分支的稳定性。
2、支持多人并行开发:每个人在自己的分支上开发,互不干扰,最后合并。
3、常用分支介绍
分支类型 命名规范 用途
主分支 main 或 master 存放稳定、可发布的代码(核心分支)
开发分支 dev 或 develop 团队日常开发的分支(所有功能先合到这)
功能分支 feature/xxx 开发单个新功能(比如 feature-login)
Bug 修复分支 bugfix/xxx 修复开发中的 Bug
紧急修复分支 hotfix/xxx 修复线上已发布版本的紧急 Bug
4、分支的核心操作
# 1. 查看所有分支(* 表示当前所在分支)
git branch
# 2. 新建分支(比如新建 feature-login 分支)
git branch feature/login
# 3. 切换到新建的分支
git checkout feature-login
# 或者(Git 2.23+ 推荐)
git switch feature-login
# 简写(新建+切换一步到位,最常用)
git checkout -b feature-login
# 或者
git switch -c feature-login
# 4. 把 feature-login 分支合并到 main 分支(先切回 main)
git checkout main
git merge feature-login
# 5. 删除已合并的分支(开发完成后清理)
git branch -d feature-login
5、合并分支解决冲突
合并冲突通常会在两个不同的分支修改了同一个文件的同一部分代码时触发,其核心原因是Git无法判断应该保留哪一个版本,因此只能暂停合并过程,等待开发者手动决策,常见的触发场景包括多人同时修改同一文件、自己在不同分支修改同一文件,以及分支长期未合并而主分支已经更新。
我们来模拟一个冲突场景:
1、创建测试文件夹并初始化
mkdir git-conflict-demo
cd git-conflict-demo
git init --initial-branch=main
touch calculator.py
2、编辑 calculator.py 初始版本
# calculator.py - 初始版本
def add(a, b):
"""计算两个数的和"""
result = a + b
return result
# 测试代码
if __name__ == "__main__":
print("计算结果:", add(10, 20))
3、提交代码到 main 分支
git add calculator.py
git commit -m "初始化:添加加法函数"
4、创建 feature 分支并修改代码
git checkout -b feature-add-tax
#修改 calculator.py:
# calculator.py - feature 分支版本
def add(a, b):
"""计算两个数的和(含10%税费)"""
result = (a + b) * 1.1 # 核心修改:加了税费计算
return result
# 测试代码
if __name__ == "__main__":
print("计算结果(含税费):", add(10, 20))
#提交:
git add calculator.py
git commit -m "feature分支:加法函数增加税费计算"
5、切换回 main 分支并修改同一文件
git checkout main
#修改 calculator.py:
# calculator.py - main 分支版本
def add(a, b):
"""计算两个数的和(四舍五入)"""
result = round(a + b, 2) # 核心修改:四舍五入,和 feature 分支冲突
return result
# 测试代码
if __name__ == "__main__":
print("计算结果(四舍五入):", add(10, 20))
#提交:
git add calculator.py
git commit -m "main分支:加法函数增加四舍五入"
6、合并分支,触发冲突
git merge feature-add-tax
此时会提示冲突:
Auto-merging calculator.py
CONFLICT (content): Merge conflict in calculator.py
Automatic merge failed; fix conflicts and then commit the result.
7、查看冲突后的 Python 文件
打开 calculator.py,会看到 Git 插入的冲突标记:
<<<<<<< HEAD
# calculator.py - main 分支版本
def add(a, b):
"""计算两个数的和(四舍五入)"""
result = round(a + b, 2) # 核心修改:四舍五入,和 feature 分支冲突
=======
# calculator.py - feature 分支版本
def add(a, b):
"""计算两个数的和(含10%税费)"""
result = (a + b) * 1.1 # 核心修改:加了税费计算
>>>>>>> feature-add-tax
return result
# 测试代码
if __name__ == "__main__":
<<<<<<< HEAD
print("计算结果(四舍五入):", add(10, 20))
=======
print("计算结果(含税费):", add(10, 20))
>>>>>>> feature-add-tax
8、手动解决冲突
我们需要融合两个分支的逻辑:既加税费,又四舍五入。修改文件为:
# calculator.py - 解决冲突后的版本
def add(a, b):
"""计算两个数的和(含10%税费+四舍五入)"""
result = round((a + b) * 1.1, 2) # 融合两个分支的逻辑
return result
# 测试代码
if __name__ == "__main__":
print("计算结果(含税费+四舍五入):", add(10, 20)) # 预期输出:33.0
保存后,执行:
git add calculator.py
git commit -m "解决冲突:融合税费和四舍五入"
9、在 GitHub 上使用 Pull Request
实际团队协作中,我们通常先在本地合并测试,然后推送到远程,再在 GitHub 上创建 PR。如果远程已经有冲突,可以在 GitHub 网页上解决,但更推荐在本地解决后推送。
如果需要放弃本次合并,可以执行:
git merge --abort
然后从远程拉取最新代码再尝试合并。
6、分支删除
1、本地分支删除
查看本地分支:
git branch
删除已合并分支:
# 删除单个分支(-d 只删已合并的分支)
git branch -d feature-login
# 强制删除未合并的分支(谨慎!-D 会丢失代码)
git branch -D feature-unfinished
批量删除本地已合并的分支:
# 先切到 main 分支,再删除所有已合并到 main 的本地分支
git checkout main
git branch --merged main | grep -v "main" | xargs git branch -d
2、远程分支删除
终端删除远程分支
git push origin --delete feature-login
GitHub 网页删除远程分支:打开仓库页面 → 点击顶部「Code」→ 右侧「Branches」;找到要删除的分支 → 点击右侧「⋯」→ 选择「Delete branch」。
7、误删分支的恢复方法
恢复本地已删除的分支
# 找到删除分支的最后一次提交记录
git reflog
# 从提交记录恢复分支(替换成你的提交哈希值,比如 abc123)
git checkout -b feature-login abc123
恢复远程已删除的分支(先在本地恢复分支,然后重新推送到远程)
git push origin feature-login
8、提交历史的管理与重写
重做最近一次提交
git commit --amend(这会打开编辑器,让你修改提交信息;如果之前忘了 add 某个文件,可以先 add 再执行此命令。)
重置最近一次提交(撤销提交,但保留代码修改)
git reset --soft HEAD^
不同 reset 对比:
命令 效果
git reset --soft 仅撤销提交,保留暂存区 / 工作区代码
git reset --mixed 撤销提交 + 暂存区,保留工作区代码(默认)
git reset --hard 撤销提交 + 暂存区 + 工作区,代码直接丢失