Git 完全入门指南:从基础到进阶

笔记 创建于: , 更新于: | Git

目录


仓库管理

在本地当前目录初始化仓库

1
git init ./

克隆远程仓库

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
cat .git/config

分支管理

创建并切换到新分支

1
git checkout -b dev

或使用新版命令:

1
git switch -c dev

切换到已有分支

1
git checkout master

或:

1
git switch master

查看分支

1
2
3
4
5
6
7
8
# 查看本地分支
git branch

# 查看远程分支
git branch -r

# 查看所有分支
git branch -a

删除分支

删除本地分支:

1
git branch -D dev

删除远程分支:

1
git push origin --delete dev

或使用旧版语法:

1
git push origin :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

查看远程仓库

1
git remote -v

修改远程仓库 URL

1
git remote set-url origin https://github.com/newname/repository.git

避免每次输入密码

方法一:在 URL 中嵌入用户名和密码(不推荐,明文存储)

1
git remote add origin https://username:[email protected]/uncle-it/test.git

方法二:使用 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

两者的区别:

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
git status

查看提交历史

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 commit -m "提交说明"

修改最后一次提交

1
git commit --amend

撤销工作区的修改(未添加到暂存区)

1
git checkout -- config.php

或使用新版命令:

1
git restore 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
git pull origin master

等价于:

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
git blame filename

临时保存工作区更改:

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 时遵循以下最佳实践:

  1. 提交原子性: 每次提交只做一件事,方便回滚和 code review
  2. 写清楚提交信息: 提交信息要简洁明了,说明本次提交的目的和内容
  3. 频繁提交: 小步快跑,避免一次提交大量更改
  4. 使用 .gitignore: 忽略不必要的文件(如 node_modules/.env、编译产物等)
  5. 定期拉取更新: 避免长期不拉取导致合并冲突
  6. 使用 SSH 密钥: 避免使用明文密码,提升安全性

参考文档:


如有问题或建议,欢迎留言讨论!

笔记标签:

评论 ( 如有任何问题,请在下方留言和讨论 )