文章标题:
Git 实战秘籍:从新手到高手全解析
文章内容:
Git属于当前十分流行的分布式版本控制系统,在软件开发里被广泛运用。本文将会全面介绍Git的各类功能以及使用办法,其中包含大量的代码示例和实践方面的建议。
文章目录
-
- Git基础概念
-
- 版本控制系统
- Git的特点
- Git的三个区域
- Git文件状态
- Git安装与配置
-
- 安装Git
-
- Linux
- macOS
- Windows
- 初始配置
- Git仓库创建与管理
-
- 初始化新仓库
- 克隆现有仓库
- 查看仓库状态
- 忽略文件
- Git基本工作流程
-
- 添加文件到暂存区
- 提交更改
- 查看提交历史
- 比较差异
- Git分支管理
-
- 创建与切换分支
- 合并分支
- 解决冲突
- 变基(Rebase)
- Git远程仓库操作
-
- 查看远程仓库
- 添加/移除远程仓库
- 获取与拉取
- 推送
- Git撤销与回退
-
- 撤销工作目录修改
- 撤销暂存区修改
- 修改最后一次提交
- 回退提交
- 恢复删除的文件
- Git标签管理
-
- 创建标签
- 查看标签
- 推送标签
- 删除标签
- 检出标签
- Git高级操作
-
- 储藏更改
- 二分查找
- 子模块
- 重写历史
- 打包与归档
- Git协作工作流
-
- 集中式工作流
- 功能分支工作流
- Git Flow
- Forking工作流
- Git问题排查
-
- 查看文件修改历史
- 查找问题提交
- 恢复丢失的提交
- 清理仓库
- Git最佳实践
-
- 提交规范
- 分支命名规范
- 工作流程建议
- 大型项目建议
- 安全性建议
- 总结
Git基础概念
版本控制系统
版本控制系统(Version Control System,VCS)是一种能够记录文件内容变化的系统,借此可以在日后查阅特定版本的修订情况。
Git的特点
- 分布式:每一位开发者都拥有完整的仓库副本
- 高效:大部分操作在本地就能完成
- 完整性:运用SHA-1哈希来保障数据的完整性
- 灵活性:支持多种非线性的开发流程
Git的三个区域
- 工作目录(Working Directory):实际文件所处的目录
- 暂存区(Staging Area):准备进行提交的文件快照
- Git仓库(Repository):永久存储的文件快照
Git文件状态
- 未跟踪(Untracked):新的文件,还未被Git进行管理
- 已修改(Modified):文件已经修改但还没有暂存
- 已暂存(Staged):文件已修改且标记为下次提交
- 已提交(Committed):文件已安全存储在本地数据库中
Git安装与配置
安装Git
Linux
# Debian/Ubuntu
sudo apt-get install git
# Fedora
sudo dnf install git
# CentOS
sudo yum install git
macOS
# 使用 Homebrew
brew install git
# 或下载官方安装包
https://git-scm.com/download/mac
Windows
下载Git for Windows:https://git-scm.com/download/win
初始配置
配置用户信息:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
配置默认编辑器:
git config --global core.editor "vim"
查看配置:
git config --list
常用别名配置:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
Git仓库创建与管理
初始化新仓库
mkdir my-project
cd my-project
git init
克隆现有仓库
git clone https://github.com/user/repo.git
git clone https://github.com/user/repo.git my-local-folder # 指定本地目录名
git clone --depth 1 https://github.com/user/repo.git # 浅克隆,只获取最新版本
查看仓库状态
git status
git status -s # 简洁输出
忽略文件
创建.gitignore
文件:
# 忽略所有 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 忽略当前目录下的 TODO 文件
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录下所有 .pdf 文件
doc/**/*.pdf
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略 .env 环境文件
.env
Git基本工作流程
添加文件到暂存区
git add file1.txt # 添加单个文件
git add file2.txt file3.txt # 添加多个文件
git add . # 添加所有修改和新文件
git add -A # 添加所有修改、新文件和删除操作
git add -u # 添加所有修改和删除,但不包括新文件
git add -p # 交互式添加
提交更改
git commit -m "Initial commit" # 简单提交
git commit -a -m "Commit all changes" # 跳过暂存区,直接提交所有已跟踪文件的修改
git commit --amend # 修改最后一次提交
git commit --amend --no-edit # 修改最后一次提交但不修改提交信息
查看提交历史
git log
git log -p # 显示每次提交的内容差异
git log -2 # 显示最近2次提交
git log --stat # 显示简略统计信息
git log --pretty=oneline # 单行显示
git log --pretty=format:"%h - %an, %ar : %s"
git log --since=2.weeks # 显示两周内的提交
git log --author="John" # 按作者筛选
git log --grep="bug fix" # 按提交信息筛选
git log -S"function_name" # 按代码内容筛选
git log -- path/to/file # 查看特定文件的修改历史
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit # 漂亮的图形化输出
比较差异
git diff # 工作目录与暂存区的差异
git diff --staged # 暂存区与最后一次提交的差异
git diff HEAD # 工作目录与最后一次提交的差异
git diff branch1..branch2 # 两个分支间的差异
git diff commit1 commit2 # 两次提交间的差异
git diff --name-only commit1 commit2 # 只显示有差异的文件名
git diff --word-diff # 单词级别的差异
Git分支管理
创建与切换分支
git branch # 查看本地分支
git branch -a # 查看所有分支(包括远程)
git branch new-branch # 创建新分支
git checkout branch-name # 切换分支
git checkout -b new-branch # 创建并切换到新分支
git checkout -b new-branch origin/remote-branch # 基于远程分支创建本地分支
git branch -d branch-name # 删除已合并的分支
git branch -D branch-name # 强制删除分支
git branch -m old-name new-name # 重命名分支
git branch --merged # 查看已合并到当前分支的分支
git branch --no-merged # 查看未合并到当前分支的分支
合并分支
git merge branch-name # 合并指定分支到当前分支
git merge --no-ff branch-name # 禁用快进合并
git merge --squash branch-name # 压缩合并
git merge --abort # 中止合并
解决冲突
当合并发生冲突时,Git会在冲突文件中标记冲突部分:
<<<<<<< HEAD
当前分支的内容
=======
要合并的分支的内容
>>>>>>> branch-name
手动解决冲突后:
git add resolved-file.txt
git commit
变基(Rebase)
git rebase branch-name # 将当前分支变基到指定分支
git rebase --continue # 解决冲突后继续变基
git rebase --abort # 中止变基
git rebase -i HEAD~3 # 交互式变基,修改最近3次提交
交互式变基常用操作:
* pick: 使用提交
* reword: 使用提交但修改提交信息
* edit: 使用提交但暂停修改
* squash: 将提交合并到前一个提交
* fixup: 类似squash但丢弃提交信息
* drop: 删除提交
Git远程仓库操作
查看远程仓库
git remote # 列出远程仓库
git remote -v # 显示远程仓库URL
git remote show origin # 显示远程仓库详细信息
添加/移除远程仓库
git remote add origin https://github.com/user/repo.git # 添加远程仓库
git remote rename origin new-name # 重命名远程仓库
git remote remove origin # 移除远程仓库
git remote set-url origin https://github.com/user/new-repo.git # 修改远程仓库URL
获取与拉取
git fetch origin # 从远程获取最新信息但不合并
git fetch --prune # 清理已不存在的远程分支的本地引用
git pull origin master # 获取并合并远程分支
git pull --rebase # 使用变基方式拉取
推送
git push origin master # 推送本地分支到远程
git push -u origin master # 推送并设置上游分支
git push origin --delete branch-name # 删除远程分支
git push origin --tags # 推送所有标签
git push origin HEAD # 推送当前分支
git push --force # 强制推送(慎用)
git push --force-with-lease # 更安全的强制推送
Git撤销与回退
撤销工作目录修改
git checkout -- file.txt # 撤销工作目录中文件的修改
git checkout -- . # 撤销所有工作目录修改
撤销暂存区修改
git reset HEAD file.txt # 将文件从暂存区移出
git reset HEAD . # 将所有文件从暂存区移出
修改最后一次提交
git commit --amend # 修改提交信息或内容
git commit --amend --no-edit # 修改提交内容但不修改信息
回退提交
git reset --soft HEAD~1 # 回退提交但保留修改在暂存区
git reset --mixed HEAD~1 # 回退提交并保留修改在工作目录(默认)
git reset --hard HEAD~1 # 彻底回退提交,丢弃所有修改
git revert HEAD # 创建新提交来撤销之前的提交
恢复删除的文件
git checkout HEAD -- deleted-file.txt # 恢复已删除的文件
git checkout $(git rev-list -n 1 HEAD -- deleted-file.txt)^ -- deleted-file.txt # 恢复在之前提交中删除的文件
Git标签管理
创建标签
git tag v1.0 # 轻量标签
git tag -a v1.0 -m "Version 1.0" # 附注标签
git tag -a v1.0 9fceb02 # 给特定提交打标签
git tag -s v1.0 -m "Signed version 1.0" # 签名标签
查看标签
git tag # 列出所有标签
git show v1.0 # 查看标签详情
git tag -l "v1.*" # 过滤标签
推送标签
git push origin v1.0 # 推送单个标签
git push origin --tags # 推送所有标签
删除标签
git tag -d v1.0 # 删除本地标签
git push origin --delete v1.0 # 删除远程标签
git push origin :refs/tags/v1.0 # 另一种删除远程标签的方式
检出标签
git checkout v1.0 # 检出标签(进入分离头指针状态)
git checkout -b version1 v1.0 # 基于标签创建新分支
Git高级操作
储藏更改
git stash # 储藏当前工作目录和暂存区的修改
git stash save "message" # 带消息的储藏
git stash list # 列出所有储藏
git stash apply # 应用最近的储藏
git stash apply stash@{1} # 应用特定储藏
git stash pop # 应用并移除最近的储藏
git stash drop stash@{1} # 删除特定储藏
git stash clear # 清除所有储藏
git stash branch new-branch # 从储藏创建新分支
git stash -u # 储藏包括未跟踪文件
git stash -a # 储藏包括所有文件(包括.gitignore忽略的)
二分查找
git bisect start # 开始二分查找
git bisect bad # 当前版本有问题
git bisect good v1.0 # v1.0版本是好的
git bisect reset # 结束二分查找
git bisect run test-script.sh # 自动运行测试脚本进行二分查找
子模块
git submodule add https://github.com/user/repo.git path/to/submodule # 添加子模块
git submodule init # 初始化子模块
git submodule update # 更新子模块
git submodule update --init --recursive # 递归初始化并更新所有子模块
git submodule foreach 'git checkout master' # 对所有子模块执行命令
git clone --recurse-submodules https://github.com/user/repo.git # 克隆包含子模块的仓库
重写历史
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD # 从所有提交中删除文件
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "old@email.com" ];
then
GIT_AUTHOR_NAME="New Name";
GIT_AUTHOR_EMAIL="new@email.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD # 修改作者信息
注意:重写历史会改变提交哈希,只适用于尚未共享的提交。
打包与归档
git bundle create repo.bundle HEAD master # 创建包含master分支的bundle文件
git clone repo.bundle repo -b master # 从bundle文件克隆
git archive --format=zip HEAD > archive.zip # 创建当前提交的zip归档
git archive --format=tar --prefix=project/ HEAD | gzip > project.tar.gz # 创建带前缀的tar.gz归档
Git协作工作流
集中式工作流
- 开发者克隆中央仓库
- 在本地提交更改
3.
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12833.html