Git 操作指南
管理系统分为集中式管理系统和分布式管理系统
集中式管理系统:所有文件保存到中央服务器上,每个设备上只保存一个副本,每次更新,需要从中央服务器上下载最新的副本,然后传回到中央服务器;
缺点:网络连接出现错误,无法工作;
分布式管理系统:分布式管理系统不需要中央服务器,每个设备都是一个完整的版本库,可以在本地进行修改;
1 Git 简介
git是目前世界上最先进的分布式版本控制系统
2 在windows上安装Git
在官网直接下载安装Git - Downloads (git-scm.com)
完成安装后
打开终端win+r
,输入cmd
打开终端,输入git -v
可以看到git的版本,安装成功
打开Git Bash
,显示安装成功
3 Git使用
Git使用方式:
- 命令行(最基本)
- 图形化界面(GUI)
- IDE (vscode)
3.1 Git 命令行配置
在命令行输入命令,注意:该命令只需要输入一次
$ git config --global user.name"你的Github用户名"
$ git config --global user.email"github邮箱“
$ git config --global credential.helper store //保存用户名和密码
$ git config --global --list //查看config配置信息
2.修改
//覆盖的形式
$ git config --global user.name "yourname"
$ git config --global user.email "your@email.com"
//替换的形式
$ git config --global --replace-all user.name "yourname"
$ git config --global --replace-all user.email "your@eamil.com"
3.删除
$ git config --global --unset user.name "yourname"
$ git config --global --unset user.name "your@eamil.com"
git config
命令是--global
表示你这台机器上的所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和email地址
4 创建仓库(版本库)
repository 这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,添加等操作,Git都能跟踪,方便任何时候可以追踪历史或者还原到之前的某一个版本。
创建仓库的方式:
- 在自己电脑本地直接创建一个仓库;
- 从远程服务器上克隆一个已经存在的仓库;
4.1 使用命令创建仓库
1.在本地创建一个仓库(文件夹),选择Git Bash打开
2.使用
git init
命令把这个目录变成Git可以管理的仓库
可以看到,在文件家中出现了隐藏文件.git,同时,命令行发生了变化,master
表示当前所在分支
$ ls -a //查看当前目录所有文件,包含隐藏文件
注:该目录是隐藏的,需要打开隐藏文件夹
3.查看.git文件中包含文件
使用cd .git
进入.git文件目录下,使用ls -altr
查看所有文件
注意:$ git init
会在文件夹中出现一个隐藏的文件.git
,这个文件是用来Git来跟踪管理版本库的,没有特殊情况,不允许更改。
git init
命令可以指定文件夹,会在Cpp_project目录下创建my_project的git仓库
$ git init my_project
4.2 git clone 命令同步远程仓库
可以使用git clone
命令同步创建仓库
将Github上的仓库同步到本地仓库,可以看到,该目录下存放同步的文件
5 Git 工作区域和文件状态
使用Git操作,首先我们需要知道Git的几个工作区域和文件状态
5.1 工作区域
主要分为:
- 工作区:工作目录或者本地工作目录,就是自己电脑上的目录,.git所在的目录;
- 暂存区:工作区中的隐藏目录**.git**,是Git的版本库,版本库中有个最重要的称为
stage
(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的指针head
。用于临时保存即将提交到Git仓库的修改内容,中间区域; - 本地仓库:本地仓库,就是通过
git init
创建的目录,存储代码和版本信息的主要文职;
工作流程:
把文件往Git版本库添加的时候,是分两步执行的:
-
当在工作区完成修改后,
git add
将他们添加到暂存区; -
使用
git commit
提交修改,实际上是把暂存区的所有内容提交到当前分支;因为在创建Git版本库,Git会自动创建了
master
分支,所以,git commit
就是往master分支上提交更改;
举例:
1.在工作目录创建readme.md文件,内容随便写;
使用git status
查看状态,可以看到readme.md
文件从来没被添加过,他的状态是Untracked
;
- 使用
git add
,把readme.md
进行添加,再git status
查看,可以看到,暂缓区添加了readme.md
文件,git add
命令将提交的所有修改放到暂缓区(Stage),然后执行git commit
可以把一次性暂缓区的所有修改提交到分支;
git commit
提交到分支;
如果工作区没有任何修改,那么工作区是干净的;
5.2 文件状态
文件状态主要分为4类:
- Untrack(未跟踪):新创建的,未被Git管理的文件;
- Unmodified(未修改):已经被Git管理起来,但是文件内容没有变化;
- Modified(已修改):修改了的文件,还没添加到暂存区;
- Staged(已暂存):修改之后,添加到暂存区内的文件;
6 添加和提交文件
git init //创建仓库
git status //查看仓库状态
git add //添加到暂存区
git commit //提交
- 创建一个文件,创建方式按照自己的方式即可,可以在文件夹中看到创建了
file.txt
文件;
$ echo "这是第一个文件">file.txt
$ ls //查看文件
$ cat file.txt //查看文件内容
$ git status //查看仓库状态
git add
命令将文件放到暂存区
git add file.txt
git status //再次查看当前状态
git restore --staged file.txt //撤销暂存区的文件
git commit
提交到仓库
git commit
只会提交暂存区中的文件,不会提交工作区中新的文件,红色是未跟踪的状态;
git commit -m "your message"
提交
git commit -m "your message"
提交完成后,再次查看仓库状态,可以看到,绿色的file.txt已经不见,红色还在;
git add *.txt //将以txt结尾的文件提交到暂存区
git add . //将当前文件夹下的所有文件都添加到暂存区
注:使用
git commit
不使用-m
来提交,会进入vim界面交互信息使用
i
输入提示信息,用ESC
返回到命令模式,输入:wq
保存退出;
- 使用
git log
查看提交记录
git log --oneline //查看简介的提交记录
7 时间回溯版本
7.1 git reset 的三种模式
git reset //回退命令,退回某一版本
git reset --soft //回退某一版本,保存工作区和暂存区的修改内容
git reset --hard //回退某一版本,丢弃工作区和暂存区的所有修改内容
git reset --mixed //回退某一版本,只保留工作区的修改内容,丢弃暂存区
git reset --hard HEAD^ //回退上一个版本
git reset --hard HEAD^^//回退两个版本
git reset --hard HEAD~100//回退100个版本
注意:谨慎使用hard参数
若是不小心误操作,没有关系,Git中的操作都是可以回溯的
git reflog //查看我们的操作的历史记录
8 常用文件操作
8.1 git diff 查看工作区 暂存区 本地仓库之间的差异
- 使用
git log --oneline
查看提交记录;
- 修改 file.txt中的内容;
vi file.txt //修改file.txt中的内容
- 使用
git diff
, 第一行提示发生变更的文件,第二行显示哈希值,绿色显示添加的内容,红色显示删除的内容;
- 添加到暂存区,再使用
git diff
发现不显示内容,表示暂存区和工作区内容是相同的;
- 比较工作区和版本库之间的差异,
git diff HEAD
- 比较暂存区和版本库之间的差异,
git diff --cached
- 暂存区提交到版本库
git commit -m "success"
,再次比较,无显示;
- 比较两个特定版本之间的差异
git log --oneline //查看当前仓库提交记录
gif diff 版本id1 版本id2
git diff HEAD~ HEAD //比较当前版本与上一版本
git diff HEAD^ HEAD
git diff HEAD~2 HEAD //比较当前版本与上两个版本
git diff HEAD~2 HEAD file.txt //指定文件的差异内容
8.2 删除版本库文件
ls -ltr //查看版本库文件
rm file03.txt //删除工作区指定文件, 此时工作区和版本库不一致
git status //查看仓库状态
可以看出已经删除了file03.txt
,但似乎提示工作区和版本库中不一致,但是提示git add
更新暂存区;
git ls-files //查看暂存区中文件,暂存区中文件并未删除
git add/rm file.txt //再删除暂存区,删除暂存区的file03.txt
git add . //再删除暂存区
git commit -m "delete file03.txt" //再次提交
流程:删除工作区中文件,更新暂存区,删除暂存区中文件,再
git commit
提交,文件从版本库中删除
Git 提供了更优的选择,使用git rm
删掉,并且git commit
,这样文件就从版本库中删除了;
git rm <file>
工作区和暂存区同时删除
git rm file01.txt //删除文件
git status //查看状态 删除
ls //查看工作区 删除
git ls-files //查看暂存区 删除
- 再次提交
git commit -m "delete file"
总结:删除后注意不要忘记
git commit -m
提交
9 GitHub远程仓库操作
首先,你得有一个GitHub账号!先去注册一个账号吧~
9.1 配置SSH密钥
使用SSH方式,必须要配置SSH密钥。
使用git clone
命令 加上仓库地址 ,第一次使用SSH命令克隆,会出现:
一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为使用SSH连接,而SSH连接再第一次验证GitHub服务器,需要要整密钥,输入yes
即可
cd
回到用户根目录,cd .ssh
进入到.ssh
这个目录
- 使用
ssh-keygen -t rsa -b 4096
命令
**注意:如果是第一次使用这个命令,直接回车即可,他会在根目录下生成一个id_rsa的密钥文件,但是如果你已经配置过SSH密钥了,最好不要直接回车,会直接覆盖密钥文件,因此需要重新输入一个新的文件名如:test **
ls -ltr
显示文件目录,这样我们的密钥生成了
test
是私钥文件
test.pub
是公钥文件,打开公钥文件,复制公钥文件的内容,回到GitHub中,在右上角头像Setting—> SSH and GPG keys—>New SSH key,将在公钥文件复制的内容粘贴到下面的输入框中,添加成功,SSH密钥配置完成;
注意:如果你是第一次配置密钥,没有更改默认文件,那么已经配置完成
### 9.2 提交文件
- 从远程仓库下载下来的文件,可以看到,本地仓库已经同步
git add .
添加文件到暂存区,git commit -m
提交;
git ls-files
查看仓库状态,可以看到仓库里多了一个文件,但是这只是本地仓库的状态,并未提交到远程仓库中;
这是因为,远程仓库和本地仓库是两个仓库,他们之间是相互独立的,因此需要一个机制同步本地仓库和远程仓库的修改内容;
4. git pull
和git push
git push //将本地仓库的修改推送到远程仓库
git pull //将远程仓库的修改拉取到本地仓库
- 切换分支
$git branch -m master main
- 复制URL,回到命令行,看一下本地仓库,将本地仓库与远程仓库连接起来
在zl_cpp_project
文件中创建了file.txt
文件,git add
和git commit
;
和GitHub关联起来git remote add origin <url>
$git remote add origin Github仓库地址
执行完成后,使用git remote -v
查看
git clone url //下载远程仓库
新建一个文件夹my_project
,进行git add
和git commit
git push -u origin main
本地与远程进行关联
git push -u origin main
git remote -v
如果远程仓库修改了一些内容,拉去远程仓库内容:
git pull origin main
// git fetch命令 只获取远程仓库的修改