开启成长之旅!这是我参加「日新计划 12 月更文挑战」的第33天,点击检查活动详情
Git使用入门
创立库房
创立本地库房的方法有两种:
- 一种是创立全新的库房:
git init
,会在当时目录初始化创立库房。 - 另一种是克隆长途库房:
git clone [url]
# 预备一个文件夹“KwebNote”作为库房目录,命令行进入该文件夹
Kwongad@Kwongad-T14 MINGW64 ~
$ cd d:
Kwongad@Kwongad-T14 MINGW64 /d
$ cd Project_Files
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files
# 屡次cd指令进入到库房目录KwebNote:“cd <目录称号>”指令进入目录,“cd ..”返回上级目录(有空格)
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files/github.kwong/KwebNote
# 开端初始化项目,也可指定目录:git init [文件目录]
$ git init
Initialized empty Git repository in D:/Project_Files/github.Kwong/KwebNote/.git/
注意:Git指令的履行,都需在库房目录下。
创立完多出了一个被隐藏的.git
目录,这便是本地库房Git的作业场所。
克隆长途库房,如在github上创立的库房“https://github.com/kwonganding/KWebNote.git
”
$ git clone 'https://github.com/kwonganding/KWebNote.git'
Cloning into 'KWebNote'...
remote: Enumerating objects: 108, done.
remote: Counting objects: 100% (108/108), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 108 (delta 48), reused 88 (delta 34), pack-reused 0
Receiving objects: 100% (108/108), 9.36 KiB | 736.00 KiB/s, done.
Resolving deltas: 100% (48/48), done.
会在当时目录下创立“KWebNote”项目目录。
暂存区add
能够简单了解为,git add
命令便是把要提交的一切修正放到暂存区(Stage),然后,履行git commit
就能够一次性把暂存区的一切修正提交到库房。
指令 | 描绘 |
---|---|
git add [file1] [file2] | 增加文件到暂存区,包含修正的文件、新增的文件 |
git add [dir] | 同上,增加目录到暂存区,包含子目录 |
git add . | 同上,增加一切修正、新增文件(未跟踪)到暂存区 |
git rm [file] | 删去作业区文件,而且将这次删去放入暂存区 |
# 增加指定文件到暂存区,包含被修正的文件
$ git add [file1] [file2] ...
# 增加当时目录的一切文件到暂存区
$ git add .
# 删去作业区文件,而且将这次删去放入暂存区
$ git rm [file1] [file2] ...
# 改名文件,而且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
修正文件“R.md”,未暂存:
履行git add .
暂存:
提交commit-记载
git commit
提交是以时间顺序排列被保存到数据库中的,就如游戏关卡相同,每一次提交(commit)就会产生一条记载:id + 描绘 + 快照内容
。
-
commit id:依据修正的文件内容选用摘要算法(SHA1)核算出不重复的40位字符,这么长是因为Git是分布式的,要保证仅有性、完好性,一般本地指令中能够只用前几位(6)。即使多年今后,依然可通过
id
找到曾经的任何内容和变动,再也不用忧虑丢掉了。 - 描绘:针对本次提交的描绘阐明,主张精确填写,就跟代码中的注释相同,很重要。
-
快照:便是完好的版别文件,以目标树的结构存在库房下
\.git\objects
目录里,这也是Git效率高的秘诀之一。
- SHA1 是一种哈希算法,能够用来生成数据摘要
- Git不适合大的非文本文件,会影响核算摘要、快照的性能。
多个提交就形成了一条时间线,每次提交完,会移动当时分支master
、HEAD
的“指针”方位。
Sourcetree上的前史记载:
一般状况,每完结一个小功能、一个Bu就能够提交一次,这样会形成比较明晰的前史记载。
指令:
指令 | 描绘 |
---|---|
git commit -m ‘阐明’ | 提交改变,参数-m 设置提交的描绘信息,应该正确提交,不带该参数会进入阐明修正形式 |
git commit -a | 参数-a ,表明直接从作业区提交到版别库,略过了git add 进程,不包含新增的文件 |
git commit [file] | 提交暂存区的指定文件到库房区 |
git commit –amend -m | 使用一次新的commit ,替代上一次提交,会修正commit 的hash 值(id) |
git log -n20 | 检查日志(最近20条),不带参数-n 则显现一切日志 |
git log -n20 –oneline | 参数“--oneline ”能够让日志输出更简洁(一行) |
git log -n20 –graph | 参数“--graph ”可视化显现分支关系 |
git log –follow [file] | 显现某个文件的版别前史 |
git blame [file] | 以列表形式显现指定文件的修正记载 |
git reflog | 检查一切可用的前史版别记载(实际是HEAD改变记载),包含被回退的记载(重要) |
git status | 检查本地库房状况,比较常用的指令,加参数-s 简洁形式 |
通过git log
指令能够检查提交记载日志,能够很方便的检查每次提交修正了哪些文件,改了哪些内容,从而进行恢复等操作。
# 提交暂存区到库房区
$ git commit -m [message]
# 提交一切修正到库房
$ git commit -a -m'修正README的版权信息'
# 提交暂存区的指定文件到库房区
$ git commit [file1] [file2] ... -m [message]
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
$ git log -n2
commit 412b56448568ff362ef312507e78797befcf2846 (HEAD -> main)
Author: Kanding <123anding@163.com>
Date: Thu Dec 1 19:02:22 2022 +0800
commit c0ef58e3738f7d54545d8c13d603cddeee328fcb
Author: Kanding <123anding@163.com>
Date: Thu Dec 1 16:52:56 2022 +0800
# 用参数“--oneline”能够让日志输出更简洁(一行)
$ git log -n2 --oneline
5444126 (HEAD -> main, origin/main, origin/HEAD) Update README.md
228362e Merge branch 'main' of github.com:kwonganding/KWebNote
Git的“指针”引证们
Git中最重要的便是提交记载了,其他如标签、分支、HEAD 都对提交记载的“指针”引证,指向这些提交记载,了解这一点很重要。
- 提交记载之间也存在“指针”引证,每个提交会指向其上一个提交。
-
标签 便是对某一个提交记载的的 固定 “指针”引证,取一个别号更简单记忆一些关键节点。存储在作业区根目录下
.git\refs\tags
。 -
分支 也是指向某一个提交记载的“指针”引证,“指针”方位可变,如提交、更新、回滚。存储在作业区根目录下
.git\refs\heads
。 -
HEAD:指向当时活动分支(最新提交)的一个“指针”引证,存在在“
.git/HEAD
”文件中,存储的内容为“ref: refs/heads/master
”。
上图中:
-
HEAD
一直指向当时活动分支,多个分支只能有一个处于活动状况。 - 标签
t1
在某一个提交上创立后,就不会变了。而分支、HEAD
的方位会改变。
打开这些文件内容看看,就更简单了解这些“指针”的真面目了。
# tag
$ git tag -a 'v1' -m'v1版别'
$ cat .git/refs/tags/v1
a2e2c9caea35e176cf61e96ad9d5a929cfb82461
# main分支指向最新的提交
$ cat .git/refs/heads/main
8f4244550c2b6c23a543b741c362b13768442090
# HEAD指向当时活动分支
$ cat .git/HEAD
ref: refs/heads/main
# 切换到dev分支,HEAD指向了dev
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
这里的主分支姓名为“main
”,是因为该库房是从Github上克隆的,Github上创立的库房默认主分支姓名便是“main
”,本地创立的库房默认主分支姓名为“master
”。
“指针”引证:之所以用引号的“指针”,是为了便于统一和了解。和指针原理相似,都是一个指向,只是实际上或许更复杂一点,且不同的“指针”引证会有差异。
提交的仅有标识id,HEAD~n是什么意思?
每一个提交都有一个仅有标识,首要便是提交的hash
值commit id
,在很多指令中会用到,如版别回退、拣选提交等,需要指定一个提交。那标识仅有提交有两种方法:
- 首先便是
commit id
,一个40位编码,指令中使用的时候能够只输入前几位(6位)即可。 - 还有一种便是
HEAD~n
,是根据当时HEAD
方位的一个相对坐标。-
HEAD
表明当时分支的最新版别,是比较常用的参数。 -
HEAD^
上一个版别,HEAD^^
上上一个版别。 -
HEAD~
或HEAD~1
表明上一个版别,以此类推,HEAD^10
为最近第10个版别。 -
HEAD@{2}
在git reflog
日志中标记的提交记载索引。
-
通过git log
、git reflog
能够检查前史日志,能够看每次提交的仅有编号(hash)。差异是git reflog
能够检查一切操作的记载(实际是HEAD改变记载),包含被撤销回退的提交记载。
$ git reflog -n10
5acc914 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~
738748b (dev) HEAD@{1}: reset: moving to HEAD~
9312c3e HEAD@{2}: reset: moving to HEAD~
db03fcb HEAD@{3}: reset: moving to HEAD~
1b81fb3 HEAD@{4}: reset: moving to HEAD~
41ea423 HEAD@{5}: reset: moving to HEAD~
d3e15f9 HEAD@{6}: reset: moving to d3e15f9
1b81fb3 HEAD@{7}: reset: moving to HEAD~1
41ea423 HEAD@{8}: reset: moving to HEAD~
d3e15f9 HEAD@{9}: reset: moving to HEAD~
比较diff
git diff
用来比较不同文件版别之间的差异。
指令 | 描绘 |
---|---|
git diff | 检查暂存区和作业区的差异 |
git diff [file] | 同上,指定文件 |
git diff –cached | 检查已暂存的改动,便是暂存区与新版别HEAD 进行比较 |
git diff –staged | 同上 |
git diff –cached [file] | 同上,指定文件 |
git diff HEAD | 检查已暂存的+未暂存的一切改动,便是与最新版别HEAD 进行比较 |
git diff HEAD~ | 同上,与上一个版别比较。HEAD~ 表明上一个版别,HEAD~10 为最近第10个版别 |
git diff [id] [id] | 检查两次提交之间的差异 |
git diff [branch] | 检查作业区和分支直接的差异 |
☘️画个图更明晰些:
# 检查文件的修正
$ git diff README.md
# 检查两次提交的差异
$ git diff 8f4244 1da22
# 显现今日你写了多少行代码:作业区+暂存区
$ git diff --shortstat "@{0 day ago}"
参考资料
- 博客园 | 浅显易懂Git教程
- 山公都能懂的GIT入门
- 廖雪峰的GIT教程
- 电子书《ProGit-Git教程》
- Gitee码云的 Git 大全,真的挺全
- 敏捷进程实践-git代码分支管理规范
- 易百教程-Git教程?
- 在线Git学习+练习
- GUI Clients Git网站上的GUI工具列表
- Git常用指令集合
️版权声明:版权一切@安木夕,本文内容仅供学习,欢迎纠正、沟通,转载请注明出处!