十五、远程仓库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)创建远程仓库

  1. 登录 GitHub

  2. 点击右上角 “+” → New repository” 创建新仓库

  3. 不要勾选 “Initialize this repository with a README”(如果你已经有本地仓库)

  4. 复制 GitHub 提供的远程仓库地址,如:

    1
    2
    git@github.com:your-username/your-repo.git  (SSH 地址)
    https://github.com/your-username/your-repo.git (HTTPS 地址)

(3)添加远程仓库

1
2
3
git remote add origin git@github.com:your-username/your-repo.git  # 使用 SSH
# 或者
git remote add origin https://github.com/your-username/your-repo.git # 使用 HTTPS

检查远程仓库是否添加成功

1
git remote -v

如果成功,会显示:

1
2
origin  git@github.com:your-username/your-repo.git (fetch)
origin git@github.com:your-username/your-repo.git (push)

3. 推送本地代码到 GitHub

1
2
3
git add .
git commit -m "初始化项目"
git push -u origin main
  • -u 选项表示将本地 main 分支与远程 origin/main 关联,之后推送代码可以直接使用 git push

如果远程仓库默认分支不是 main,可以先查看远程默认分支:

1
git branch -r

然后推送到正确的分支,例如:

1
git push -u origin master

4. 从 GitHub 克隆远程仓库

如果你想在另一台设备或新的目录下获取远程仓库:

1
2
3
git clone git@github.com:your-username/your-repo.git  # SSH
# 或者
git clone https://github.com/your-username/your-repo.git # HTTPS

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
2
git checkout -b feature-branch  # 创建并切换到新分支
git push -u origin feature-branch # 推送新分支到 GitHub

(2)拉取远程分支

1
2
git fetch origin  # 获取远程所有分支
git checkout feature-branch # 切换到远程分支

(3)合并分支

1
git merge feature-branch

然后推送更新:

1
git push origin main

8. 贡献开源项目(Fork & Pull Request)

如果你想贡献别人的 GitHub 项目,通常需要:

  1. Fork 目标仓库
  2. Clone 你 Fork 的仓库到本地
  3. 创建新分支 进行修改
  4. 提交代码 并推送到你的 Fork 仓库
  5. 在 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 pushgit 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. 编辑冲突文件,保留需要的代码。

  2. 使用

    1
    git add

    标记已解决的文件:

    1
    git add <文件名>
  3. 提交更改:

    1
    git commit -m "解决合并冲突"

3. git pushgit pull 的区别

命令 作用
git push 将本地分支的代码推送到远程仓库
git pull 从远程仓库拉取最新代码并合并到本地

4. 常见错误及解决方法

(1)推送时报错:failed to push some refs to ...

原因:本地代码落后于远程仓库,需要先同步。
解决方法

1
2
git pull --rebase origin main  # 先拉取最新代码
git push origin main # 再推送

(2)拉取时报错:合并冲突(Merge Conflict)

解决方法

  1. 打开冲突文件,手动修改冲突部分。

  2. git add解决的文件:

    1
    git add <文件名>
  3. 重新提交:

    1
    git commit -m "解决合并冲突"

5. 总结

  • **git push**:把本地代码推送到远程仓库,让别人可以看到你的改动。
  • **git pull**:从远程仓库拉取最新代码,保持本地代码的更新。
  • **先 git pullgit push**,可以避免推送失败。

这样,团队协作时就能保证代码同步,不会相互覆盖。

十七、分支branch

Git 分支(Branch)是 Git 版本控制中的一项核心功能,它允许你在同一个仓库中并行开发,而不会影响主分支(mainmaster)。


1. 什么是分支?

  • 分支是 Git 维护的多个代码版本线,它们可以相互独立开发,并在需要时合并。
  • 默认分支 通常是 main(或 master)。
  • 分支的作用:
    • 并行开发新功能(feature)
    • 修复 bug 而不影响主分支
    • 进行实验性开发

2. 常用 Git 分支命令

(1)查看当前分支

1
git branch

示例输出:

1
2
3
* main
dev
feature-1

* 号表示当前所在的分支。

(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
2
git branch -d 分支名  # 正常删除
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
2
git checkout main
git merge feature-1

或(推荐):

1
2
git switch main
git merge feature-1

3. 远程分支

(1)查看远程分支

1
git branch -r

示例输出:

1
2
origin/main
origin/dev

(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 可能会提示冲突。解决方法:

  1. Git 会提示冲突的文件,你需要手动修改它们。即重新编辑冲突的文件中的内容,自行决定保留什么,删除什么。

  2. 使用 git add 标记已解决的文件:

    1
    git add 冲突文件
  3. 提交更改:

    1
    git commit -m "解决合并冲突"
  4. 终止合并:当不行继续执行合并操作时可以使用下面的命令来终止合并过程:

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 switchgit restore 来替代 checkout 的部分功能。


1. git checkout 的主要功能

git checkout 主要有两个用途:

  1. 切换分支
  2. 恢复文件

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
2
git checkout feature
git rebase main

或:

1
2
git switch feature
git rebase main

作用:

  • feature 分支会被“重新放置”到 main 分支的最新提交之后。
  • Git 会逐个feature 分支的提交应用到 main 的最新状态。

3. git merge vs git rebase

两者的区别可以用下面的场景说明:

(1)使用 git merge

1
2
git checkout feature
git merge main

结果:

  • feature 分支保留原来的提交历史。
  • 产生一个新的合并提交(merge commit)。

优点:不会破坏原分支的提交历史,方便回溯和查看。

缺点:会产生额外的提交节点,分支图比较复杂。

示例:

1
2
3
4
5
A---B---C (main)
\
D---E---F (feature)
\
M (merge commit)

(2)使用 git rebase

1
2
git checkout feature
git rebase main

结果:

  • feature 分支的提交会被重新应用到 main 之后。
  • 不会 产生 merge commit,历史记录会更线性。

优点:不会新增额外的提交记录,形成线性历史,比较直观和干净。

缺点:会改变提交历史,改变了当前分支branch out的节点。要避免在共享分支中使用。

示例:

1
2
3
A---B---C (main)
\
D'---E'---F' (feature, rebased)

其中 D', E', F'D, E, F 的重新应用版本。

总结:

方法 结果 适用场景
merge 生成一个 merge commit,保留完整的历史 适用于合并分支,保持历史完整
rebase 让分支历史线性化,提交“重新排列” 适用于清理提交历史,保持干净的提交树

4. git rebase 解决冲突

如果 rebase 过程中发生冲突,Git 会暂停 rebase 并提示你手动解决冲突:

  1. 按 Git 提示手动修改冲突文件

  2. 使用

    1
    git add

    标记已解决的文件:

    1
    git add 冲突文件
  3. 继续 rebase

    1
    git rebase --continue
  4. 如果想取消 rebase

    1
    git rebase --abort

5. 交互式 git rebase -i

如果你想修改提交历史,可以使用 **交互式 rebase**:

1
git rebase -i HEAD~3

这表示对最近 3 次提交进行修改,Git 会打开一个编辑器:

1
2
3
pick a1b2c3d 修复了一个 bug
pick d4e5f6g 增加了新功能
pick 7h8i9j0 修改了 README

你可以:

  • 修改提交消息(用 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 FlowGitHub FlowGitLab 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,确保版本稳定后合并到 maindevelop
  • hotfix 分支:直接从 main 创建,用于紧急修复线上 bug,修复后合并回 maindevelop

(2)GitHub Flow(适用于短周期敏捷开发)

适用场景:

  • 适用于 敏捷开发,比如 小型团队开源项目
  • 只维护 main 分支,开发分支是短期 feature 分支。

分支管理规则:

  1. main 分支是唯一的长期存在分支,保持可随时部署的状态。
  2. 所有新功能都基于 main 创建 feature 分支
  3. feature 开发完成后,创建 Pull Request(PR),经过代码审核后合并到 main
  4. main 经过 CI/CD 测试后自动部署。

(3)GitLab Flow(适用于持续集成 CI/CD)

适用场景:

  • 适用于 企业级项目,结合 CI/CD 自动化部署
  • main 之外,还维护 预发布分支(staging)生产分支(production)

分支管理规则:

  1. main 仍然是开发分支,不直接用于生产。
  2. feature 分支基于 main 创建,开发完成后合并回 main
  3. main 合并后,代码自动部署到 staging 进行测试。
  4. 通过 git tag 标记版本,然后部署到 production

3. 如何选择合适的工作流?

工作流 适用场景 优点 缺点
Git Flow 适用于大型团队和长周期开发 结构清晰,适合复杂项目 分支较多,管理成本较高
GitHub Flow 适用于小型团队和开源项目 简单直接,适合短周期开发 需要高质量的代码评审
GitLab Flow 适用于企业 CI/CD 自动化 适配 DevOps,可快速部署 需要良好的 CI/CD 流程支持

4. 分支命名

推荐使用带有意义的描述性名称来命名分支。

  1. 版本发布分支/Tag示例: v1.0.0
  2. 功能分支示例:feature-login-page
  3. 修复分支示例:hotfix-#issueid-desc

5.分支管理

  1. 定期合并已经成功验证的分支,及时删除已经合并的分支
  2. 保持合适的分支数量
  3. 为分支设置合适的管理权限

二十一、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
2
3
4
5
6
7
8
9
10
11
12
# 项目名称
一个简短的项目介绍。

## 功能
- 功能 1
- 功能 2
- 功能 3

## 安装方法
1. 克隆项目:
```bash
git clone https://github.com/yourname/yourproject.git
  1. 进入项目目录:

    1
    cd yourproject
  2. 安装依赖(示例,具体根据项目而定):

    1
    npm install

使用方法

运行项目:

1
npm start

贡献

欢迎提交 issue 和 pull request!请阅读 贡献指南

许可证

本项目遵循 MIT 许可证 - 详情请查看 LICENSE 文件。

1
2
3
4
5
## 3. 在 Git 仓库中添加 README 文件
### (1)创建 README 文件
在终端执行:
```bash
echo "# 项目名称" > README.md

或者手动创建 README.md,然后编辑内容。

(2)提交 README 文件到 Git 仓库

1
2
3
git add README.md
git commit -m "添加 README 文件"
git push origin main

4. 在 GitHub 创建 README

如果你的 GitHub 仓库还没有 README.md,可以:

  1. 进入 GitHub 仓库页面
  2. 点击 “Add a README”
  3. 编辑内容并点击 “Commit new file”

5. 总结

  • README.md 是项目的重要文档,通常用于介绍项目用途、安装方法和使用方式。
  • 采用 Markdown 格式可以让 README 在 GitHub 显示得更美观。
  • 在 Git 仓库中,可以手动创建 README,并通过 git addgit commit 提交到远程仓库。

这样,项目的用户和贡献者可以更方便地了解和使用你的项目!

二十二git fetch命令

git fetch 是一个 从远程仓库获取最新更改但不合并到本地 的 Git 命令。它让你在不改变本地代码的情况下,先查看远程仓库的最新状态。


git fetch 作用

  • 获取远程仓库的最新提交信息 (不会修改本地代码)
  • 允许你检查远程分支是否有更新,但不会自动合并。
  • 可以在 git loggit 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.