1. 什么是 Git?
Git 是一个强大的分布式版本控制系统,用于跟踪文件的更改,尤其是源代码。它允许多名开发者同时在不同的地方进行开发工作,并且能够非常高效地合并不同开发者的代码。
与集中式版本控制系统(如 SVN)不同,Git 是分布式的,这意味着每个开发者的本地机器上都有完整的代码库和版本历史。这样不仅提高了效率,还增强了容错能力。很多人在想有了Git为什么还要有SVN,或者说有了Git为什么还有很多公司用SVN,那是因为与Git相比SVN对代码的安全性更好,对权限控制更好。
2. Git 的基本操作
2.1 初始化和克隆仓库
-
git init:用于初始化一个新的 Git 仓库。git init -
git clone <repository-url>:用于从远程仓库克隆一个 Git 仓库到本地,常用于首次获取项目代码。git clone https://github.com/username/repository.git
初始化一个项目有两种方式一个是本地init上传到仓库,也可以在仓库创建好然后git clone下来。
2.2 查看仓库状态
-
git status:查看当前工作目录和暂存区的状态,包括哪些文件已被修改,哪些文件已被暂存,哪些文件未被追踪。git status
2.3 提交更改
-
git add <file>:将修改过的文件添加到暂存区,准备提交。git add index.html
这里可以使用.gitignore 文件帮助我们忽略不必要的文件或文件夹,避免这些文件被加入到版本控制中。通常,会将一些不需要被版本控制的文件添加到 .gitignore 文件中,比如临时文件、编译生成的文件、IDE 配置文件等。
-
git commit -m "message":将暂存区的更改提交到本地仓库,-m后面跟提交信息。git commit -m "Fix the header issue" -
git commit -a:会将已跟踪文件的所有修改直接提交到本地仓库,跳过git add的过程。git commit -a -m "Update code for footer"
2.4 查看提交历史
-
git log:查看提交历史记录。可以加上一些选项,如--oneline来显示更简洁的历史记录。git log --oneline
3. 分支管理
分支是 Git 最强大的功能之一,它允许你并行开发多个功能,并在完成后将它们合并。分支管理是团队协作中的关键。
3.1 创建和切换分支
-
git branch <branch-name>:创建一个新分支。git branch feature-xyz -
git checkout <branch-name>:切换到指定分支。git checkout feature-xyz -
git checkout -b <branch-name>:创建并切换到新分支。git checkout -b feature-xyz
3.2 合并分支
-
git merge <branch-name>:将指定分支的更改合并到当前分支。git checkout develop git merge feature-xyz
3.3 删除分支
-
git branch -d <branch-name>:删除本地分支,分支已合并时使用。git branch -d feature-xyz
这里可能存在冲突要先解决冲突然后提交,最后push到仓库
4. Git 协作流程
团队协作时,Git 提供了非常灵活的工作流。下面是一些常见的协作流程:
4.1 Fork 和 Pull Request 流程
在开源项目中,团队成员通常会先 Fork 远程仓库,然后在自己本地的分支上进行修改,最后通过 Pull Request 提交代码。具体流程如下:
-
Fork 仓库:点击 GitHub 页面上的 Fork 按钮,复制仓库到自己的账户中。
-
Clone 仓库到本地:克隆自己 Fork 的仓库到本地。
git clone https://github.com/username/forked-repository.git -
创建分支并开发:创建一个新的分支并开始开发。
git checkout -b feature-xyz
一般来说在公司里,我们每个人在每个版本都有自己独立的开发分支,彼此分支互相不干扰,如果要合作开发最好是新建业务分支,不要随便merge别人的分支。
-
提交更改:开发完成后,将代码提交到本地仓库。
git commit -m "Add feature xyz" -
推送到远程仓库:将更改推送到自己的 Fork 仓库。
git push origin feature-xyz
4.2 多人协作
-
git pull:拉取远程仓库的更新到本地,确保你的分支是最新的,避免冲突。git pull origin develop
在我们多人协作开发的时候一定要先pull拉去最新代码然后合并,解决冲突后再push。
-
git push:将本地的修改推送到远程仓库。git push origin feature-xyz
5. Git 的最佳实践
5.1 频繁提交
每次提交都应该是小而清晰的,避免一次性提交大量的更改。频繁的小提交可以帮助你更好地追踪问题,尤其是在调试时。
5.2 清晰的提交信息
提交信息应简洁明了,说明本次更改的目的。例如:
feat: add login functionalityfix: resolve issue with input validationdocs: update README with installation instructions
5.3 分支管理
合理使用分支,遵循以下分支策略:
main(或master)分支:始终保持可发布状态,只用于生产环境。develop分支:用来存放开发中的代码,所有新特性都应合并到develop。feature/<feature-name>分支:每个功能或任务使用一个分支,独立开发,完成后合并回develop。release/<version>分支:用于发布准备工作,修复小问题,稳定代码。hotfix/<version>分支:紧急修复生产环境的代码,修复后会同时合并回main和develop。
5.4 定期合并与同步
团队开发时,保持本地仓库和远程仓库的同步非常重要。建议定期 git pull 更新代码,避免产生复杂的合并冲突。
5.5 避免强制推送
尽量避免使用 git push --force,强制推送可能会覆盖远程仓库的更改,导致其他开发者的工作丢失。如果必须重写历史,使用 git push --force-with-lease,并与团队成员沟通。
6. Git 的高级功能
6.1 Git Rebase
git rebase 可以将某个分支的修改移动到另一个分支的顶部,保持一个干净的提交历史。通常与 git pull --rebase 配合使用,避免合并提交。
git checkout feature-xyz
git rebase develop
6.2 Git Cherry-pick
git cherry-pick 用于选择一个提交应用到当前分支,通常在某个提交需要从其他分支移植时使用。
git cherry-pick <commit-hash>