Git 工作流程
场景假设
- 你已经在本地项目目录中。
- 你创建了一些新文件。
- 你的远程仓库地址是 https://github.com/username/repository.git(请替换为你自己的地址)。
- 你的主分支叫做 master。
完整步骤
步骤一:检查当前状态和文件
首先确认你所在的分支以及哪些文件被修改了
# 查看当前所在分支(带*号的即为当前分支)查看有哪些文件被更改(新创建的文件会显示为红色,未跟踪)
git status
这时你会看到你新创建的文件列表,状态是 Untracked files。
第二步:将文件添加到暂存区
你需要告诉 Git,哪些文件你希望纳入版本控制。
# 添加单个特定文件
git add filename.txt
# 添加所有当前目录下的新文件和更改文件(最常用)
git add .
# 或者,交互式地添加文件(适合谨慎选择的情况)
git add -i
添加后,再次使用 git status 查看,会发现文件变成了绿色,状态为 Changes to be committed。
第三步:提交更改到本地仓库
将暂存区的文件创建一个正式的提交记录
# 提交并添加提交信息
git commit -m "描述你这次提交做了什么,例如:添加新功能文档"
# 提交信息应该清晰明了,例如:
# git commit -m "feat: add user login feature"
# git commit -m "docs: create API documentation"
第四步:推送到远程仓库
将本地master分支推送到远程仓库
# 如果是第一次推送本地master分支到远程,需要建立追踪关系
git push -u origin master
# 之后再次推送时,只需要简单的
git push
恭喜! 此时你本地创建的文件就已经成功合并到远程 master 分支了。
可能出现的情况及处理方法
情况一:推送前远程已有新的提交
如果你的同事在你 git push 之前已经向远程 master 推送了代码,你会收到提示 "拒绝合并不相关的历史" 或 "非快进式推送"。
解决方法: 先拉取远程最新代码并合并。
# 拉取远程master分支的最新代码并与本地合并
git pull origin master
# 如果git pull有冲突,需要手动解决冲突,然后:
git add .
git commit -m "解决合并冲突"
git push
情况二:你不在 master 分支上
如果你在另一个分支(例如 dev)上创建了文件,想合并到远程 master,有几种方法:
方法A:直接合并分支(推荐)
-
确保 dev 分支的更改已提交。
-
切换回 master 分支。
-
合并 dev 分支。
-
推送到远程。
1. 在dev分支上提交更改(如果还没提交)
git add .
git commit -m "在dev分支上完成的工作"2. 切换回master分支
git checkout master
3. 将dev分支的更改合并到master
git merge dev
4. 推送到远程
git push origin master
方法B:通过Pull Request (Merge Request)(更推荐用于团队协作)
-
将你的 dev 分支推送到远程。
-
在GitHub/GitLab等平台上,创建一个从 dev 到 master 的Pull Request。
-
经过代码审查后,在平台上合并它。
-
在本地拉取最新的 master 代码。
1. 推送你的功能分支到远程
git push -u origin dev
2. 然后在GitHub等网站创建PR并合并
3. 回到本地master分支,拉取更新
git checkout master
git pull origin master
本地和远程创建 dev 分支的完整流程
场景分析
通常有两种情况
- 从零开始,本地远程都没有dev分支
- 已有基础,本地有dev分支,需要远程推送
情况一:从零开始创建 dev 分支
第一步:在本地创建并切换到 dev 分支
# 方法1:创建并立即切换到 dev 分支(推荐)
git checkout -b dev
# 方法2:分两步执行
git branch dev # 创建分支
git checkout dev # 切换到分支
# 方法3:使用 switch 命令(Git 2.23+ 更直观)
git switch -c dev
第二步:验证分支切换
# 查看当前所在分支,带 * 号的是当前分支
git branch
# 或者查看更详细的信息
git status
第三步:在 dev 分支上进行工作
# 添加文件、修改代码等
echo "这是dev分支的内容" > dev-feature.txt
git add .
git commit -m "feat: 在dev分支上添加新功能"
第四步:将本地 dev 分支推送到远程
# 首次推送需要建立追踪关系
git push -u origin dev
# 之后再次推送只需要
git push
完成! 现在本地和远程都有了 dev 分支。
情况二:基于远程 master 创建 dev 分支
如果你希望基于远程最新的 master 分支来创建 dev 分支:
第一步:确保本地 master 是最新的
# 切换到 master 分支
git checkout master
# 拉取远程最新代码
git pull origin master
第二步:基于最新 master 创建 dev 分支
# 创建并切换到 dev 分支
git checkout -b dev
# 推送到远程
git push -u origin dev
常用分支操作命令
查看分支信息
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支详情(最后提交信息)
git branch -v
# 查看远程分支
git branch -r
分支切换和删除
# 切换到已有分支
git checkout branch_name
# 或者
git switch branch_name
# 删除本地分支(确保不在要删除的分支上)
git branch -d dev # 安全删除(已合并)
git branch -D dev # 强制删除(未合并)
# 删除远程分支
git push origin --delete dev
更新和同步
# 拉取远程dev分支的最新更改
git pull origin dev
# 如果本地dev分支已经存在,与远程建立关联
git branch --set-upstream-to=origin/dev dev
完整的工作流程示例
# 1. 从master创建dev分支
git checkout master
git pull origin master
git checkout -b dev
# 2. 在dev分支上工作
echo "新功能开发" > new-feature.txt
git add .
git commit -m "feat: 开发新功能"
# 3. 推送到远程
git push -u origin dev
# 4. 验证结果
git branch -a
团队协作最佳实践
-
定期同步
git pull origin dev
-
解决冲突:如果git pull有冲突
git add . git commit -m "解决合并冲突" -
保持分支清洁:在开始新功能前确保分支是最新的。
理解 origin/HEAD -> origin/master
- origin/HEAD 是一个符号引用,指向远程仓库的默认分支
- -> origin/master 表示当前远程仓库的默认分支是 master 分支
- 这相当于远程仓库的"当前活跃分支"
查看这个信息
# 查看所有分支信息(会显示 origin/HEAD 指向)
git branch -a
# 或者使用
git ls-remote --heads origin
在实际操作中的影响
创建和推送 dev 分支不受影响
即使 origin/HEAD 指向 master,你仍然可以正常创建和推送 dev 分支:
bash
# 1. 创建并切换到 dev 分支
git checkout -b dev
# 2. 在 dev 分支上工作
echo "dev branch work" > feature.txt
git add .
git commit -m "feat: add new feature"
# 3. 推送到远程(不受 origin/HEAD 影响)
git push -u origin dev
简化命令
因为 origin/HEAD 指向 master,有些命令可以简化:
# 以下两个命令等价(拉取默认分支)
git pull origin
git pull origin master
# 以下两个命令等价(推送到默认分支)
git push origin
git push origin master
更改默认分支
方法一:通过git命令(需要权限)
# 将远程 HEAD 指向 dev 分支
git remote set-head origin dev
# 验证更改
git branch -a
方法二:通过git服务平台(推荐)
在 GitHub/GitLab 等平台的操作:
- 进入仓库页面
- 点击 Settings → Branches
- 在 "Default branch" 处选择 dev
- 点击 Update/Save
方法三:直接推送更改
# 推送并设置远程 HEAD
git push origin dev
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/dev