假设这样的目录:

learn-git/
	my-repo/
		.git/
		file1.txt

git 仓库

在一个文件夹中存在 .git 文件夹,就代表这个文件夹被 git 管理了

此处”仓库”的意思并不是说这个 my-repo 是 git 语义下的仓库,它还是我正常用的文件夹,只不过 git 这个软件做出了类似 车间 (工作区)货车 (暂存区)仓库 (本地仓库) 的功能,仓库是指这个,保存了我的所有修改,我可以随时去取

创建仓库

git init [dir]
git clone [url]

不加参数的 init 会把当前目录作为仓库,加了参数会在当前目录下新建这个目录当参数。

文件状态

文件状态分为 untrackedunmodifiedmodifiedstaged

我新建一个文件就是 untracked,然后 add 之后会变为受 git 管理的画 unmodified,==也就是说,commit 不会鸟 untracked 的文件==。然后再在这个文件上修改就会变成 modified,再 add 一下就会变成 staged 暂存中

将暂存的 commit 后,就会变为 unmodified,相当于一个循环

将暂存的

文件提交

仓库的状态

一切都好,是 ✳️

有未标记的文件,是 ⭐️

add 后,是 ➕

回退版本

git reset --soft
git reset --hard
git reset --mixed

mixed 是当不指定参数时的默认参数,也是最符合直觉的情况,我工作区内容不会变,但是暂存区会变到那个版本

hard 就是工作区暂存区都到那个版本了,该没没,该有有。感觉是用在分支合并我后悔了的情况,可以回到分支合并之前

soft 两个区都会保留,只有 log 变了。没错,只有 log 变了,所以使用场景就是当我 commit 了好几次,结果发现其实打包成一个 commit 就好,就可以 soft reset 然后 commit

hard 误操作

hard 回退是真不要自己的的修改的时候用的,但是如果后悔了怎么办?reflog

查看差异

git diff
git diff HEAD
git diff --cached
git diff HEAD~3 HEAD file3.txt

比较工作区与暂存区;比较工作区与仓库;比较暂存区与仓库

删除文件

【第一种】可以直接操作系统删掉,此时就跟创建一个新文件一样,删掉文件这件事是一个 untracked 的事件,通过 add 来让 git 知道

【第二种】执行两步合一步

git rm <file>

工作区和暂存区全没了,但是版本库里未被删,需要 commit

【第三种】只删除暂存区

git rm --cache <file>

gitignore

有的文件是不应该加入到 git 的

.gitignore 一个隐藏文本文件,里头塞你不要的文件。然后这个文件作为一个文件,也是潜在的会被 git 管理的

如果已经添加到版本库了,再添加到 .gitignore,那就不会被 ignore

远程协作

push = 推送;pull = 拉取

新仓库

clone

关联已有仓库

git remote add origin <url/host>

分支

理论上自己要做什么事都开一个分支做,最后再合并到 main

git branch <branch>
# git checkout <branch>
git switch <branch>

创建分支,然后 checkout 去更改到这个分支

用 switch 吧,因为 checkout 还有别的语义,switch 是专门用来切换分支的

在别的 branch 上创建的文件真的不会在别的分支上看到,在操作系统层面上也是

git switch main
git merge dev
git branch -d dev

先到想合并进去的分支,然后 merge,⚠️ merge 之后,分支依然存在,想要删除,使用 -d,表示删除已经被合并的分支,-D 表示强制删除

冲突

不想思考了,以后在思考,相信 git 吧,它要是觉得可以合并,那就是没问题,要是他觉得不可以的话: