假设这样的目录:
learn-git/
my-repo/
.git/
file1.txt
git 仓库
在一个文件夹中存在 .git
文件夹,就代表这个文件夹被 git 管理了
此处”仓库”的意思并不是说这个 my-repo
是 git 语义下的仓库,它还是我正常用的文件夹,只不过 git 这个软件做出了类似 车间 (工作区),货车 (暂存区),仓库 (本地仓库) 的功能,仓库是指这个,保存了我的所有修改,我可以随时去取
创建仓库
git init [dir]
git clone [url]
不加参数的 init
会把当前目录作为仓库,加了参数会在当前目录下新建这个目录当参数。
文件状态
文件状态分为 untracked、unmodified、modified、staged。
我新建一个文件就是 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 吧,它要是觉得可以合并,那就是没问题,要是他觉得不可以的话: