Git学习笔记

1. Git本地基本操作

0. 一些英语翻译
  • stage : 暂存区
  • index: 暂存区
  • working tree: 当前HEAD指向的版本
  • working directory: 工作区
1.创建本地仓库

​ 随便新建一个文件夹,然后执行

1
$ git init

​ 于是这个文件夹就变成了一个本地仓库(会出现一个叫做.git的隐藏文件夹)

2. 一些术语
  • 工作区:就是你在电脑中能看到的目录(即那个文件夹)
  • 暂存区:简单理解的话,就是文件被add之后就会被复制一份并且存储在暂存区
  • github本地仓库:简单理解的话,就是commit之后文件去的地方
  • 版本库:包含了暂存区和本地仓库
3. 四个状态,一些操作
  • 四个状态:untrackedunmodifiedmodifiedstaged

  • 在工作区中新建一个文件之后,输入git status,会发现这个文件是untracked状态
  • 当我们add了这个文件之后,这个文件的状态变为staged,进入了暂存区
  • 然后我们commit这个文件,完成commit之后这个文件库中的文件和本地文件又变为一致,此时这个文件状态变为unmodified

  • 当我们在add完文件之后再对这个文件进行修改,此时这个文件会变成modified状态,并且使用git status命令时会提示我们这个文件被修改了。此时我们可以使用git checkout -- 文件名操作将这个文件回溯为暂存区中的版本。
  • 当我们add并且commit完文件之后再对这个文件进行修改,那么这个文件会变成modified状态。此时我们依旧可以使用git checkout -- 文件名操作将这个文件回溯为本地库中的版本。
  • 如果本地库中的文件版本与工作区的不同,即使我们add了工作区中的文件,这个文件的状态依旧是modified。此时如果我们对这个文件进行checkout,这个文件的内容不会有任何改变。
  • 如果工作区的文件,暂存区的文件和本地库中的文件版本各不相同,那么git checkout -- 文件名会把工作区的文件回溯为暂存区中的版本。

一言以蔽之,在这个文件addcommit之后再做修改,这个文件的状态就会变成modified。然后如果对这个文件执行git checkout --,就会把这个文件回溯到最近一次git commitgit add时候的状态。

4. git log命令

​ 输入git log之后进入一个页面,可以按回车不停往下翻;可以按下键盘上的Q键退出日志;

git log中最重要的部分在于它会显示每个提交的hash值。

5. 如何查看Git中的文件内容和文件目录?
  • 如何查看工作区的文件内容&文件目录? 用文件资源管理器 或 分别用lscat命令

  • 如何查看本地仓库中的文件目录?

    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
2
3
4
$ git reset HEAD^    		# 撤销到上一个版本
$ git reset HEAD^^ # 撤销到上两个版本
$ git reset HEAD~100 # 撤销到上100个版本
$ git reset <commit hash> # 撤销至某一个提交(commit hash是git log中的那串16进制数字,不需要全部输完,只需要输前几个数字就可以了)
  • 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