资料来源于菜鸟教程、Git教程
Git 仓库分为以下三个区域:
工作区:本地电脑能看到的目录
暂存区:stage/index,一般存放在.git目录下的index文件(.git/index)中,所以我们把暂存区也叫做索引
版本库:存放在工作区的.git目录中
下面两张图第一张来自菜鸟教程,我根据我的理解简答改了一下,第二张来自实验楼。
在开始菜单打开Git Bash窗口,这是Git命令行窗口。
设置用户名:
#全局变量,本台机器所有的仓库都使用这个用户名
git config --global user.name "Your Name"
#某个仓库单独设置用户名
#首先进入仓库的.git目录中
cd 仓库名/.git
#然后设置用户名
git config user.name "Your Name"
设置用户邮箱:
#全局变量,本台机器所有的仓库都使用这个邮箱
git config --global user.email "[email protected]"
#某个仓库单独设置邮箱
#首先进入仓库的.git目录中
cd 仓库名/.git
#然后设置邮箱
git config user.email "[email protected]"
查看设置的参数:
git config -l
假设我们有一个项目存放在一个名为“project”的文件夹下,希望这个项目中的所有文件都可以被Git管理起来。
#进入project所在的目录
cd C:\project
#初始化git,将该目录设置成git能管理的仓库
git init
这里我们可以看到git init之后提示创建了一个空的git仓库,并且在project目录下多了一个.git的文件夹,这表示git仓库已经创建成功了。
我们这里使用了GitHub作为远程仓库,需要你有一个GitHub的账户。
1、Git生成SSH Key
ssh-keygen -t rsa -C "GitHUb注册时的邮箱"
2、打开默认目录:C:\Users\Administrator.ssh下的id_rsr.pub文件,我的电脑上默认是表格文件,但是excel打不开,可以使用记事本打开,复制文件中的key。
3、打开GitHub,登陆账户,进入Account->Settings
4、选择SSH and GPG keys->New SSH key
5、title可以随便填,Key是id_rsr.pub文件中复制过来的。
6、配置成功
7、创建远程仓库
8、创建成功
假设我们在project目录下有一个名为1.txt的文本文件,那我们如何把这个文本文件添加到版本库呢?
#进入project所在的目录
#cd C:\project
#添加1.txt到暂存区
git add 1.txt
#提交暂存区到本地版本库,“write file”是提交说明
#最好是有意义的说明,方便查找历史记录
git commit -m "write file"
#origin可以看做是远程库的别名,可以字节设置,远程库的地址,可以在GitHub的远程仓库中找到
#只需要在第一次提交到远程仓库是设置,之后直接push即可
git remote add origin 远程库的地址
#提交到远程仓库
git push -u origin main
#创建一个文件夹,存放克隆的文件
mkdir dir
#进入创建的文件夹
cd dir
# 克隆远程仓库
git clone 远程仓库的地址
git reset [--soft | --mixed | --read] [HEAD]
--mixed为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致。工作区文件内容保持不变。
git reset HEAD^ #回退所有内容到上一个版本
git reset HEAD^ 1.txt #回退1.txt文件的版本到上一个版本
git reset 版本号 #回退到指定的版本
--soft 用于回退到某个版本
git reset --soft HEAD~3 #回退到上上上一个版本
--hard 撤销工作区中所有为提交的修改内容,将暂存区与工作区都回到上一版本,并删除之前的所有信息提交
git reset--hard HEAD~3 #回退上上上一个版本
git reset --hard bea128 #回退到某个版本回退点之前的所有信息
git reset --hard origin/master #将本地的状态回退到和远程一样
说明:
实例:
当前我们有三次提交记录,test.txt文本的值如图所示:
然后我们使用git reset --hard HEAD~ 回退到上一个版本之后,发现最新的版本已经看不见了,工作区的文件也已经恢复成上一个版本的内容了。如图:
但是现在我想想到最新的那个版本怎么办呢?不着急,在我们回退版本之前,我们使用git log 查看版本库的状态,那个时候最新版本还在的,那真的太好了,我们复制最新版本的ID,如图:
使用git reset --hard 最新版本的ID ,哇哦,最新的版本又回来了。如图:
这个时候有些小伙伴就要说了,如果我回退版本之后把命令行窗口关掉了,找不到最新版本的ID怎么办?不要着急,我们使用git reflog 可以记录每一次的命令,如图,这样就可以了。
假设我们在test.txt文本中增加了一行乱七八糟的东西。
在提交的时候突然发现这一行不需要,想着反正还没有提交,直接把这一行删除不就可以了嘛,这还不简单,那我们来试一试。在没有删除最后一行之前,我们使用git status指令,发现git提醒test.txt有一个修改没有commit,如图:
这个时候,我们直接删除test.txt文本的最后一行,这个时候查看文档,的确最后一行被删除了,这个时候的test.txt和之前一模一样了,但是使用git status指令时发现,git仍然提醒test.txt有一个修改commit。
这个时候怎么办呢?其实git已经给我们提示了,我们使用git restore file 可以丢弃工作区的修改,如图:
当然,其实直接删除最后一行,从文件内容的角度来看也没什么问题,最终结果是删除了嘛,但是我们还是要严谨一些地。
如果你在test.txt文件中添加了一些乱七八糟的东西,并且很不幸的提交到暂存区了,那该怎么办呢?其实git也给了我们提示。当我们把文件提交到暂存区后,我们使用git status指令时,git会提示我们有一个文件将要被commit,并且提示我们如何丢弃这个修改,如图:
首先我们在工作区删除test.txt文件
但是这个时候,在版本库里test.txt文件还存在的,git status就会提示有哪些文件被删除了。
这个时候我们有两个选择。第一种是我们误删除了工作区的test.txt文件,需要从版本库中恢复,使用 git restore test.txt 恢复test.txt文件,注意,这里恢复的是版本库中的test.txt文件,如果你直接在文件中添加了什么东西,没有及时添加到版本库中,是没有办法恢复的。
第二种情况是,我们确定删除test.txt文件,使用git rm test.txt,然后git commit -m "remove"指令即可将test.txt文件从版本库中删除。
git log 查看历史提交记录
git log --oneline 查看历史记录的简洁版本
git log --graph 查看历史中什么时候出现分支、合并
git log --author=用户名 查看指令用户的提交日志
更多指令查询官网
git add file1 file2 #添加一个或多个文件到暂存区
git add dir #添加指定目录到暂存区,包括子目录
git add . # 添加当前目录下的所有文件到暂存区
git commit -m message #提交暂存区到版本库,message可以是一些备注信息
git commit file1 file2 ... -m messge #提交暂存区的指定文件到版本库
git commit -a #修改文件后不需要执行git add 命令,直接来提交
git status #查看用于上次提交之后是否对文件进行再次修改
git status -s #获得简短的输出结果
git diff file #查看工作区和暂存区的差异
git diff --cached/staged file #显示暂存区和上一次提交的差异
git diff first-branch second-branch #显示两次提交之间的差异