git学习笔记
1.Git简介
git安装与配置
- 首先从git官网下载git安装,然后再打开git bash,配置以下指令:
//使用--global参数,表明本地所有仓库都使用这个配置,也可以对不同仓库单独配置
git config --global user.name "your name"
git config --global user.email "your email"
//可使用如下命令查看自己的用户名和email
git config [ user.name|email ]
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
- 创建一个新文件夹当作仓库
- 使用
git init
命令把这个目录变成Git可以直接管理的仓库
$ mkdir repositories
$ cd repositories
$ pwd //输出==> '/d/Development Kit/Repositories'
$ git init
pwd命令显示当前路径
使用Git上传文件到仓库
使用Git只能管理一些纯文档的文件,比如文字、代码等,Git每次都能检测到详细的变动,而像音频、图像等二进制形式的文件,Git只能检测到大小变化,无法获取详细的内容变化。
使用Git上传文件到版本库,需先在Git管理下的仓库中执行,子目录也可以,非Git管理目录Git是检测不了的。一般分两步:
-
1、使用
git add filename
告诉Git添加文件filename到仓库$ git add readme.txt //没有任何提示则执行成功 //readme.txt文件内容: i am very happy i got a job
-
2、使用
git commit -m "说明"
提交内容到仓库$ git commit -m "第一次提交readme.txt" [master (root-commit) e5d334f] my first readme 1 file changed, 2 insertions(+) create mode 100644 readme.txt
- 1 file changed : 一个文件改变
- 2 insertions:插入了两行内容
-
使用
git add
可以多次添加多个文件,而git commit
则一次性提交多个文件
$ git add file1.txt
$ git add file2.txt file3.txt
2.时光穿梭机
$ git status //查看工作区的状态,可看到是否有文件被修改,亦或是未准备提交
$ git diff //difference的缩写(unix),可查看文件改变的具体内容
版本回退
commit快照:Git会自动保存历史版本记录,方便用户回退版本
-
使用
git log
查看历史版本记录,每条记录由版本号、作者、修改日期和说明组成git log [--pretty=oneline]
-
git中通常使用
git reset
命令来进行版本回退,其中用head
来表示当前版本,head
是指向当前版本的一个指针
git reset --hard head^ //回退到上一个版本
git reset --hard head^^ //回退到上上个版本
git reset --hard head~100 //回退到往上100个版本
- 若我们回退到了旧版本,但后悔了,想回退到新版本,则只需使用版本号即可
git log
git reset --hard x_xx //版本号可以不用写全,但必须保证不会出现二义性
例如:
$ git reset --hard e94a445ede7bf9706a44ec96ec791f
HEAD is now at e94a445 append GPL
- 使用
git reflog
可以查看历史命令,以确定回到相应版本
$ git reflog
e94a445 (HEAD -> master) HEAD@{0}: reset: moving to e94a445ede7bf9706a44ec96ec791f
26ad658 HEAD@{1}: reset: moving to head^
e94a445 (HEAD -> master) HEAD@{2}: commit: append GPL
26ad658 HEAD@{3}: commit: 覆盖原语句
e5d334f HEAD@{4}: commit (initial): my first readme
工作区和暂存区
1、工作区
即电脑中我们能看到的目录
2、版本库
工作区中有一个隐藏目录.git
,则叫Git的版本库。Git的版本库主要有stage(暂存区)
、Git自动帮我们创建的第一个分支master
,以及指向master
的指针Head
。
注:若在工作区添加了新文件且未提交,则Git会提示untracked file
3、添加文件到版本库
之前我们把文件添加到版本库分为两步,现在再具体剖析一下:
- 首先我们修改后的文件存放在
工作区
中,然后通过git add files
把工作区
中的文件放入暂存区
中。 - 然后使用
git commit -m
命令将暂存区中的所有文件一次性提交到当前分支下。 - commit后且工作区没有做任何改变,则stage暂存区就是空的。
4、关于git diff
git diff //比较工作区和暂存区
git diff HEAD -- filename //比较工作区和仓库
git diff --cached //比较暂存区和仓库
- 若暂存区为空,则比较工作区和仓库。此时
git diff <=> git diff HEAD(比较工作区与仓库)
- 若暂存区不为空,则比较工作区和暂存区。
git diff --cached
比较暂存区和仓库
管理修改
Git基于追踪修改来管理文件版本,只有add到暂存区的文件,才会被commit到仓库中。
若:
- 第一次修改file1 => git add file1 => 第二次修改file1 => git commit -m "",则只会提交第一次的修改版本。
- 如果一个文件修改过了,则应及时加入暂存区,或在commit时先
git status
一下。
撤销修改
git checkout --file //可用于丢弃工作区的修改,让文件回到最近一次'git commit'或'git add'时的状态
两种情况:
1、当文件自修改后还未放入暂存区时,git checkout让文件回到与版本库一样的状态
2、当文件放入暂存区后又做了修改时,git checkout则让文件回到添加到暂存区时一样的状态
删除文件
当我们在工作区删除了一个文件file,使用git status
可以看到文件被删除的操作,如果真要删除这个文件,那么就继续使用
git rm file
,然后再git commit
,文件就彻底从工作区和版本库中删除了。
如果是误删了,则可以使用git checkout -- file
从版本库中恢复最新版本的文件。
PS :一旦执行了git rm file
或手动删除后执行了git add file
,则git checkout -- file
无法恢复,只能回退版本
3.远程仓库
添加一个远程库
现在我们在本地已经有了一个git库,如果我们想在Github上也创建一个远程库,并且让这两个库相互关联、同步。方法如下:
-
首先在Github上新建一个仓库,这里命名为gitStudy
-
接着我们在想与之关联的本地库中,打开Git Bash,然后执行如下命令,执行成功后本地库就与Github上的远程库关联好了。
$ git remote add origin git@github.com:hsn951/gitStudy.git //执行上述指令后,本地库就可与远程库相关联 $ git push -u origin master //把本地内容推送到远程库 //由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 $ git push origin master //之后可直接push
!!!然而,在执行时却报了一个这样的错误
Permission denied (publickey). fatal: Could not read from remote respository.
原因:通常是由于个人Github 平台没有添加公钥,需要进一步添加密钥
解决方法:
1.生成公钥和密钥
右键桌面打开Git Bash,执行ssh-keygen -t rsa -C "xxx@qq.com",直接敲三次回车后生成公钥和密钥。
2.找到c:/user/电脑账户/.ssh/id_rsa.pub文件,复制你的公钥
3.进入Github,点击头像=》找到设置=》找到SSH=》new 一个
最后再执行一遍git push -u 即可。
-
删除远程库
如果我们想要删除一个远程库,通常使用git remote rm 远程库名,其实只是解绑了本地库和远程库的关联$ git remote rm origin $ git remote -v //也可以先在删除前查看一下远程库的信息
从远程库克隆
克隆一个Github上的仓库到本地库
$ git clone git@github.com:hsn951/res_1.git //此处用的是SSH