Git学习笔记
1. Git本地基本操作
0. 一些英语翻译
- stage : 暂存区
- index: 暂存区
- working tree: 当前HEAD指向的版本
- working directory: 工作区
1.创建本地仓库
随便新建一个文件夹,然后执行
1 | $ git init |
于是这个文件夹就变成了一个本地仓库(会出现一个叫做.git
的隐藏文件夹)
2. 一些术语
- 工作区:就是你在电脑中能看到的目录(即那个文件夹)
- 暂存区:简单理解的话,就是文件被
add
之后就会被复制一份并且存储在暂存区 - github本地仓库:简单理解的话,就是
commit
之后文件去的地方 - 版本库:包含了暂存区和本地仓库
3. 四个状态,一些操作
- 四个状态:
untracked
,unmodified
,modified
,staged
- 在工作区中新建一个文件之后,输入
git status
,会发现这个文件是untracked
状态 - 当我们
add
了这个文件之后,这个文件的状态变为staged
,进入了暂存区 - 然后我们
commit
这个文件,完成commit
之后这个文件库中的文件和本地文件又变为一致,此时这个文件状态变为unmodified
。
- 当我们在
add
完文件之后再对这个文件进行修改,此时这个文件会变成modified
状态,并且使用git status
命令时会提示我们这个文件被修改了。此时我们可以使用git checkout -- 文件名
操作将这个文件回溯为暂存区中的版本。 - 当我们
add
并且commit
完文件之后再对这个文件进行修改,那么这个文件会变成modified
状态。此时我们依旧可以使用git checkout -- 文件名
操作将这个文件回溯为本地库中的版本。 - 如果本地库中的文件版本与工作区的不同,即使我们
add
了工作区中的文件,这个文件的状态依旧是modified
。此时如果我们对这个文件进行checkout
,这个文件的内容不会有任何改变。 - 如果工作区的文件,暂存区的文件和本地库中的文件版本各不相同,那么
git checkout -- 文件名
会把工作区的文件回溯为暂存区中的版本。
一言以蔽之,在这个文件
add
或commit
之后再做修改,这个文件的状态就会变成modified
。然后如果对这个文件执行git checkout --
,就会把这个文件回溯到最近一次git commit
或git add
时候的状态。
4. git log命令
输入git log
之后进入一个页面,可以按回车不停往下翻;可以按下键盘上的Q键退出日志;
git log
中最重要的部分在于它会显示每个提交的hash
值。
5. 如何查看Git中的文件内容和文件目录?
如何查看工作区的文件内容&文件目录? 用文件资源管理器 或 分别用
ls
和cat
命令如何查看本地仓库中的文件目录?
1
$ git ls-tree HEAD
如何查看本地仓库中的某个文件内容?
1
$ git show <commit>:<file> # <commit>是提交的hash值或分支名,<file>是文件名
或
1
$ git show HEAD:<file> # 直接查看当前分支中某个文件的内容
如何查看暂存区中的文件目录?
1
$ git ls-files
如何查看暂存区中的文件内容?
1
$ git show :<file>
6. Git的撤销与回退
git reset
实现版本回退:
- 版本回退可以用
git reset
命令。
1 | $ git reset HEAD^ # 撤销到上一个版本 |
git reset
可以带一些参数,一般有三种版本:mixed
,即默认版本,最常用,执行之后移动HEAD指针,同时回溯暂存区,但不动工作区soft
,使用方法举例:git reset --soft HEAD^
,执行之后移动HEAD指针,不动暂存区和工作区。hard
,使用方法举例:git reset --hard HEAD^
,执行之后即移动HEAD指针,又动暂存区,还动工作区
git reset
之后发现reset
错了,想回到reset
之前的较新的版本,怎么办?没事,只要找到较新的那个版本的
commit hash
,然后还是用git reset <commit hash>
就可以了(这里的<commit hash>
是那个较新版本的commit hash
。git reset
之后发现reset
错了,而且还手滑关掉了命令行窗口,重新打开之后输入git log
发现找不到那个较新版本的commit hash
,怎么办?没事,输入
git reflog
就可以看到之前提交的commit hash
了。
git reset
也可以实现把已经添加到暂存区的对于某个文件的修改撤销掉:
1 | $ git reset HEAD <file_name> |
7. 文件的删除与恢复
删除工作区的文件:
rm <filename>
删除完工作区的文件之后如果这个文件之前被
add
或者commit
过,那么可以git checkout -- <filename>
来恢复。
先执行
rm <filename>
,再执行git rm <filename>
,那么执行完之后这个文件在工作区和暂存区中都被删掉了这个时候可以:先
git reset HEAD <filename>
将文件从本地仓库恢复到暂存区,然后再git checkout -- <filename>
将文件从暂存区恢复到工作区
- 如果直接执行
git rm <filename>
,然后git commit -m "message"
,那么文件会在工作区中保留,然后再暂存区和本地仓库中都消失。
2. Git远程库
1.建立SSH连接
这一步是要让本地PC与远程github建立SSH连接,具体方法为:
打开
powershell
管理员模式,输入1
$ ssh-keygen -t rsa -C "youremail@example.com"
注意:这里的email地址就写注册github时候用的就可以
在C盘用户主目录下找到
.ssh
文件夹,进入,打开id_rsa.pub
,复制其中的内容登录github打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH
Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
- 点“Add Key”,你就应该看到已经添加的Key:
2. 连接远程仓库
在本地仓库中git bash here
,然后在git
中输入:
1 | $ git remote add origin <ssh> |
这里的<ssh>
是github上的仓库中的ssh
端口地址
然后这里的origin
是我们给远程库设置的名字
3. 将本地库的内容推送到远程仓库
- 第一次推送的时候用这个命令:
1 | $ git push -u origin master |
注:git push
命令实际上是把当前分支master
推送到远程
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
- 之后推送的时候就直接:
1 | $ git push origin master |
可以把本地master
分支的最新修改推送至GitHub
4. 断开本地库和远程库之间的连接
1 | $ git remote rm origin |
用这个命令可以断开本地库和远程库之间的连接
3.在Vscode中使用Git
1.可能会遇到的第一个问题
当你打开vscode的source control
模块时,vscode可能会认为你还没有安装git,并建议你安装git。可是你明明已经安装过了git,于是你觉得很奇怪。这里的原因在于你还没有更改vscode的路径。具体方法如下:
- 打开vscode,按下
ctrl
+,
,在settings
中打开搜索栏,搜索git.path
- 点击
Edit in settings.json
文件,进入这个json
文件 - 复制你的
git.exe
的路径,它应该长成D:\application\Git\bin\git.exe
这样。把这个路径复制到那个json
文件"git.path"后面 - 把你复制的路径中的
\
全部改成\\
,不然会报错 - 最终应该长成这样:
"git.path": "D:\\application\\Git\\bin\\git.exe"
(你的路径肯定跟我不一样) - 重启vscode