Git学习笔记


1. 安装

在官方网站安装: https://git-scm.com/


2. 初始化配置

1
2
3
4
5
6
7
8
9
10
11
12
# 配置全局用户名和邮箱
git config --global user.name "name"
git config --global user.email xxxx@gmail.com

# 凭证存储
# 第一次通过 HTTPS 方式 push 或 pull 时,Git 会要求输入用户名和密码
# (或 Personal Access Token)。操作成功后,"store" 会把凭证以明文格式写入文件
# 以后再访问同一个远程仓库时,Git 会自动读取凭证,不再重复询问
git config --global credential.helper store

# 配置默认分支,现在推荐使用main
git config --global init.defaultBranch main

3. 创建一个新仓库

1
2
3
4
5
# 1. 初始化本地仓库
git init

# 2. 克隆远程仓库
git clone <仓库URL>

4. 工作区域和文件状态

Git中的三种工作区域

  1. 工作区(.git所在目录)

    • 在资源管理器中看到的目录
  2. 暂存区(.git/index)

    • 用于保存即将提交到Git仓库的修改内容
  3. 本地仓库(.git/objects)

    • Git存储代码和版本信息的主要位置

工作区域

Git中的四种文件状态

文件状态


5. 添加和提交文件

git status

查看仓库的状态

git add

将文件添加到暂存区

  • 可以使用通配符:git add *.txt
  • 也可以使用目录:git add .

git commit

提交到本地仓库

  • 只提交暂存区中的内容,不会提交工作区中的内容

git log

查看仓库提交历史记录

  • 使用 --oneline 参数查看简洁的提交记录

git ls-files

查看暂存区的内容


6. git reset回退版本

Git reset的三种模式

  • git reset --soft

    • 回退到某个版本,保留工作区和暂存区的所有内容
  • git reset --hard

    • 回退到某个版本,丢弃工作区和暂存区的所有内容
  • git reset --mixed (默认参数)

    • 回退到某个版本,保留工作区的内容,丢弃暂存区的内容

Git reset模式


7. 使用git diff查看差异

git diff

比较:工作区 🆚 暂存区

git diff HEAD

比较:工作区 + 暂存区 🆚 本地仓库

git diff --cached / git diff --staged

比较:暂存区 🆚 本地仓库

git diff <commit_hash> <commit_hash>

git diff HEAD~ HEAD

比较两个**提交(commit)**之间的差异

git diff <branch_name> <branch_name>

比较两个分支之间的差异


8. Git 删除文件命令

rm file; git add file

  • 先从工作区删除文件
  • 然后使用 git add 让 Git 追踪这次删除(即加入暂存区)

git rm <file>

  • 同时从工作区暂存区删除文件

git rm --cached <file>

  • 只从暂存区删除文件,但保留工作区中的文件(文件依然存在本地)

git rm -r *

  • 递归删除当前目录及子目录下的所有文件和文件夹

提示:删除文件后记得使用 git commit 提交更改!


9. gitignore忽略文件

常见忽略文件列表

  • 忽略日志文件和日志目录
  • 忽略所有 .class 文件
  • 忽略所有 .o 文件(编译生成的中间文件)
  • 忽略所有 .env 文件(包含环境变量配置)
  • 忽略所有 .zip.tar 压缩包
  • 忽略所有 .pem 文件(安全凭证)

一般应该忽略的文件类型

  • 系统或软件自动生成的文件
  • 编译产生的中间文件和结果文件
  • 运行时生成的日志、缓存、临时文件
  • 涉及身份、密码、口令、秘钥等敏感信息的文件

示例 .gitignore 文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 日志文件
*.log

# 编译输出
*.class
*.o

# 环境变量
.env

# 压缩包
*.zip
*.tar

# 安全证书等敏感信息
*.pem

10. SSH配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 1. 回到根目录
cd ~ 或者 cd 直接回车

# 2. 进入ssh文件夹
cd .ssh

# 3. 生成ssh密钥
ssh-keygen -t rsa -b 4096
# -t代表协议为rsa
# -b代表生成大小

# 4. 回车后提醒输入密钥名称
# 如果是第一次使用这个命令,直接回车就行了,使用默认的名称id_rsa
# 如果之前用过最好不要直接回车,会覆盖掉之前的密钥,且操作不可逆
# 输入一个新的名字例如test

# 5. 再回车后提醒输入密码,可以为空直接回车

# 6. 可以看到本地生成了两个文件,一个密钥,一个密钥.pub
# 私钥文件谁都不要给,公钥打开复制到github

# 7. 点开头像-设置-ssh和gpg密钥配置--new ssh key --然后起个名字将公钥粘贴进去

# 8. 如果是第一次配置默认的名称,到此就结束了

# 9. 如果是自己命名的密钥
# 打开 ~/.ssh/config 文件,如果没有就创建,如果有就附加在后面
# 填入
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/test
# 意思是访问github时指定访问test密钥

SSH通过HTTPS端口连接GitHub (解决网络问题)

当无法通过SSH默认端口访问GitHub时,可以通过HTTPS端口(443)绕过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编辑SSH配置文件
nano ~/.ssh/config
# 或
vim ~/.ssh/config

# 添加以下配置
Host github.com
HostName ssh.github.com
Port 443
User git

# 测试连接
ssh -T git@github.com
# 成功会显示:Hi username! You've successfully authenticated, but GitHub does not provide shell access.

# 现在可以正常克隆仓库
git clone git@github.com:Git-xfy/remote-repo.git

这种方法有效的原因:

  1. 许多公司和网络环境会阻止SSH的标准端口(22),但允许HTTPS端口(443)
  2. 这种方法仍使用SSH协议及其安全特性和密钥认证
  3. 通信通过通常允许的HTTPS端口传输,从而绕过防火墙限制

11. 关联本地仓库和远程仓库

git remote add <shortname> <url>

  • shortname - 起一个短名字,一般都是origin
  • url - 要关联的远程仓库地址

git remote -v

查看当前仓库所对应的远程仓库的别名和地址

git branch -M main

将本地仓库当前分支命名为main

  • GitHub默认的主分支名称是main,而本地分支有时候默认是master
  • 如果已经设置过默认分支为main,则不需要此操作

git push -u origin main

把本地分支和远程分支的main关联起来

  • 全称是git push -u origin main:main
  • 将本地的main分支(冒号前)与远程main分支(冒号后)关联起来
  • 名称一样可以省略一个

简化命令

  • 关联后可以直接使用 git push
  • 未关联则需使用 git push <remote_name> <local_branch_name>:<remote_branch_name>

拉取命令

  • 关联后:git pull
  • 未关联:git pull <remote_name> <local_branch_name>:<remote_branch_name>
  • 省略时默认拉取origin的main分支
  • git pull 会自动合并,如有冲突需解决
  • git fetch 是获取后不自动合并

拉取示意图


12. 分支的基本操作

查看分支列表

1
git branch

创建分支

1
git branch <branch-name>

切换分支

1
2
3
4
5
# 传统方式
git checkout <branch-name>

# 推荐方式(Git 2.23+)
git switch <branch-name>

合并分支

1
git merge <branch-name>

删除分支

  • 已合并的分支:
1
git branch -d <branch-name>
  • 未合并的分支:
1
git branch -D <branch-name>

提示:分支操作前,建议先查看当前分支状态:git status。合并前确保工作区干净,删除前确认无误。


13. 解决合并冲突

冲突说明

  • 若两个分支修改了同一个文件的不同位置 → Git会自动合并 ✓
  • 若两个分支修改了同一个文件的相同位置 → 发生冲突 ✗

解决冲突步骤

  1. 手动修改冲突文件,处理冲突内容
  2. 添加到暂存区
    1
    git add <file>
  3. 提交更改
    1
    git commit -m "解决合并冲突"

中止合并操作

如果不想继续合并,可使用以下命令中止合并过程:

1
git merge --abort

提示:合并冲突发生时,Git会标记冲突区域(如 <<<<<<<, =======, >>>>>>>),你需要手动选择保留哪一部分内容。


14. 回退和Rebase

Git Rebase(变基)

命令格式

1
git rebase <branch-name>

作用

将当前分支的提交”转移”到目标分支的最新提交之后,重写提交历史

Rebase vs Merge 区别

比较项 git merge git rebase
历史记录 保留分支历史,产生合并提交 重写提交历史,线性、干净
可读性 可能出现分叉,历史分支交错 历史更线性,便于回顾
是否生成新提交 会生成一个合并提交 不会生成合并提交,重用原提交
冲突处理 只处理一次冲突 每次变基提交可能都需手动解决冲突

什么时候用什么?

  • 使用 merge

    • 团队协作中保留分支历史
    • 避免修改提交历史
    • 合并已推送的公共分支
  • 使用 rebase

    • 自己在本地整理提交历史
    • 保持提交历史简洁、线性
    • 合并前清理开发分支历史,提升可读性

小提示

  • rebase 更适合个人分支开发阶段
  • merge 更适合团队协作与主分支合并
  • 注意:不要对已经推送到远程的公共分支使用 rebase,可能导致历史冲突!