Git 完全入门指南:从基础到进阶
笔记 创建于:
, 更新于:
| Git目录
仓库管理
在本地当前目录初始化仓库
克隆远程仓库
1
| git clone https://github.com/username/repository.git
|
配置管理
区分文件名大小写
默认情况下,Git 在 macOS 和 Windows 上不区分文件名大小写。如果需要严格区分,可以关闭 ignorecase 选项。
全局配置(所有仓库生效):
1
| git config --global core.ignorecase false
|
单个仓库配置:
1
| git config core.ignorecase false
|
忽略文件权限修改
如果不需要跟踪文件权限的变化(例如从 Windows 切换到 Linux 时),可以关闭 filemode。
1
| git config core.filemode false
|
查看当前配置:
分支管理
创建并切换到新分支
或使用新版命令:
切换到已有分支
或:
查看分支
1
2
3
4
5
6
7
8
| # 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
|
删除分支
删除本地分支:
删除远程分支:
1
| git push origin --delete dev
|
或使用旧版语法:
创建本地分支并关联远程分支
1
| git checkout -b dev origin/dev
|
关联本地分支与远程分支
1
| git branch --set-upstream-to=origin/master master
|
或使用更简洁的方式(推送时):
1
| git push -u origin master
|
远程仓库
添加远程仓库
1
| git remote add origin https://github.com/uncle-it/test.git
|
查看远程仓库
修改远程仓库 URL
1
| git remote set-url origin https://github.com/newname/repository.git
|
避免每次输入密码
方法一:在 URL 中嵌入用户名和密码(不推荐,明文存储)
方法二:使用 SSH 密钥(推荐)
1
2
3
4
5
| # 生成 SSH 密钥
ssh-keygen -t ed25519 -C "[email protected]"
# 将公钥添加到 GitHub
cat ~/.ssh/id_ed25519.pub
|
方法三:使用 credential helper 缓存密码
1
2
3
4
5
6
7
8
| # 缓存密码(默认 15 分钟)
git config --global credential.helper cache
# 自定义缓存时间(例如 1 小时)
git config --global credential.helper 'cache --timeout=3600'
# 永久存储密码(明文)
git config --global credential.helper store
|
文件忽略
.gitignore 文件
创建 .gitignore 文件来忽略不需要版本控制的文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 忽略文件
config.php
secrets.txt
# 忽略目录
node_modules/
dist/
*.log
# 忽略所有 .log 文件
*.log
# 但不忽略 important.log
!important.log
|
注意: .gitignore 只对尚未被跟踪的文件生效。如果文件已经被提交过,需要先移除跟踪。
忽略已被跟踪的文件
如果文件已经被 Git 跟踪,使用 .gitignore 不会生效,需要使用以下命令:
方法一:使用 --assume-unchanged(假设文件未更改)
1
| git update-index --assume-unchanged config.php
|
恢复跟踪:
1
| git update-index --no-assume-unchanged config.php
|
方法二:使用 --skip-worktree(跳过工作树,更推荐)
1
| git update-index --skip-worktree config.php
|
恢复跟踪:
1
| git update-index --no-skip-worktree config.php
|
两者的区别:
--assume-unchanged:告诉 Git 假设文件未更改,适合大型项目提升性能--skip-worktree:告诉 Git 跳过该文件的工作树检查,更适合本地修改不想提交的场景
git update-index 常用参数
1
2
3
4
5
6
7
8
9
10
11
12
13
| git update-index
[--add] [--remove | --force-remove] [--replace]
[--refresh] [-q] [--unmerged] [--ignore-missing]
[(--cacheinfo <mode> <object> <file>)...]
[--chmod=(+|-)x]
[--assume-unchanged | --no-assume-unchanged]
[--skip-worktree | --no-skip-worktree]
[--ignore-submodules]
[--really-refresh] [--unresolve] [--again | -g]
[--info-only] [--index-info]
[-z] [--stdin] [--index-version <version>]
[--verbose]
[--] [<file>...]
|
官方文档:https://www.kernel.org/pub/software/scm/git/docs/git-update-index.html
提交与撤销
查看状态
查看提交历史
1
2
3
4
5
6
7
8
| # 简洁模式
git log --oneline
# 图形化显示分支历史
git log --graph --oneline --all
# 显示最近一次提交
git log -1
|
添加到暂存区
1
2
3
4
5
| # 添加指定文件
git add readme.txt
# 添加所有更改
git add .
|
提交更改
修改最后一次提交
撤销工作区的修改(未添加到暂存区)
1
| git checkout -- config.php
|
或使用新版命令:
撤销暂存区的修改(已添加到暂存区,但未提交)
1
| git reset HEAD readme.txt
|
或使用新版命令:
1
| git restore --staged readme.txt
|
回退到指定版本
1
2
3
4
5
6
7
8
| # 硬重置(丢弃所有更改)
git reset --hard 3628164
# 软重置(保留工作区更改)
git reset --soft 3628164
# 混合重置(重置暂存区,保留工作区)
git reset --mixed 3628164
|
拉取远程更新
等价于:
1
2
| git fetch origin
git merge origin/master
|
推送本地提交
1
2
3
4
5
| # 第一次推送需要 -u 参数建立跟踪
git push -u origin master
# 后续推送
git push
|
合并分支
1
2
| # 将 dev 分支合并到当前分支
git merge dev
|
变基(Rebase)
1
2
| # 将当前分支的提交变基到 master
git rebase master
|
注意: 不要对已经推送到远程的提交执行 rebase。
Git 配置别名
通过配置别名,可以简化常用命令。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # git st = git status
git config --global alias.st status
# git co = git checkout
git config --global alias.co checkout
# git ci = git commit -m
git config --global alias.ci 'commit -m'
# git br = git branch
git config --global alias.br branch
# git last = 查看最后一次提交
git config --global alias.last 'log -1'
# git lg = 漂亮的提交历史图形化显示
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
|
使用别名后,可以用简化命令操作:
1
2
3
4
5
| git st
git co dev
git ci "fix: 修复登录bug"
git br
git lg
|
常见问题排查
错误:401 Unauthorized
错误信息:
1
| error: The requested URL returned error: 401 Unauthorized while accessing http://x.x.x.x
|
原因: Git 版本过旧,不支持新的认证方式。
解决方法: 升级 Git 到最新版本。
升级步骤(CentOS/RedHat):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| # 查看当前版本
git --version
# 安装依赖
sudo yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
# 下载最新版本
wget -O v1.8.1.2.tar.gz https://github.com/git/git/archive/v1.8.1.2.tar.gz
# 解压
tar -xzvf ./v1.8.1.2.tar.gz
cd git-1.8.1.2/
# 编译安装
make prefix=/usr/local all
sudo make prefix=/usr/local install
# 验证版本
git --version
|
错误:fatal: recursion detected in die handler
错误信息:
1
| fatal: recursion detected in die handler
|
原因: 上传的文件过大,导致 HTTP 头出错。
解决方法:
1
2
3
4
5
| # 检查仓库完整性
git fsck
# 增大 HTTP 缓冲区(例如设置为 500MB)
git config http.postBuffer 524288000
|
错误:error: RPC failed; result=18, HTTP code = 200
错误信息:
1
| error: RPC failed; result=18, HTTP code = 200
|
原因: 推送的文件过大,超过了服务器的 HTTP 缓冲区限制。
解决方法:
1
2
3
4
5
| # 增大全局 HTTP 缓冲区(500MB)
git config --global http.postBuffer 500000000
# 查看配置
git config --list
|
其他实用命令
清理远程已删除的分支:
1
| git remote prune origin
|
查看文件每一行的最后修改人和时间:
临时保存工作区更改:
1
2
3
4
5
6
7
8
| # 保存工作区
git stash
# 查看 stash 列表
git stash list
# 恢复工作区
git stash pop
|
修改最后一次提交(不修改提交信息):
1
| git commit --amend --no-edit
|
总结
本文总结了 Git 的常用命令,包括仓库管理、分支管理、远程仓库操作、文件忽略、提交与撤销等核心功能。掌握这些命令能够应对日常开发中的大部分场景。
建议在使用 Git 时遵循以下最佳实践:
- 提交原子性: 每次提交只做一件事,方便回滚和 code review
- 写清楚提交信息: 提交信息要简洁明了,说明本次提交的目的和内容
- 频繁提交: 小步快跑,避免一次提交大量更改
- 使用 .gitignore: 忽略不必要的文件(如
node_modules/、.env、编译产物等) - 定期拉取更新: 避免长期不拉取导致合并冲突
- 使用 SSH 密钥: 避免使用明文密码,提升安全性
参考文档:
如有问题或建议,欢迎留言讨论!
评论 ( 如有任何问题,请在下方留言和讨论 )