git
Git 是一个由 Linus Torvalds 创建的免费、开源的分布式版本控制系统,用于管理计算机文件的变化。它最初是为了更好地管理 Linux 内核的开发而设计的,但现在已经被广泛用于各种规模的软件开发项目中。
Git 的主要特点
- 分布式架构:每个开发者在本地计算机上都有一份完整的项目历史记录,这使得协作变得容易,并且即使在没有网络连接的情况下也能进行工作。
- 数据完整性:Git 通过内容的 SHA-1 哈希值来确保代码的完整性和一致性。
- 强大的分支和合并:Git 提供了非常强大的分支和合并功能,使得开发者可以轻松地在不同的功能、实验或修复中切换,而不必担心会影响到主分支。
- 速度和性能:Git 在执行大多数操作时都非常快速,包括从大型代码库中克隆和提交。
- 非线性开发:Git 支持快速、简单的分支和合并,使得非线性的开发流程(例如,同时进行多个功能的开发或修复)成为可能。
- 轻量级操作:Git 的操作大多数都是添加数据到 Git 数据库中,很少有操作会删除或修改数据。
- 支持大型项目:Git 能够高效地处理大型项目(例如,Linux 内核)。
- 工作流灵活性:Git 支持多种工作流程,如集中式工作流、功能分支工作流、Gitflow 工作流和 Forking 工作流等,适应不同规模和需求的项目团队。
Git 的常用工作流程
- 集中式工作流:适用于小型团队,所有开发者都在同一个分支上工作。
- 功能分支工作流:每个新功能都在自己的分支上开发,完成后再合并回主分支。
- Gitflow 工作流:定义了一套严格的分支策略,包括主分支、开发分支、功能分支、发布分支和修复分支。
- Forking 工作流:每个开发者都有自己的远程仓库(Fork),在本地进行开发和提交,然后将更改通过 Pull Request 提交到主仓库。
- Git 的安装和使用在不同的操作系统上略有不同,但它提供了图形用户界面(GUI)和命令行界面(CLI),以适应不同开发者的偏好。此外,Git 还有许多第三方工具和服务,如 GitHub、GitLab 和 Bitbucket,它们提供了基于 Git 的代码托管服务,以及代码审查、持续集成等附加功能。
常用命令
初始化和配置
命令 | 解释 |
---|---|
git config --global user.name "Your Name" | 设置全局用户名 |
git config --global user.email "your_email@example.com" | 设置全局用户邮箱 |
git help [command] | 获取 Git 命令的帮助信 |
基本操作
命令 | 解释 |
---|---|
git init | 初始化本地 Git 仓库 |
git clone [url] | 克隆远程仓库到本地 |
git status | 查看当前工作目录的状态 |
git add [file] | 将文件添加到暂存区 |
git add . | 添加当前目录下所有更改过的文件到暂存区 |
git commit -m 'message' | 提交暂存区的更改到仓库,并添加提交信息 |
git commit --amend -m 'message' | 修改上一次提交信息 |
git commit -am 'message' | 将工作区更改添加到暂存区并提交 |
git rm [file] | 从暂存区和工作区中删除文件 |
git log | 显示提交日志 |
分支管理
创建分支
命令 | 解释 |
---|---|
git branch [branch-name] | 创建一个新分支,但仍然停留在当前分支。 |
git checkout -b [branch-name] | 创建一个新分支并立即切换到该分支。 |
切换分支
命令 | 解释 |
---|---|
git checkout [branch-name] | 切换到指定的分支。 |
git switch [branch-name](Git 2.23 版本引入) | 切换到指定的分支,这是一个更清晰的命令,专门用于切换分支。 |
查看分支
命令 | 解释 |
---|---|
git branch | 列出所有本地分支。 |
git branch -a | 列出所有本地和远程分支。 |
git branch -r | 列出所有远程分支。 |
git branch --merged | 列出所有已经合并到当前分支的分支。 |
git branch --no-merged | 列出所有尚未合并到当前分支的分支。 |
合并分支
命令 | 解释 |
---|---|
git merge [branch-name] | 将指定分支合并到当前分支。 |
git merge --no-ff [branch-name] | 即使快进合并可能,也创建一个新的提交节点来合并指定分支。 |
git rebase [base-branch] | 将当前分支的更改重新应用到 base-branch 上。这通常会将当前分支的提交移到 base-branch 的最顶端。 |
删除分支
命令 | 解释 |
---|---|
git branch -d [branch-name] | 删除一个已合并到当前分支的分支。 |
git branch -D [branch-name] | 强制删除一个分支,即使它未合并。 |
重命名分支
命令 | 解释 |
---|---|
git branch -m [old-branch-name] [new-branch-name] | 命名当前分支到指定的新分支名。 |
git branch -D [branch-name] | 强制删除一个分支,即使它未合并。 |
远程分支操作
命令 | 解释 |
---|---|
git push origin [branch-name] | 推送本地分支到远程仓库。 |
git pull | 相当于 git fetch 和 git merge 的组合,用于拉取远程分支的更新并合并到当前分支。 |
检查分支状态
命令 | 解释 |
---|---|
git log --graph --oneline --all | 以图形化的方式查看所有分支的提交历史 |
git log --since=2.week | 查看最近两周的提交历史。 |
git log [source-branch]...[target-branch] | 比较两个分支之间的差异。 |
标签
命令 | 解释 |
---|---|
git tag | 创建一个标签。 |
git tag -a v1.0 -m "版本说明" | 创建一个带注释的标签。 |
git show v1.0 | 查看标签详情。 |
git push --tags | 推送所有标签到远程仓库 |
远程仓库
命令 | 解释 |
---|---|
git remote add [shortname] [url] | 添加远程仓库 |
git remote -v | 查看所有远程仓库 |
git fetch [remote] | 获取远程仓库的所有更新 |
git pull [remote] [branch] | 获取远程分支更新并合并到本地分支 |
git push [remote] [branch] | 将本地分支推送到远程仓库 |
git push [remote] --force | 强制推送当前分支到远程仓库 |
撤销和回退
命令 | 解释 |
---|---|
git checkout [file] | 撤销工作区的更改 |
git reset [file] | 撤销暂存区的更改 |
git reset --hard | 重置工作区和暂存区到最后一次提交 |
git revert [commit-hash | 创建一个新的提交来撤销指定提交的更改 |
git stash | 暂存当前工作区的更 |
git stash pop | 应用最近一次的暂存更改 |
查看差异和比较
命令 | 解释 |
---|---|
git diff | 显示工作区和暂存区的差异 |
git diff --cached | 显示暂存区和上一次提交的差异 |
git diff [branch1] [branch2 | 比较两个分支的差异 |
git diff [commit-hash] | 显示指定提交的详细差异 |