Git团队协作完全入门指南(下)

Git团队协作完全入门指南(下)

第八章:GitHub完全指南

GitHub是全球最大的代码托管平台,几乎所有开发者都在用它。让我们详细学习如何使用GitHub。

8.1 注册GitHub账号

步骤1:访问GitHub

打开浏览器,访问 https://github.com

步骤2:注册

  1. 点击右上角的 "Sign up"(注册)按钮
  2. 输入你的邮箱地址
  3. 创建密码(至少8个字符)
  4. 输入用户名(这个用户名会出现在你的GitHub网址里,比如 github.com/你的用户名
  5. 选择是否接收营销邮件(建议选No)
  6. 完成人机验证(点图片之类的)
  7. 点击 "Create account"
  8. 查看邮箱,点击验证链接

步骤3:完善个人资料(可选)

  1. 登录后,点击右上角头像
  2. 选择 "Settings"
  3. 在 "Profile" 里可以添加:
    • 头像
    • 个人简介
    • 所在地
    • 网站链接等

8.2 创建远程仓库

步骤1:创建新仓库

  1. 登录GitHub
  2. 点击右上角的 +
  3. 选择 "New repository"(新建仓库)

步骤2:填写仓库信息

你会看到一个表单,让我们逐项填写:

  • Repository name(仓库名称) :给你的项目起个名字
    • 只能包含字母、数字、连字符和下划线
    • 例如:my-awesome-project
  • Description(描述) :简短描述这个项目是干什么的(可选)
    • 例如:"我的第一个Git练习项目"
  • Public or Private(公开还是私有)
    • Public(公开):任何人都能看到这个仓库(代码是开源的)
    • Private(私有):只有你和你指定的人能看到
    • 对于学习项目,选Public或Private都可以
  • Initialize this repository with(初始化选项)
    • Add a README file:是否创建README文件(建议勾选)
    • Add .gitignore:选择一个.gitignore模板(如果是网页项目,选"Node")
    • Choose a license:选择开源协议(学习项目可以不选)

步骤3:创建

点击绿色的 "Create repository" 按钮。

恭喜!你的第一个GitHub仓库创建好了!

8.3 连接本地仓库和GitHub

现在你有了:

  • 本地的Git仓库(在你电脑上)
  • GitHub的远程仓库(在服务器上)

我们要把它们连接起来。

情况1:你已经有了本地仓库

假设你之前创建了 my-first-project 这个本地仓库,现在要上传到GitHub。

步骤1:在GitHub创建仓库

按照上面的步骤,创建一个名为 my-first-project 的仓库。 注意:不要勾选"Initialize this repository with"下的任何选项!

步骤2:GitHub会给你提示

创建完成后,GitHub会显示一个页面,上面有一些命令。找到 "...or push an existing repository from the command line" 这部分,会有类似这样的命令:

bash 复制代码
git remote add origin https://github.com/你的用户名/my-first-project.git
git branch -M main
git push -u origin main

步骤3:在本地执行这些命令

在你的项目文件夹里,打开命令行,执行:

bash 复制代码
# 添加远程仓库地址
git remote add origin https://github.com/你的用户名/my-first-project.git

# 确保分支名是main(如果已经是main就跳过这步)
git branch -M main

# 推送到GitHub
git push -u origin main

详细解释:

  • git remote add origin URL
    • remote:远程仓库
    • add:添加
    • origin:给远程仓库起的名字(习惯上叫origin,你也可以改成别的)
    • URL:远程仓库的地址
  • git branch -M main
    • 把当前分支重命名为main(老版本Git默认是master,新版本是main)
  • git push -u origin main
    • push:推送(上传)
    • -u:设置上游分支(以后直接git push就行了)
    • origin:远程仓库的名字
    • main:推送的分支名

步骤4:输入账号密码

第一次推送时,会要求你输入GitHub的用户名和密码。

重要提示(2021年后的变化): GitHub已经不支持用密码来push代码了!你需要使用 Personal Access Token(个人访问令牌)

如何创建Personal Access Token:

  1. 登录GitHub
  2. 点击右上角头像 → Settings
  3. 左侧菜单最下面 → Developer settings
  4. Personal access tokens → Tokens (classic)
  5. Generate new token → Generate new token (classic)
  6. 填写:
    • Note(备注):比如"我的电脑"
    • Expiration(过期时间):选择一个时间,或选No expiration(永不过期)
    • Select scopes(权限):勾选repo(完全控制仓库)
  7. 点击 "Generate token"
  8. 复制这个token并保存好! 它只显示一次,以后就看不到了

以后push时,用户名输入你的GitHub用户名,密码输入这个token。

或者使用SSH密钥(更方便,推荐!)

SSH方式不需要每次输入密码,配置方法稍后会讲。

步骤5:查看GitHub

刷新GitHub页面,你会看到你的代码已经上传了!

情况2:从GitHub克隆项目

如果你要加入一个已有的GitHub项目:

bash 复制代码
# 进入你想存放项目的文件夹
cd ~/Desktop

# 克隆项目
git clone https://github.com/用户名/项目名.git

# 进入项目文件夹
cd 项目名

一个命令就搞定了!

8.4 推送(Push)和拉取(Pull)

推送(Push):上传你的修改

当你在本地做了新的提交,想上传到GitHub:

bash 复制代码
git push origin main

如果你之前用了 -u 参数设置了上游分支,可以简写为:

bash 复制代码
git push

推送的完整流程:

bash 复制代码
# 1. 修改文件
echo "新内容" >> README.md

# 2. 添加到暂存区
git add README.md

# 3. 提交
git commit -m "更新README"

# 4. 推送到GitHub
git push
拉取(Pull):下载最新的修改

当你的队友更新了GitHub上的代码,你想下载最新版本:

bash 复制代码
git pull

Pull做了什么?

  • 从GitHub下载最新的提交
  • 自动合并到你的当前分支
  • 如果有冲突,会提示你解决

建议:每天开始工作前先pull一下!

bash 复制代码
git pull

这样可以避免很多冲突。

Fetch:只下载不合并

如果你想先看看远程有什么更新,但不立即合并:

bash 复制代码
git fetch origin

这会下载更新,但不会影响你的工作区。然后你可以:

bash 复制代码
git log origin/main    # 查看远程的提交历史
git diff origin/main   # 查看和远程的区别
git merge origin/main  # 决定合并

8.5 配置SSH密钥(推荐!)

使用SSH方式可以避免每次都输入密码,非常方便。

步骤1:检查是否已有SSH密钥
bash 复制代码
ls -al ~/.ssh

如果看到 id_rsa.pubid_ed25519.pub 文件,说明已经有了,可以跳到步骤3。

步骤2:生成SSH密钥
bash 复制代码
ssh-keygen -t ed25519 -C "你的邮箱@example.com"

说明:

  • 如果你的系统不支持ed25519算法,用:ssh-keygen -t rsa -b 4096 -C "你的邮箱"

按回车,会提示:

复制代码
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

直接按回车(使用默认路径)。

然后提示:

复制代码
Enter passphrase (empty for no passphrase):

可以输入一个密码(更安全),也可以直接按回车(不设密码)。

再按一次回车确认。

密钥生成完成!

步骤3:复制公钥
bash 复制代码
cat ~/.ssh/id_ed25519.pub

你会看到一长串以 ssh-ed25519 开头的文字。全选并复制它。

或者(Mac):

bash 复制代码
pbcopy < ~/.ssh/id_ed25519.pub

这会自动复制到剪贴板。

步骤4:添加到GitHub
  1. 登录GitHub
  2. 点击右上角头像 → Settings
  3. 左侧菜单 → SSH and GPG keys
  4. 点击 "New SSH key"
  5. Title(标题):给这个密钥起个名字,比如"我的MacBook"
  6. Key(密钥):粘贴刚才复制的内容
  7. 点击 "Add SSH key"
步骤5:测试连接
bash 复制代码
ssh -T git@github.com

第一次连接会提示:

复制代码
The authenticity of host 'github.com (...)' can't be established.
Are you sure you want to continue connecting (yes/no)?

输入 yes,按回车。

如果看到:

复制代码
Hi 你的用户名! You've successfully authenticated...

说明成功了!

步骤6:更换仓库地址为SSH

如果你的仓库之前用的是HTTPS地址,现在要换成SSH:

bash 复制代码
# 查看当前的远程地址
git remote -v

# 更换为SSH地址
git remote set-url origin git@github.com:你的用户名/仓库名.git

以后push和pull就不需要输入密码了!

8.6 GitHub的重要功能

README文件

README.md是项目的"门面",告诉别人你的项目是干什么的。

好的README应该包含:

  • 项目标题和简短描述
  • 安装方法
  • 使用方法
  • 示例
  • 贡献指南(如果是开源项目)

Markdown语法速查:

markdown 复制代码
# 一级标题
## 二级标题
### 三级标题

**粗体**
*斜体*

- 列表项1
- 列表项2

1. 有序列表1
2. 有序列表2

[链接文字](https://example.com)

![图片描述](图片URL)

```代码块```
Issues(问题跟踪)

Issues用来记录bug、任务、功能需求等。

创建Issue:

  1. 在仓库页面点击 "Issues" 标签
  2. 点击 "New issue"
  3. 填写标题和描述
  4. 可以:
    • 指派给某人(Assignees)
    • 添加标签(Labels):bug、enhancement、question等
    • 设置里程碑(Milestones)
  5. 点击 "Submit new issue"

关闭Issue:

  • 在Issue页面点击 "Close issue"
  • 或者在提交信息里写 fix #1(关闭编号为1的issue)
Pull Request(PR)

Pull Request是GitHub协作的核心,用于代码审查。

什么是Pull Request?

想象你要给朋友的小说提意见:

  • 你复制了一份他的小说(fork)
  • 你在副本上做了修改
  • 你把修改后的内容发给他,请他审查(pull request)
  • 他觉得你的修改不错,就采纳了(merge)

创建Pull Request:

  1. 在你的分支上完成开发并push到GitHub
bash 复制代码
git push origin feature-login
  1. 访问GitHub仓库页面,会看到提示:

    feature-login had recent pushes less than a minute ago
    [Compare & pull request]

  2. 点击 "Compare & pull request" 按钮

  3. 填写PR信息:

    • 标题:简短描述这次修改
    • 描述:详细说明做了什么,为什么这样做
    • 可以@某人请他审查
    • 可以链接相关Issue(如"Closes #5")
  4. 点击 "Create pull request"

审查Pull Request:

作为审查者,你可以:

  • 查看代码变更
  • 在代码行上添加评论
  • 提出修改建议
  • 批准(Approve)或请求修改(Request changes)

合并Pull Request:

审查通过后,点击 "Merge pull request" 按钮。有三种合并方式:

  • Merge commit:保留所有提交历史
  • Squash and merge:把多个提交合并成一个
  • Rebase and merge:重新应用提交

新手推荐用默认的 "Merge commit"。

Fork(分叉)

Fork是GitHub的特色功能,用于给别人的项目做贡献。

什么是Fork?

想象你看到一个很棒的开源项目,你想改进它:

  1. Fork:在GitHub上"复制"一份到你的账号下
  2. Clone:把你账号下的版本克隆到本地
  3. 修改:在本地做修改
  4. Push:推送到你账号下的版本
  5. Pull Request:向原项目提交你的修改

操作步骤:

  1. 访问你想贡献的项目
  2. 点击右上角的 "Fork" 按钮
  3. 选择你的账号(会复制一份到你的账号下)
  4. 克隆到本地:
bash 复制代码
git clone https://github.com/你的用户名/项目名.git
  1. 做修改,提交,push
  2. 在GitHub上创建Pull Request到原项目
Star(星标)和 Watch(关注)
  • Star:给项目点赞,表示你喜欢这个项目
  • Watch:关注项目,有更新时会通知你

第九章:团队协作完整流程

现在让我们把所有知识串起来,看看一个真实团队是如何协作的。

9.1 团队成员角色

一个典型的团队:

  • 项目负责人(Maintainer):管理整个项目,审查PR,决定合并
  • 开发者(Developer):开发新功能,修复bug
  • 贡献者(Contributor):偶尔贡献代码的外部人员

9.2 标准工作流程(完整版)

作为新成员加入项目

第1步:获取项目权限

项目负责人需要把你加入GitHub仓库:

  1. 仓库页面 → Settings → Collaborators
  2. 添加你的GitHub用户名

你会收到邮件邀请,点击接受。

第2步:克隆项目

bash 复制代码
# 克隆项目到本地
git clone https://github.com/团队/项目名.git

# 进入项目文件夹
cd 项目名

# 查看分支
git branch -a

第3步:了解项目结构

阅读README文件,了解:

  • 项目是干什么的
  • 如何运行项目
  • 代码结构是什么样的
  • 有什么开发规范
开始开发新功能

第1步:确保代码是最新的

bash 复制代码
# 切换到主分支
git checkout main

# 拉取最新代码
git pull origin main

重要:每次开始新功能前都要pull,确保基于最新代码!

第2步:创建功能分支

bash 复制代码
# 创建并切换到新分支
git checkout -b feature/user-profile

# 或者按照团队规范命名,比如:
# git checkout -b feature/你的名字-功能描述

第3步:开发功能

在你的分支上自由开发:

bash 复制代码
# 修改文件...

# 经常提交(每完成一个小功能就提交)
git add .
git commit -m "添加用户头像上传功能"

# 继续修改...
git add .
git commit -m "添加头像裁剪功能"

# 继续修改...
git add .
git commit -m "添加头像预览功能"

小提示

  • 每个提交应该是一个"原子性"的修改(一个完整的小功能)
  • 提交信息要清楚
  • 经常提交,不要攒一大堆修改

第4步:推送到GitHub

bash 复制代码
git push origin feature/user-profile

第一次推送这个分支可能会提示:

复制代码
fatal: The current branch feature/user-profile has no upstream branch.

按照提示执行:

bash 复制代码
git push --set-upstream origin feature/user-profile

或者简写:

bash 复制代码
git push -u origin feature/user-profile

第5步:同步主分支的更新

如果开发时间比较长(比如几天),主分支可能已经有了新的提交。你需要把这些更新合并到你的分支:

bash 复制代码
# 确保主分支是最新的
git checkout main
git pull origin main

# 回到你的分支
git checkout feature/user-profile

# 把主分支的更新合并进来
git merge main

如果有冲突,解决冲突(参考第七章)。

或者使用rebase(进阶):

bash 复制代码
git rebase main

Rebase会让提交历史更清晰,但对新手来说merge更安全。

第6步:创建Pull Request

功能开发完成后:

  1. 访问GitHub仓库

  2. 会看到黄色提示框,点击 "Compare & pull request"

  3. 填写PR信息:

    • 标题:简洁明了,如"添加用户头像功能"

    • 描述:

      复制代码
      ## 这个PR做了什么?- 添加了头像上传功能- 添加了头像裁剪功能- 添加了头像预览功能## 测试- [x] 本地测试通过- [x] 上传头像正常- [x] 裁剪功能正常## 截图(如果是UI改动,贴上截图)Closes #15  (如果解决了某个Issue)
  4. 选择审查者(Reviewers)

  5. 点击 "Create pull request"

第7步:等待审查

队友会审查你的代码,可能会:

  • 提出修改建议
  • 要求你修改某些地方
  • 批准你的PR

如果需要修改:

bash 复制代码
# 在你的分支上继续修改
git checkout feature/user-profile

# 修改文件...
git add .
git commit -m "根据审查意见修复问题"

# 推送
git push origin feature/user-profile

GitHub会自动更新你的PR。

第8步:合并

审查通过后,负责人会点击 "Merge pull request" 按钮。你的代码就进入主分支了!

第9步:清理

合并后,清理本地分支:

bash 复制代码
# 切回主分支
git checkout main

# 拉取最新代码(包含你刚合并的功能)
git pull origin main

# 删除功能分支
git branch -d feature/user-profile

# 删除远程分支(GitHub上会自动删除,但也可以手动删)
git push origin --delete feature/user-profile

完整流程结束!

9.3 日常工作习惯

每天开始工作:

bash 复制代码
git checkout main
git pull origin main
git checkout -b feature/今天要做的功能

开发过程中(每隔1-2小时):

bash 复制代码
git add .
git commit -m "完成了某个小功能"
git push origin feature/今天要做的功能

每天结束工作:

bash 复制代码
# 确保所有修改都提交和推送了
git status  # 应该显示"working tree clean"
git push origin feature/今天要做的功能

功能完成时:

bash 复制代码
# 同步主分支
git checkout main
git pull origin main
git checkout feature/今天要做的功能
git merge main

# 推送并创建PR
git push origin feature/今天要做的功能
# 然后去GitHub创建Pull Request

9.4 常见协作场景

场景1:同时开发不同功能

情况

  • 你在开发"用户登录"功能
  • 同事在开发"商品搜索"功能

解决方案

  • 各自创建自己的分支

  • 互不干扰地开发

  • 完成后分别创建PR

  • 依次合并到主分支

    main: o---o---o-------o-------o
    \ / /
    feature-login: o---o---o /
    \ /
    feature-search: o---o---o---o

场景2:依赖别人的功能

情况

  • 同事小王在开发"用户认证"模块
  • 你的"个人中心"功能依赖他的认证模块

解决方案

  • 等小王完成并合并到main
  • 你从最新的main创建分支
  • 或者从小王的分支创建分支(不推荐)
bash 复制代码
# 等小王合并后
git checkout main
git pull origin main
git checkout -b feature/user-center
场景3:紧急修复线上bug

情况

  • 你正在开发新功能(还没完成)
  • 突然发现线上有个紧急bug需要修复

解决方案

bash 复制代码
# 1. 暂存当前工作
git stash

# 2. 切到主分支创建hotfix分支
git checkout main
git pull origin main
git checkout -b hotfix/紧急bug描述

# 3. 修复bug
# 修改文件...
git add .
git commit -m "修复紧急bug"
git push origin hotfix/紧急bug描述

# 4. 创建PR并快速合并

# 5. 回到你的功能分支
git checkout feature/你的功能
git stash pop  # 恢复之前的工作

# 6. 合并hotfix的修复
git merge main

git stash的详细说明:

bash 复制代码
git stash              # 暂存当前修改
git stash list         # 查看暂存列表
git stash pop          # 恢复最近的暂存并删除
git stash apply        # 恢复暂存但不删除
git stash drop         # 删除暂存
git stash clear        # 清空所有暂存

第十章:Git常用命令速查

这里整理了最常用的Git命令,建议打印出来贴在电脑旁!

10.1 基础操作

bash 复制代码
# 初始化仓库
git init

# 克隆仓库
git clone <url>

# 查看状态
git status

# 查看修改内容
git diff                    # 查看工作区和暂存区的区别
git diff --staged           # 查看暂存区和版本库的区别
git diff HEAD              # 查看工作区和版本库的区别

# 添加文件到暂存区
git add <file>              # 添加单个文件
git add .                   # 添加所有修改(最常用!)
git add *.js                # 添加所有js文件

# 提交
git commit -m "提交信息"     # 提交暂存区的内容
git commit -am "提交信息"    # 添加并提交(仅对已跟踪文件有效)
git commit --amend          # 修改最后一次提交

# 查看历史
git log                     # 查看详细历史
git log --oneline           # 查看简洁历史
git log --graph             # 查看分支图
git log --all --graph --oneline  # 查看所有分支的图形历史

10.2 分支操作

bash 复制代码
# 查看分支
git branch                  # 查看本地分支
git branch -a               # 查看所有分支(含远程)
git branch -r               # 只看远程分支

# 创建分支
git branch <分支名>          # 创建分支
git checkout -b <分支名>     # 创建并切换(旧方式)
git switch -c <分支名>       # 创建并切换(新方式)

# 切换分支
git checkout <分支名>        # 切换分支(旧方式)
git switch <分支名>          # 切换分支(新方式)

# 合并分支
git merge <分支名>           # 合并指定分支到当前分支

# 删除分支
git branch -d <分支名>       # 删除本地分支(安全删除)
git branch -D <分支名>       # 强制删除本地分支
git push origin --delete <分支名>  # 删除远程分支

10.3 远程操作

bash 复制代码
# 查看远程仓库
git remote                  # 查看远程仓库名称
git remote -v               # 查看远程仓库地址

# 添加远程仓库
git remote add origin <url>

# 修改远程仓库地址
git remote set-url origin <new-url>

# 拉取和推送
git fetch origin            # 下载远程更新但不合并
git pull origin main        # 拉取并合并
git pull                    # 拉取当前分支
git push origin main        # 推送到远程
git push                    # 推送当前分支
git push -u origin main     # 首次推送并设置上游分支

# 查看远程分支
git branch -r

10.4 撤销操作

bash 复制代码
# 撤销工作区的修改
git checkout -- <file>      # 恢复单个文件
git checkout -- .           # 恢复所有文件
git restore <file>          # 恢复文件(新命令)

# 撤销暂存区的修改(不删除工作区的修改)
git reset HEAD <file>       # 取消暂存单个文件
git restore --staged <file> # 取消暂存(新命令)

# 撤销提交
git reset --soft HEAD~1     # 撤销提交,保留修改在暂存区
git reset --mixed HEAD~1    # 撤销提交,保留修改在工作区(默认)
git reset --hard HEAD~1     # 撤销提交,删除所有修改(危险!)

# 回退到指定版本
git reset --hard <commit-id>  # 回退到指定提交(危险!)
git revert <commit-id>       # 创建新提交来撤销指定提交(安全)

10.5 暂存操作

bash 复制代码
# 暂存当前修改
git stash
git stash save "暂存说明"

# 查看暂存列表
git stash list

# 恢复暂存
git stash pop               # 恢复最近的暂存并删除
git stash apply            # 恢复暂存但不删除
git stash apply stash@{0}  # 恢复指定暂存

# 删除暂存
git stash drop stash@{0}   # 删除指定暂存
git stash clear            # 清空所有暂存

10.6 标签操作

bash 复制代码
# 创建标签
git tag v1.0.0              # 创建轻量标签
git tag -a v1.0.0 -m "版本1.0.0"  # 创建附注标签

# 查看标签
git tag                     # 列出所有标签
git show v1.0.0            # 查看标签详情

# 推送标签
git push origin v1.0.0     # 推送单个标签
git push origin --tags     # 推送所有标签

# 删除标签
git tag -d v1.0.0          # 删除本地标签
git push origin --delete v1.0.0  # 删除远程标签

10.7 配置相关

bash 复制代码
# 用户配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

# 查看配置
git config --list           # 查看所有配置
git config user.name       # 查看某项配置

# 设置默认编辑器
git config --global core.editor "code --wait"  # VSCode
git config --global core.editor "vim"          # Vim

# 设置别名
git config --global alias.st status     # git st = git status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit

第十一章:常见问题和解决方案

11.1 提交相关问题

问题1:提交了错误的文件

场景:不小心把不该提交的文件(如密码文件)提交了。

解决方案

如果还没push:

bash 复制代码
# 撤销最后一次提交,保留修改
git reset --soft HEAD~1

# 移除不该提交的文件
git reset HEAD 错误文件.txt

# 重新提交
git add .
git commit -m "正确的提交"

如果已经push:

bash 复制代码
# 删除文件
git rm 错误文件.txt

# 提交删除
git commit -m "删除错误提交的文件"

# 推送
git push

注意:即使删除了,文件内容仍然在历史记录里!如果是密码等敏感信息,需要修改密码。

问题2:提交信息写错了

场景:提交信息有错别字或描述不准确。

解决方案

如果还没push:

bash 复制代码
# 修改最后一次提交的信息
git commit --amend -m "正确的提交信息"

如果已经push:

  • 最好不要修改已推送的提交
  • 如果必须修改,会很麻烦且可能影响其他人
  • 建议就让它这样吧,下次注意
问题3:忘记添加文件到提交

场景:提交后发现漏了一个文件。

解决方案

如果还没push:

bash 复制代码
# 添加漏掉的文件
git add 漏掉的文件.txt

# 追加到上次提交
git commit --amend --no-edit

--no-edit 表示不修改提交信息。

问题4:提交了太多次,想合并提交

场景:你提交了10次小修改,想合并成1次提交。

解决方案(使用rebase):

bash 复制代码
# 交互式rebase最近的10次提交
git rebase -i HEAD~10

会打开编辑器,显示:

复制代码
pick a3f5d9c 提交1
pick b7d8a2f 提交2
pick c9e6f1d 提交3
...

把第2次及以后的 pick 改成 squashs

复制代码
pick a3f5d9c 提交1
squash b7d8a2f 提交2
squash c9e6f1d 提交3
...

保存退出,Git会让你编辑合并后的提交信息。

注意:不要rebase已经push的提交!

11.2 分支相关问题

问题5:切换分支时提示有未提交的修改

场景

复制代码
error: Your local changes to the following files would be overwritten by checkout

解决方案1:提交修改

bash 复制代码
git add .
git commit -m "临时提交"

解决方案2:暂存修改

bash 复制代码
git stash
git checkout 其他分支
# 回来后恢复
git checkout 原分支
git stash pop

解决方案3:放弃修改

bash 复制代码
git checkout -- .
git checkout 其他分支
问题6:删除了不该删的分支

场景:不小心删除了还需要的分支。

解决方案

如果刚删除,可以找回:

bash 复制代码
# 查看所有操作记录
git reflog

# 找到那个分支最后的commit id
# 然后创建新分支指向它
git checkout -b 分支名 <commit-id>
问题7:合并冲突后不知道怎么办

场景:执行merge后出现冲突,不知道如何继续。

解决方案

查看冲突状态:

bash 复制代码
git status

会列出冲突的文件,打开它们,手动解决冲突(参考第七章)。

如果实在解决不了,放弃合并:

bash 复制代码
git merge --abort

如果已经解决了冲突:

bash 复制代码
git add 冲突文件.txt
git commit -m "解决合并冲突"

11.3 远程操作问题

问题8:push被拒绝

错误信息

复制代码
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/...'

原因:远程有你本地没有的提交。

解决方案

bash 复制代码
# 先拉取远程更新
git pull origin main

# 如果有冲突,解决冲突

# 再推送
git push origin main
问题9:push需要密码但记不住

场景:每次push都要输入用户名和密码。

解决方案:配置SSH密钥(参考第八章8.5节)。

或者使用credential helper:

bash 复制代码
# 存储密码
git config --global credential.helper store

# Mac用户
git config --global credential.helper osxkeychain

# Windows用户
git config --global credential.helper wincred
问题10:错误的远程地址

场景:添加了错误的远程仓库地址。

解决方案

bash 复制代码
# 查看当前远程地址
git remote -v

# 修改地址
git remote set-url origin 正确的地址

# 或者删除后重新添加
git remote remove origin
git remote add origin 正确的地址

11.4 文件操作问题

问题11:想忽略已经提交的文件

场景:忘记添加.gitignore,已经提交了不该提交的文件。

解决方案

bash 复制代码
# 1. 创建或编辑.gitignore,添加要忽略的文件

# 2. 从Git中删除文件(但保留本地文件)
git rm --cached 要忽略的文件.txt

# 3. 提交
git commit -m "停止跟踪某文件"

# 4. 推送
git push
问题12:误删了文件想恢复

场景:删除了文件,还没提交。

解决方案

bash 复制代码
# 恢复文件
git checkout -- 文件名.txt

场景:删除并提交了。

解决方案

bash 复制代码
# 查看历史,找到删除前的commit id
git log -- 文件名.txt

# 恢复文件
git checkout <commit-id> -- 文件名.txt

# 提交
git add 文件名.txt
git commit -m "恢复误删的文件"
问题13:大文件提交失败

错误信息

复制代码
remote: error: File 大文件.zip is 150.00 MB; this exceeds GitHub's file size limit of 100.00 MB

解决方案

从提交中移除大文件:

bash 复制代码
# 撤销提交
git reset --soft HEAD~1

# 移除大文件
git reset HEAD 大文件.zip

# 添加到.gitignore
echo "大文件.zip" >> .gitignore

# 重新提交
git add .
git commit -m "移除大文件"

建议:大文件应该:

  • 不要提交到Git
  • 使用Git LFS(Large File Storage)
  • 放到云存储服务

11.5 协作问题

问题14:不小心在main分支上开发了

场景:忘记创建功能分支,直接在main上写代码了。

解决方案(如果还没提交):

bash 复制代码
# 暂存当前修改
git stash

# 创建新分支
git checkout -b feature/我的功能

# 恢复修改
git stash pop

# 正常提交
git add .
git commit -m "完成功能"

解决方案(如果已经提交但没push):

bash 复制代码
# 创建新分支(会带着当前的提交)
git checkout -b feature/我的功能

# 回退main分支
git checkout main
git reset --hard origin/main
问题15:队友的分支合并后出现问题

场景:队友的代码合并到main后,导致项目无法运行。

解决方案

临时回退main:

bash 复制代码
# 查看提交历史
git log --oneline

# 回退到出问题前的提交
git reset --hard <出问题前的commit-id>

# 强制推送(危险!最好和团队商量)
git push -f origin main

更好的做法:

bash 复制代码
# 使用revert创建新提交来撤销
git revert <有问题的commit-id>
git push origin main

revert的好处是不会改写历史,更安全。


第十二章:最佳实践和进阶技巧

12.1 提交最佳实践

提交信息规范

好的提交信息应该:

  • 第一行:简短的标题(50字符以内)
  • 空一行
  • 详细描述(如果需要)

规范格式:

复制代码
类型: 简短描述

详细说明(可选)

相关Issue(可选)

常用类型:

  • feat: 新功能
  • fix: 修复bug
  • docs: 文档修改
  • style: 代码格式(不影响代码运行)
  • refactor: 重构
  • test: 添加测试
  • chore: 构建过程或辅助工具的变动

例子:

复制代码
feat: 添加用户登录功能

- 实现用户名/密码登录
- 添加登录表单验证
- 集成JWT token认证

Closes #23
提交频率
  • 太频繁:每改一个字就提交 ❌
  • 太少:一周就一次提交 ❌
  • 刚刚好:每完成一个小功能就提交 ✅

建议

  • 每1-2小时提交一次
  • 每完成一个独立的小功能提交一次
  • 下班前提交一次
  • 提交前测试一下,确保代码能运行
原子性提交

每次提交应该是一个"原子性"的修改:

  • 只做一件事
  • 可以独立理解
  • 可以独立回退

❌ 不好的例子:

复制代码
git commit -m "修改了登录、注册、个人中心,修复了3个bug,更新了文档"

✅ 好的例子:

复制代码
git commit -m "添加用户登录功能"
git commit -m "添加用户注册功能"
git commit -m "修复登录按钮无响应问题"

12.2 分支管理最佳实践

Git Flow工作流

这是一个流行的分支管理策略:

复制代码
main (或 master)      ← 生产环境,随时可发布
  |
develop               ← 开发主分支
  |\
  | feature-a         ← 功能分支
  | feature-b
  |
  release-1.0         ← 发布准备分支
  |
  hotfix-urgent       ← 紧急修复分支

分支说明:

  • main: 生产环境代码,只能从release或hotfix合并
  • develop: 开发主分支,所有功能开发的基础
  • feature/*: 功能分支,从develop创建,完成后合并回develop
  • release/*: 发布准备分支,从develop创建,准备好后合并到main和develop
  • hotfix/*: 紧急修复分支,从main创建,修复后合并到main和develop
简化的分支策略(推荐新手)
复制代码
main                  ← 主分支,稳定版本
  |\
  | feature-login     ← 功能分支
  | feature-payment
  |
  hotfix-bug          ← 修复分支

只需要:

  • main: 主分支
  • feature/*: 功能分支
  • hotfix/*: 修复分支

12.3 代码审查(Code Review)

为什么需要代码审查?
  • 发现潜在的bug
  • 保持代码质量
  • 分享知识
  • 统一代码风格
  • 减少技术债务
如何做好代码审查?

作为提交者:

  1. 提交前自己先审查一遍
  2. PR描述清楚做了什么、为什么这样做
  3. 代码要有注释
  4. 虚心接受建议

作为审查者:

  1. 及时审查(不要让PR等太久)
  2. 提出建设性的意见
  3. 先表扬优点,再指出问题
  4. 用疑问句代替命令句:"这里是否可以..."
Pull Request的描述模板
markdown 复制代码
## 改动说明
简要描述这个PR做了什么

## 改动原因
为什么需要这个改动?解决了什么问题?

## 改动内容
- 添加了XX功能
- 修改了YY模块
- 删除了ZZ代码

## 测试
- [ ] 单元测试通过
- [ ] 手动测试通过
- [ ] 在不同浏览器测试

## 截图(如果有UI改动)
贴上改动前后的截图

## 相关Issue
Closes #123
Related to #456

12.4 效率提升技巧

使用别名

创建Git命令的快捷方式:

bash 复制代码
# 在~/.gitconfig中添加
[alias]
    st = status
    co = checkout
    br = branch
    ci = commit
    lg = log --graph --oneline --all
    last = log -1 HEAD
    uncommit = reset --soft HEAD~1
    unstage = reset HEAD

使用:

bash 复制代码
git st      # 相当于 git status
git co main # 相当于 git checkout main
git lg      # 查看图形化历史
使用图形化工具

命令行不习惯?试试这些GUI工具:

  • GitHub Desktop:简单易用,适合新手
  • SourceTree:功能强大
  • GitKraken:界面美观
  • VSCode内置Git:编辑器集成
使用.gitignore模板

GitHub提供了各种语言的.gitignore模板: https://github.com/github/gitignore

比如Node.js项目的.gitignore:

复制代码
node_modules/
.env
.DS_Store
*.log
dist/
build/
设置全局.gitignore

有些文件在所有项目中都不想提交:

bash 复制代码
# 创建全局gitignore文件
touch ~/.gitignore_global

# 配置Git使用它
git config --global core.excludesfile ~/.gitignore_global

~/.gitignore_global中添加:

复制代码
# macOS
.DS_Store
.AppleDouble
.LSOverride

# Windows
Thumbs.db
Desktop.ini

# 编辑器
.vscode/
.idea/
*.swp
*.swo

# 其他
.env.local
.env

12.5 团队协作技巧

每天的例行工作

早上到公司:

bash 复制代码
git checkout main
git pull origin main
git checkout -b feature/今天的功能

开发过程中(每隔1-2小时):

bash 复制代码
git add .
git commit -m "完成了XX"
git push origin feature/今天的功能

下班前:

bash 复制代码
git status          # 确认没有未提交的修改
git push            # 确保代码已上传
沟通最佳实践
  • 使用Issue跟踪任务和bug
  • PR描述要详细,方便审查
  • 及时回应别人的PR审查
  • 遇到冲突先沟通再解决
  • 定期开会同步进度
文档建议

在项目根目录创建这些文件:

  • README.md: 项目介绍和使用说明
  • CONTRIBUTING.md: 如何贡献代码
  • .gitignore: 忽略文件列表
  • LICENSE: 开源协议(如果开源)

12.6 安全建议

不要提交敏感信息

永远不要提交:

  • 密码
  • API密钥
  • 数据库连接字符串
  • 私钥
  • 个人信息

如果不小心提交了:

  1. 立即修改密码/密钥
  2. 从Git历史中删除(很复杂,最好找有经验的人帮忙)
  3. 以后使用环境变量存储敏感信息
使用.env文件
bash 复制代码
# .env文件(不要提交!)
DATABASE_PASSWORD=secret123
API_KEY=your_api_key

# .gitignore
.env

创建.env.example作为模板(可以提交):

bash 复制代码
# .env.example
DATABASE_PASSWORD=your_password_here
API_KEY=your_api_key_here

第十三章:总结和下一步

13.1 回顾核心概念

让我们回顾一下Git的核心概念:

  1. 仓库(Repository):被Git管理的文件夹
  2. 工作区:你修改文件的地方
  3. 暂存区:准备提交的修改
  4. 版本库:永久保存的提交历史
  5. 提交(Commit):项目的快照
  6. 分支(Branch):独立的开发线
  7. 远程仓库:云端的代码备份

13.2 核心工作流程

记住这个黄金流程:

复制代码
1. git pull           # 拉取最新代码
2. git checkout -b 分支名  # 创建新分支
3. 修改代码...
4. git add .          # 添加修改
5. git commit -m "说明"  # 提交
6. git push           # 推送
7. 创建Pull Request  # 请求审查
8. 合并到主分支      # 完成!

13.3 从新手到熟练的路径

第1周:基础操作

  • 熟练使用add、commit、push、pull
  • 能够创建和切换分支
  • 理解工作区、暂存区、版本库的概念

第2-4周:分支和协作

  • 熟练使用分支进行开发
  • 学会解决合并冲突
  • 参与团队的PR审查

第1-3个月:进阶技能

  • 掌握rebase、cherry-pick等高级命令
  • 能够处理复杂的合并场景
  • 制定团队的Git规范

持续学习:

  • 阅读Git官方文档
  • 关注最佳实践
  • 学习其他人的工作流程

13.4 常用资源

学习资源:

查询资源:

工具推荐:

13.5 给团队新成员的建议

  1. 不要害怕犯错
    • Git几乎可以撤销任何操作
    • 本地操作很难真正搞坏东西
    • 多尝试,多练习
  2. 养成好习惯
    • 经常提交
    • 写清楚的提交信息
    • 每天开始工作前先pull
    • 使用分支开发功能
  3. 多和团队沟通
    • 不确定的操作先问问
    • 遇到冲突和相关同事讨论
    • 分享你的经验和困惑
  4. 持续学习
    • Git命令很多,不需要全记住
    • 掌握常用的就够了
    • 遇到问题再查资料
  5. 使用合适的工具
    • 命令行不习惯就用GUI
    • 找到适合自己的工作方式
    • 工具是为了提高效率,不是目的

13.6 最后的话

恭喜你读完了这篇教程!Git一开始可能看起来很复杂,但其实核心概念就那么几个:

  • 提交:保存快照
  • 分支:平行开发
  • 合并:整合代码
  • 远程:团队协作

记住这个简单的日常流程:

bash 复制代码
git pull        # 拉取
修改代码
git add .       # 添加
git commit -m   # 提交
git push        # 推送

85%的日常工作就是这5个命令!

遇到问题不要慌:

  1. 先Google搜索错误信息
  2. 查看Git官方文档
  3. 询问团队成员
  4. 实在不行,重新克隆项目(最后的手段)

Git是一个强大的工具,但记住:

  • 工具是为人服务的,不是人为工具服务
  • 重要的是协作,不是炫技
  • 清晰的沟通比完美的Git历史更重要

现在,打开命令行,创建你的第一个Git项目吧!祝你在Git的世界里玩得开心!🚀


附录:快速命令参考卡片

bash 复制代码
# 📋 每天都用
git status          # 查看状态
git add .           # 添加所有修改
git commit -m "..."  # 提交
git push            # 推送
git pull            # 拉取

# 🌿 分支操作
git branch          # 查看分支
git checkout -b xxx # 创建并切换分支
git merge xxx       # 合并分支

# 📜 查看历史
git log --oneline   # 简洁历史
git diff            # 查看修改

# ↩️ 撤销操作
git checkout -- .   # 撤销工作区修改
git reset HEAD file # 取消暂存
git stash          # 暂存当前修改

# 🌐 远程操作
git remote -v       # 查看远程地址
git clone xxx       # 克隆项目
git push origin xxx # 推送分支

打印这个卡片,贴在电脑旁边,随时查看!

谢谢阅读,祝你成为Git高手! 💪

相关推荐
golang学习记4 小时前
Facebook 为什么不用 Git?
git·elasticsearch·facebook
GIS阵地4 小时前
git拉取时报错
大数据·git·elasticsearch
无限进步_7 小时前
C++ Vector 全解析:从使用到深入理解
开发语言·c++·ide·windows·git·github·visual studio
charlee447 小时前
Git使用经验总结9-Git提交关联到Issue
git·issue
-拟墨画扇-7 小时前
Git | Bug分支操作
git·gitee·github·bug·gitcode
-拟墨画扇-9 小时前
Git | Feature分支操作
git·gitee·github·gitcode
无限进步_9 小时前
C++多态全面解析:从概念到实现
开发语言·jvm·c++·ide·git·github·visual studio
henreash10 小时前
windows下git的hooks
git
无限进步_10 小时前
C++ STL list容器深度解析与模拟实现
开发语言·数据结构·c++·windows·git·list·visual studio