Git笔记

一个开源的分布式版本控制系统

二次整理自网络教程。

一.基础概念

1.工作区域

区域构成1

workspace: 工作区,电脑上当前可见的目录。

Index/Stage: 暂存区,临时存放变动。实际上是一个文件,保存即将提交到文件列表的信息。位于.git/index。

Repository: 版本库,即.git。其中HEAD指向最新放入版本库的版本。

Remote: 远程仓库,托管代码的服务器。

区域构成2

2.文件状态

文件状态1

GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

Untracked: 文件未跟踪,位于工作区。没有加入到暂存区,不参与版本控制。通过git add 变为Staged。

Unmodify: 文件位于版本库,未修改。即版本库中的文件快照内容与工作区中完全一致。 这种文件有两个去处,如果它被修改,变为Modified;如果使用git rm移出版本库,则成为Untracked文件。

Modified: 文件已修改,位于工作区。这种文件有两个去处,通过git add可进入暂存staged状态;使用git checkout 则丢弃修改,返回unmodify或staged。

Staged: 文件位于暂存区。执行git commit则将修改同步到版本中。执行git reset HEAD filename取消暂存,文件状态为Modified。

文件状态2

二.命令

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
git init <dir>    #新建git仓库,如果带dirname,则新建目录
git clone --recursive <url> #克隆远程仓库,带--recursive则克隆子仓库

git status <file> #查看文件状态,不带<file>默认查看所有文件

git add <file> # 将文件从工作区添加到暂存区
git restore <file> # 弃置工作区的变动

git rm <file> #将文件从工作区、暂存区、版本库上均删除

git rm --cached <file> # 将文件从暂存区和版本库上删除,但是本地工作区还有。再次add之后会重新添加,使用.gitignore可以避免。
git restore --staged <file> # 将文件的更改从暂存区撤销

git checkout .
git checkout -- <file> #撤销在工作区做的修改,使用暂存区或版本库的文件替换工作区的文件。如果自修改后还没有被放到暂存区,撤销修改就回到和版本库一模一样的状态。如果已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout HEAD .
git checkout HEAD <file> #使用HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和工作区中的文件

git commit -m "备注" # 一次提交暂存区的所有更改到版本库,并备注

git reset HEAD <file> #使用HEAD 指向的 master 分支替换暂存区,工作区不受影响

# 同步submodule
git submodule sync --recursive
git submodule update --init --recursive
1
2
3
4
5
6
7
# 清空一个分支的所有提交记录
git checkout --orphan lastest # 切换到全新的分支
git add . # 缓存所有文件
git commit -m "first commit" # 提交
git branch -d main # 删除main分支
git branch -m main # 重命名当前分支为main
git push -f --set-upstream origin main # 强行推送到远程的main分支
1
2
3
4
5
6
7
# 删除某文件的所有提交记录,去除敏感信息
# 将 PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 这个路径替换成要删除的文件的路径
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
--prune-empty --tag-name-filter cat -- --all
# 强制推送
git push origin --force --all
1
2
3
4
5
6
7
8
9
# 修改上一次commit
git commit --amend
# 修改任意commit
git rebase -i HEAD
# 回退任意commit
# --soft 重置HEAD,不更改暂存区和工作区,回退的变更存在暂存区
# --hard 重置HEAD,更改暂存区和工作区,失去回退的变更
# --mixed 重置HEAD,更改暂存区,回退的变更存在工作区,默认参数
git reset HEAD
1
2
3
4
# 开启大文件存储
git lfs install
# 查看lfs追踪的文件
git lfs ls-files

推荐一个动画演示的在线练习网站

参考

Git 工作区、暂存区和版本库

【Git】---工作区、暂存区、版本库、远程仓库

关于.gitignore怎么保留子目录的子目录这件事 - ViKyanite - 博客园


Git笔记
https://reddish.fun/posts/Notebook/Git-note/
作者
bit704
发布于
2023年1月4日
许可协议