git基础命令
一、创建版本库
版本库(repository),也称仓库,可以理解为一个目录,这个目录下的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能追踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建仓库,在git bash界面中进入任一文件夹,文件夹可以为空,也可以有内容。
git init
仓库创建后,在文件夹下会多出一个.git的目录,由于文件名前为‘.’的是隐藏文件,所以默认不显示该文件。通过ls -al
命令可以查询。
版本管理系统,只能追踪文本文件的改动,如TXT,程序代码等,Git可以告诉你每一次具体的改动,如在第一行新加了一个单词。但对于图片、视频这些二进制文件,虽然也能有版本管理系统管理,但没法追踪文件具体的变化,
1.1将文件放入本地仓库
第一步,将文件Git Command.md文件添加到暂存区(Stage)。
git add Git Command.md
若上述命令执行后没有返回任何结果,则说明执行成功。Unix的哲学“没有消息就是好消息”。
第二步,将暂存区中的所有内容提交到当前分支。
git commit -m "your explanation regarding this commit"
-m
:是指将关于此次commit的提示信息上传。
-a
:忽略git add
这一步,直接使用git commit -a
提交
综上,将文件提交到仓库一共两步。若是认为两步比较复杂,可以加-a
参数直接提交。
git commit -am "your explanation regarding this commit"
注意: -am
只能用于已有内容修改的上传,若新增一个文件,此时直接使用git commit -am
会报错
二、时光机穿梭
通过git status
命令查看仓库当前的状态:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
返回结果为nothing to commit,working tree clean
。说明当前的仓库与文件夹是一致的,没有未提交内容。
若要查看本地仓库与文件夹的差异,可以使用git diff
查看具体的difference
2.1 版本回退
当然,身为版本管理系统,自然可以跳转到某个时刻的版本,前提条件是在跳转到的时刻,你自己保存过,也就是玩游戏中的快照。
git commit
就是起到保存快照的作用,你可以跳转到任意一次commit
时的版本。
通过git log
可以查看快照的历史记录。
黄色字体commit 后的一串数字是SHA1计算出的数字,为16进制,这样做是为了避免多人协作时版本号发生冲突。而且git会将每次commit
的版本串成时间轴。
(HEAD -> master)表示现在文件夹的内容对应着这条commit的版本,也就是当前版本。
在Git中HEAD
表示当前版本,HEAD^
表示上一版本,HEAD^^
表示上上版本,上20版本用HEAD~20
表示。
回退命令为:git reset
$ git reset --hard HEAD^
HEAD is now at 8e84a25 2021.9.20 morning
现在查看文件夹中的内容,可以发现已经回退到之前的版本了。如果想回退回去,那我们使用git log
会发现原来的版本已经不存在了,最新的版本即是最后一次回退到的版本。
好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
方法1:只要你此次的git窗口没有关闭,你可以向上找到之前版本的commit id,按id返回指定的版本。
版本号可以只写前几位,git会自动补全,但也不能只写一两位。
方法2:如果你关闭了git窗口,一段时间后又想回到未来,就必须找到commit的id。Git提供了git reflog
来记录每一次命令
如图左侧就是每一次commit的前7位id,通过这些就可以回到未来了。
2.2 工作区和暂存区
工作区(Working Directory):
就是电脑中直接可以看到的目录,例如我在E盘根目录下建的git-test子目录。
之前初始化git仓库时,若目录为空,系统返回的正是working tree clean
版本库(Repository):
工作区有一个隐藏目录git,这个是git的版本库。版本库中存放了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master的一个指针HEAD
上面的git add
命令正是将修改提交到暂存区(Stage),然后通过git commit
一次性将暂存区中的所有内容提交到当前分支。
Git跟踪管理的是修改而并非文件
2.3 撤销修改
2.3.1 丢弃工作区的修改
第一种情况:当你对文件进行了错误的修改,在没有提交暂存区前,此时使用git status
,结果如下:
此时我想撤回工作区中错误的修改,可以直接使用git checkout -- filename
若无返回信息,则表示撤销成功,此时我们看文件中已经恢复到修改前的状态。
第二种情况 :当你对文件进行了错误的修改,而且已经将此次修改提交到了暂存区但还没提交到分支,使用git status
,结果如下:
此时你又做了修改,要撤回工作区的修改,可以直接使用git checkout -- filename
总之,这条命令就是让工作区回到最近的一次commit
或add
的状态。
2.3.2 丢弃暂存区的修改
故事是这样的,老板第二天开会要项目的展示,你不得不熬夜加班赶做项目,熬到凌晨4点好不容易完成了项目,你下意识的在注释中写了句问候老板的话,又下意识的使用了git add
提交到了暂存区,正当你准备提交到分支时,你突然清醒过来。
别慌,Git也为此做了准备,git reset HEAD <file>
可以把暂存区的修改回退到工作区,当我们用HEAD
时,表示最新的版本。
使用后,就回到了刚刚对工作区进行修改,但却没有提交到缓存区时的状态,如下图所示。
别急,此时你的文件中对老板的问候依然存在,需要对工作区的修改进行撤销。git checkout -- filename
2.3.3 丢弃版本库的修改
就是你把问候的内容通过commit
推到了本地分支。这个时候参考2.1版本回退,即git reset --hard <commit id>
或git reset --hard HEAD^
。
2.4 删除文件
但你直接删除工作区的文件时,如果没有同时删除版本库中对应的文件,git会显示不一致。如下图所示,会提示你没有将修改提交到暂存区(删除文件也是一种修改)
接下来可以使用git rm filename
或者git add .
来将暂存区的该文件删除。最后使用git commit -m "message"
来将版本库中的文件彻底删除。
来更新版本库。
如果你不小心删错了文件,可以使用git checkout -- filename
,将版本库中的版本替换工作区的版本。