git学习(二)
十五、远程仓库Github
GitHub 是基于 Git 的远程代码托管平台,可以用于存储、管理和协作开发代码。远程仓库让多个开发者可以共享和同步代码。
1. 配置 GitHub 远程仓库
在使用 GitHub 之前,首先需要配置 Git 远程仓库。
(1)生成 SSH 密钥(推荐)
如果不想每次都输入 GitHub 密码,建议使用 SSH 连接:
1 | ssh-keygen -t rsa -b 4096 -C "你的邮箱" |
然后将生成的 ~/.ssh/id_rsa.pub 文件的内容添加到 GitHub 账户的 SSH Keys 中。
测试 SSH 连接:
1 | ssh -T git@github.com |
如果看到 Hi xxx! You've successfully authenticated,表示 SSH 配置成功。
2. 关联本地仓库和 GitHub 远程仓库
如果你已经有一个本地 Git 仓库,想把它推送到 GitHub,可以按照以下步骤操作。
(1)初始化本地 Git 仓库(如果还没有)
1 | git init |
(2)创建远程仓库
登录 GitHub
点击右上角 “+” → New repository” 创建新仓库
不要勾选 “Initialize this repository with a README”(如果你已经有本地仓库)
复制 GitHub 提供的远程仓库地址,如:
1
2git@github.com:your-username/your-repo.git (SSH 地址)
https://github.com/your-username/your-repo.git (HTTPS 地址)
(3)添加远程仓库
1 | git remote add origin git@github.com:your-username/your-repo.git # 使用 SSH |
检查远程仓库是否添加成功
1 | git remote -v |
如果成功,会显示:
1 | origin git@github.com:your-username/your-repo.git (fetch) |
3. 推送本地代码到 GitHub
1 | git add . |
-u选项表示将本地main分支与远程origin/main关联,之后推送代码可以直接使用git push。
如果远程仓库默认分支不是 main,可以先查看远程默认分支:
1 | git branch -r |
然后推送到正确的分支,例如:
1 | git push -u origin master |
4. 从 GitHub 克隆远程仓库
如果你想在另一台设备或新的目录下获取远程仓库:
1 | git clone git@github.com:your-username/your-repo.git # SSH |
5. 拉取远程更新
如果远程仓库有新的提交,而你本地代码不是最新的,可以执行:
1 | git pull origin main |
如果遇到冲突(conflict),需要手动解决后再提交。
6. 远程仓库相关操作
(1)查看远程仓库信息
1 | git remote -v |
(2)修改远程仓库地址
1 | git remote set-url origin git@github.com:new-username/new-repo.git |
(3)删除远程仓库
1 | git remote remove origin |
7. 分支管理
(1)推送新分支
1 | git checkout -b feature-branch # 创建并切换到新分支 |
(2)拉取远程分支
1 | git fetch origin # 获取远程所有分支 |
(3)合并分支
1 | git merge feature-branch |
然后推送更新:
1 | git push origin main |
8. 贡献开源项目(Fork & Pull Request)
如果你想贡献别人的 GitHub 项目,通常需要:
- Fork 目标仓库
- Clone 你 Fork 的仓库到本地
- 创建新分支 进行修改
- 提交代码 并推送到你的 Fork 仓库
- 在 GitHub 提交 **Pull Request (PR)**,等待项目维护者审核合并。
9. 结论
GitHub 远程仓库的常见操作包括:
| 操作 | 命令 |
|---|---|
| 初始化仓库 | git init |
| 添加远程仓库 | git remote add origin <url> |
| 推送代码 | git push -u origin main |
| 克隆仓库 | git clone <url> |
| 拉取远程更新 | git pull origin main |
| 查看远程仓库 | git remote -v |
| 删除远程仓库 | git remote remove origin |
十六、git push 和 git pull
在 Git 版本控制系统中,git push 和 git pull 是用于本地仓库和远程仓库之间同步代码的两个核心命令。
1. git push(推送)
git push 用于 将本地分支的代码提交到远程仓库,让团队的其他人可以获取你的更新。
基本语法
1 | git push <远程仓库名> <分支名> |
常见用法:
1 | git push origin main |
含义:
origin:远程仓库的默认名称main:要推送的分支名称
如果已经设置了默认远程仓库和分支,可以直接执行:
1 | git push |
强制推送
如果远程分支的提交记录比本地更新,Git 可能会拒绝推送。可以使用 --force 强制覆盖远程分支:
1 | git push --force |
⚠ 注意:强制推送可能会覆盖远程仓库的更改,慎用!
2. git pull(拉取)
git pull 用于 从远程仓库获取最新代码,并合并到当前分支。它实际上是 git fetch + git merge 的简写。
基本语法
1 | git pull <远程仓库名> <分支名> |
常见用法:
1 | git pull origin main |
含义:
origin:远程仓库的默认名称main:要拉取的分支名称
如果已经设置了默认远程仓库和分支,可以直接执行:
1 | git pull |
处理合并冲突
如果本地代码和远程代码有冲突,Git 会提示你手动解决:
编辑冲突文件,保留需要的代码。
使用
1
git add
标记已解决的文件:
1
git add <文件名>
提交更改:
1
git commit -m "解决合并冲突"
3. git push 和 git pull 的区别
| 命令 | 作用 |
|---|---|
git push |
将本地分支的代码推送到远程仓库 |
git pull |
从远程仓库拉取最新代码并合并到本地 |
4. 常见错误及解决方法
(1)推送时报错:failed to push some refs to ...
原因:本地代码落后于远程仓库,需要先同步。
解决方法:
1 | git pull --rebase origin main # 先拉取最新代码 |
(2)拉取时报错:合并冲突(Merge Conflict)
解决方法:
打开冲突文件,手动修改冲突部分。
git add解决的文件:1
git add <文件名>
重新提交:
1
git commit -m "解决合并冲突"
5. 总结
- **
git push**:把本地代码推送到远程仓库,让别人可以看到你的改动。 - **
git pull**:从远程仓库拉取最新代码,保持本地代码的更新。 - **先
git pull再git push**,可以避免推送失败。
这样,团队协作时就能保证代码同步,不会相互覆盖。
十七、分支branch
Git 分支(Branch)是 Git 版本控制中的一项核心功能,它允许你在同一个仓库中并行开发,而不会影响主分支(main 或 master)。
1. 什么是分支?
- 分支是 Git 维护的多个代码版本线,它们可以相互独立开发,并在需要时合并。
- 默认分支 通常是
main(或master)。 - 分支的作用:
- 并行开发新功能(feature)
- 修复 bug 而不影响主分支
- 进行实验性开发
2. 常用 Git 分支命令
(1)查看当前分支
1 | git branch |
示例输出:
1 | * main |
* 号表示当前所在的分支。
(2)创建新分支
1 | git branch 分支名 |
示例:
1 | git branch feature-1 |
但这样只是创建分支,并未切换到该分支。
(3)切换到新分支
1 | git checkout 分支名 |
或(推荐用法):
1 | git switch 分支名 |
示例:
1 | git switch feature-1 |
(4)创建并切换到新分支(推荐)
1 | git checkout -b 分支名 |
或
1 | git switch -c 分支名 |
示例:
1 | git switch -c feature-1 |
这样会同时创建分支并切换到它。
(5)删除本地分支
1 | git branch -d 分支名 # 正常删除 |
示例:
1 | git branch -d feature-1 |
(6)删除远程分支
1 | git push origin --delete 远程分支名 |
示例:
1 | git push origin --delete feature-1 |
(7)合并分支git merge 分支名
当你完成新分支的开发后,可以把它合并到 main:
1 | git checkout main |
或(推荐):
1 | git switch main |
3. 远程分支
(1)查看远程分支
1 | git branch -r |
示例输出:
1 | origin/main |
(2)推送本地分支到远程
1 | git push origin 分支名 |
示例:
1 | git push origin feature-1 |
(3)拉取远程分支
如果远程有 dev 分支,你想要在本地使用:
1 | git checkout -b dev origin/dev |
或(Git 2.23+ 推荐):
1 | git switch --track origin/dev |
4. 处理分支冲突
当合并分支时,Git 可能会提示冲突。解决方法:
Git 会提示冲突的文件,你需要手动修改它们。即重新编辑冲突的文件中的内容,自行决定保留什么,删除什么。
使用
git add标记已解决的文件:1
git add 冲突文件
提交更改:
1
git commit -m "解决合并冲突"
终止合并:当不行继续执行合并操作时可以使用下面的命令来终止合并过程:
1 | git merge --abort |
5. 总结
| 命令 | 作用 |
|---|---|
git branch |
查看本地分支 |
git branch 分支名 |
创建新分支 |
git switch 分支名 |
切换到已有分支(推荐) |
git switch -c 分支名 |
创建并切换到新分支(推荐) |
git merge 分支名 |
合并分支 |
git branch -d 分支名 |
删除本地分支 |
git push origin --delete 分支名 |
删除远程分支 |
git push origin 分支名 |
推送本地分支到远程 |
git pull origin 分支名 |
拉取远程分支 |
十八、git checkout命令
git checkout 主要用于 切换分支 或 恢复文件,但在 Git 2.23 之后,官方推荐使用 git switch 和 git restore 来替代 checkout 的部分功能。
1. git checkout 的主要功能
git checkout 主要有两个用途:
- 切换分支
- 恢复文件
2. git checkout 切换分支
(1)切换到已有分支
1 | git checkout 分支名 |
示例:
1 | git checkout dev |
推荐使用
git switch dev(Git 2.23+)。
(2)创建并切换到新分支
1 | git checkout -b 分支名 |
示例:
1 | git checkout -b feature-1 |
推荐使用
git switch -c feature-1。
3. git checkout 恢复文件
(1)撤销工作区的修改
如果你修改了 file.txt,但还没有 git add,想要撤销修改:
1 | git checkout -- file.txt |
推荐使用
git restore file.txt(Git 2.23+)。
(2)恢复某个文件到指定分支的版本
从 main 分支恢复 file.txt 到当前分支:
1 | git checkout main -- file.txt |
4. git checkout 检出某个提交
(1)切换到某个提交
1 | git checkout 提交哈希值 |
示例:
1 | git checkout a1b2c3d |
⚠️ 注意:
这样会进入 分离 HEAD 状态,此时你不在任何分支上,Git 仅指向该提交。
(2)从某个提交创建新分支
1 | git checkout -b new-branch a1b2c3d |
5. git checkout 的推荐替代命令
Git 2.23+ 之后,推荐使用以下命令替代 checkout:
| 功能 | 旧 git checkout 命令 |
推荐新命令 |
|---|---|---|
| 切换分支 | git checkout 分支名 |
git switch 分支名 |
| 创建并切换新分支 | git checkout -b 分支名 |
git switch -c 分支名 |
| 撤销文件修改 | git checkout -- 文件名 |
git restore 文件名 |
6. 总结
git checkout 用法 |
作用 |
|---|---|
git checkout 分支名 |
切换到已有分支(推荐用 git switch) |
git checkout -b 分支名 |
创建并切换到新分支(推荐用 git switch -c) |
git checkout -- 文件名 |
撤销未提交的修改(推荐用 git restore) |
git checkout 提交哈希值 |
切换到指定提交(进入分离 HEAD 状态) |
git checkout main -- 文件名 |
从 main 分支恢复某个文件 |
十九、git rebase命令
git rebase(变基)用于 将一个分支的提交应用到另一个分支的最新状态,它通常用于让分支历史保持线性,避免过多的合并提交(merge commit)。
Git rebase(变基)详解
git rebase(变基)用于 将一个分支的提交应用到另一个分支的最新状态,它通常用于让分支历史保持线性,避免过多的合并提交(merge commit)。
1. git rebase 的作用
- 让分支历史更干净,减少不必要的合并提交。
- 在多人协作时,让本地分支跟上远程主分支的最新变化。
- 将某个功能分支(feature 分支)基于最新的
main分支重新排列提交。
2. git rebase 的基本用法
(1)基础用法
1 | git checkout feature |
或:
1 | git switch feature |
作用:
feature分支会被“重新放置”到main分支的最新提交之后。- Git 会逐个将
feature分支的提交应用到main的最新状态。
3. git merge vs git rebase
两者的区别可以用下面的场景说明:
(1)使用 git merge
1 | git checkout feature |
结果:
feature分支保留原来的提交历史。- 产生一个新的合并提交(
merge commit)。
优点:不会破坏原分支的提交历史,方便回溯和查看。
缺点:会产生额外的提交节点,分支图比较复杂。
示例:
1 | A---B---C (main) |
(2)使用 git rebase
1 | git checkout feature |
结果:
feature分支的提交会被重新应用到main之后。- 不会 产生
merge commit,历史记录会更线性。
优点:不会新增额外的提交记录,形成线性历史,比较直观和干净。
缺点:会改变提交历史,改变了当前分支branch out的节点。要避免在共享分支中使用。
示例:
1 | A---B---C (main) |
其中 D', E', F' 是 D, E, F 的重新应用版本。
总结:
| 方法 | 结果 | 适用场景 |
|---|---|---|
merge |
生成一个 merge commit,保留完整的历史 |
适用于合并分支,保持历史完整 |
rebase |
让分支历史线性化,提交“重新排列” | 适用于清理提交历史,保持干净的提交树 |
4. git rebase 解决冲突
如果 rebase 过程中发生冲突,Git 会暂停 rebase 并提示你手动解决冲突:
按 Git 提示手动修改冲突文件。
使用
1
git add
标记已解决的文件:
1
git add 冲突文件
继续
rebase1
git rebase --continue
如果想取消
rebase:1
git rebase --abort
5. 交互式 git rebase -i
如果你想修改提交历史,可以使用 **交互式 rebase**:
1 | git rebase -i HEAD~3 |
这表示对最近 3 次提交进行修改,Git 会打开一个编辑器:
1 | pick a1b2c3d 修复了一个 bug |
你可以:
- 修改提交消息(用
reword代替pick)。 - 合并提交(用
squash代替pick)。 - 删除提交(直接删除行)。
6. 远程分支 git rebase 注意事项
如果你已经 push 了提交到远程仓库,不要直接 git rebase 并强推,否则可能会影响他人代码。
如果你已经 rebase 了远程分支,可以用:
1 | git push --force-with-lease |
这样会尽量避免破坏别人的提交。
7. 结论
| 操作 | 作用 |
|---|---|
git rebase main |
让当前分支基于 main 的最新状态 |
git rebase --continue |
继续 rebase(解决冲突后执行) |
git rebase --abort |
取消 rebase |
git rebase -i HEAD~N |
交互式修改最近 N 次提交 |
git push --force-with-lease |
在远程 rebase 后安全推送 |
二十、Git 分支管理与工作流模型
Git 的分支管理与工作流模型是软件开发中非常重要的部分,合理的分支管理能提高团队协作效率,保证代码质量。常见的工作流模型包括 Git Flow、GitHub Flow 和 GitLab Flow,它们适用于不同的开发模式。
1. Git 分支管理基础
(1)常见分支类型
| 分支类型 | 作用 |
|---|---|
main(或 master) |
主分支,存放稳定可发布的代码 |
develop |
开发分支,存放最新的开发代码 |
feature |
功能分支,每个新功能一个独立分支 |
release |
预发布分支,主要用于测试和修复 bug |
hotfix |
线上紧急修复分支,直接从 main 创建 |
2. Git 工作流模型
不同的 Git 工作流适用于不同的团队开发方式,以下是三种常见的工作流:
(1)Git Flow(适用于大型团队和长周期开发)
适用场景:
- 适用于 团队协作 和 复杂项目,如 Web 应用、企业级系统。
- 需要 多个并行开发,如新功能开发、发布版本管理、紧急修复等。
分支管理规则:
main分支:始终保持稳定,仅存放正式发布的代码。develop分支:用于日常开发,合并所有feature分支。feature分支:基于develop创建,每个功能一个feature分支,开发完成后合并回develop。release分支:从develop创建,用于测试和最终修复 bug,确保版本稳定后合并到main和develop。hotfix分支:直接从main创建,用于紧急修复线上 bug,修复后合并回main和develop。
(2)GitHub Flow(适用于短周期敏捷开发)
适用场景:
- 适用于 敏捷开发,比如 小型团队、开源项目。
- 只维护
main分支,开发分支是短期feature分支。
分支管理规则:
main分支是唯一的长期存在分支,保持可随时部署的状态。- 所有新功能都基于
main创建feature分支。 feature开发完成后,创建 Pull Request(PR),经过代码审核后合并到main。main经过 CI/CD 测试后自动部署。
(3)GitLab Flow(适用于持续集成 CI/CD)
适用场景:
- 适用于 企业级项目,结合 CI/CD 自动化部署。
- 在
main之外,还维护 预发布分支(staging) 和 生产分支(production)。
分支管理规则:
main仍然是开发分支,不直接用于生产。feature分支基于main创建,开发完成后合并回main。main合并后,代码自动部署到staging进行测试。- 通过
git tag标记版本,然后部署到production。
3. 如何选择合适的工作流?
| 工作流 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Git Flow | 适用于大型团队和长周期开发 | 结构清晰,适合复杂项目 | 分支较多,管理成本较高 |
| GitHub Flow | 适用于小型团队和开源项目 | 简单直接,适合短周期开发 | 需要高质量的代码评审 |
| GitLab Flow | 适用于企业 CI/CD 自动化 | 适配 DevOps,可快速部署 | 需要良好的 CI/CD 流程支持 |
4. 分支命名
推荐使用带有意义的描述性名称来命名分支。
- 版本发布分支/Tag示例: v1.0.0
- 功能分支示例:feature-login-page
- 修复分支示例:hotfix-#issueid-desc
5.分支管理
- 定期合并已经成功验证的分支,及时删除已经合并的分支
- 保持合适的分支数量
- 为分支设置合适的管理权限
二十一、README 文件介绍
README 文件是项目的 说明文档,通常用于介绍项目的 用途、安装方式、使用方法 等。它通常放在 项目的根目录,并且 GitHub、GitLab 等代码托管平台会自动识别和显示它的内容。
1. README 文件的格式
README 文件通常使用 Markdown(.md) 或 纯文本(.txt) 格式。
常见的文件名:
README.md(推荐,使用 Markdown 语法,适用于 GitHub 等)README.txt(纯文本格式)README.rst(reStructuredText 格式,常用于 Python 项目)
2. README.md 文件的基本结构
Markdown 版本的 README.md 一般包含以下内容:
1 | # 项目名称 |
进入项目目录:
1
cd yourproject
安装依赖(示例,具体根据项目而定):
1
npm install
使用方法
运行项目:
1 | npm start |
贡献
欢迎提交 issue 和 pull request!请阅读 贡献指南。
许可证
本项目遵循 MIT 许可证 - 详情请查看 LICENSE 文件。
1 | ## 3. 在 Git 仓库中添加 README 文件 |
或者手动创建 README.md,然后编辑内容。
(2)提交 README 文件到 Git 仓库
1 | git add README.md |
4. 在 GitHub 创建 README
如果你的 GitHub 仓库还没有 README.md,可以:
- 进入 GitHub 仓库页面
- 点击 “Add a README”
- 编辑内容并点击 “Commit new file”
5. 总结
README.md是项目的重要文档,通常用于介绍项目用途、安装方法和使用方式。- 采用 Markdown 格式可以让 README 在 GitHub 显示得更美观。
- 在 Git 仓库中,可以手动创建 README,并通过
git add、git commit提交到远程仓库。
这样,项目的用户和贡献者可以更方便地了解和使用你的项目!
二十二git fetch命令
git fetch 是一个 从远程仓库获取最新更改但不合并到本地 的 Git 命令。它让你在不改变本地代码的情况下,先查看远程仓库的最新状态。
git fetch 作用
- 获取远程仓库的最新提交信息 (不会修改本地代码)。
- 允许你检查远程分支是否有更新,但不会自动合并。
- 可以在
git log或git diff中对比本地与远程的差异。
使用示例
基本用法
1 | git fetch |
- 拉取 所有远程分支 的最新信息,但不会自动合并。
- 你的本地代码不会受到影响,只是更新了远程分支的状态。
拉取指定远程仓库
1 | git fetch origin |
- 只从
origin远程仓库拉取最新信息。
拉取指定分支
1 | git fetch origin main |
- 仅获取
origin/main分支的最新信息。
查看本地与远程的差异
在 git fetch 之后,可以用以下命令检查变更:
1 | git log HEAD..origin/main --oneline |
- 显示本地
HEAD与远程main分支的差异(哪些提交是新的)。
或者:
1 | git diff HEAD origin/main |
- 显示代码的具体变更。
查看远程分支状态
1 | git remote show origin |
查看远程仓库的状态,特别是
本地分支是否落后于远程分支:
1
Local branch 'main' is behind 'origin/main' by 3 commits.

