Git - 分布式版本控制

什么是Git

Git是一个分布式****版本控制系统。这听起来可能有点复杂,但让我们分解一下:

  1. 版本控制:就像给你的代码装上了时光机器。它会跟踪你做的所有更改。
  2. 分布式:它允许多个人在同一项目上工作,而不会相互干扰。

分布式与集中式

集中式:

集中化的版本控制系统 (Centralized Version Control Systems,简称 CVCS****)

SVN:权限控制;比较安全; 开源系统

协同工作的人们都通过客户端 连到这台服务器,取出最新的文件或者提交更新。

分布式:

分布式版本控制系统(Distributed Version Control System****,简称 DVCS****)

客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本 地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

安装

访问下载页,https://git-scm.com/downloads

# 查看默认配置
git config --list --show-origin

# 配置用户信息;这样每次是谁修改文件,git就有标记
git config --global user.name "wys"
git config --global user.email "534096094@qq.com"

# 检查配置
git config --list

概念

三种状态

Git 管理的文件有三种状态:已提交(committed)已修改(modified)已暂存(staged)

  • 已修改表示修改了文件,但还没保存到数据库中(也就是git本地仓库中)。

  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中

  • 已提交表示数据已经安全地保存在本地数据库中。 只有提交了的东西才是永久保存。其余都是临时状态,临时的东西一不小心就丢了

三个分区

工作区暂存区以及 版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
  • 注意:暂存区和版本库都在.git文件夹中,由git统一维护

两类文件

工作目录下的每一个文件都不外乎这两种状态:已跟踪(tracked)未跟踪(untracked)

  1. 已跟踪的文件是指那些被纳入了 版本控制的文件,也就是 Git 已经知道的文件
  2. 未跟踪的文件就是除了已跟踪的剩下所有文件;

基本用法

git init .
git add .
git add index.html
git commit -m "第一次提交"
git status
git add .
git commit -m "第二次修改"
git log
git log --pretty=oneline

时光机

git add hello.txt
git commit -m "第一次修改"
git add hello.txt
git commit -m "第二次修改"
git add hello.txt
git commit -m "第三次修改"
git add hello.txt
git commit -m "第四次修改"
git reset --hard HEAD^

--hard参数

  1. --hard会回退到上个版本的已提交状态
  2. --soft会回退到上个版本的未提交状态
  3. --mixed会回退到上个版本已添加但未提交的状态。

现在,先放心使用--hard

穿梭未来

我们刚才回到过去,此时检查git仓库提交记录

# 1. 你会发现,居然没有了第四次提交; 21世纪回到19世纪,来的时候好好的!然后回不去了!
git log

# 2. 所幸 reflog 记录了我们所有的操作
git reflog

# 3. 传到未来 1094a: 未来的版本号。(5位以上)
git reset --hard 1094a

远程仓库

代码只在本地,即使有历史记录,有数据。哪天本地电脑坏了。硬盘炸了。数据将不可恢复。

我们可以把本地的数据,给远程保存一份

git remote add origin https://gitee.com/leifengyang/mygit-demo1.git

# 展示远程仓库信息
git remote -v

# 展示某个具体的远程仓库信息
git remote show origin

推送数据给远程

第一次推送使用 -u 参数;会把所有数据都推送上去并且本地master分支和远程master分支进行绑定

git push -u origin master

# origin:远程仓库名字
# master:分支名字
# 从远程读取数据
git fetch origin

# 从远程下载数据 + 更新合并到本地
git pull origin
# 跳过暂存区,直接提交
git commit -a -m "第5次提交"

# 将 README.md 改名为 README
git mv README.md README

# 检查状态
git status
# 1. 创建 1.txt 和 2.txt 文件

# 2. 第一次操作
git add 1.txt
# 3. 提交
git commit -m "提交1文件"
# 4. 第二次操作
git add 2.txt
# 5. 如果是普通提交,git commit 则会出现两次提交记录,我们使用 --amend 修复提交的方式
git commit --amend -m "提交1,2文件"

撤销修改

# 1. 给 hello.txt 中添加了新内容
git status # 检查状态,应该为 Modified,此时还没有 git add

# 2. git checkout -- file可以丢弃工作区的修改;
# 真实原理:让这个文件回到最近一次 git commit 或 git add 时的状态。
git checkout -- hello.txt # 或者使用 git restore hello.txt
# 1. 给 hello.txt 中添加了新内容
git status # 检查状态,应该为 Modified
git add hello.txt # 将文件添加到暂存区


# 2. 撤销暂存区中的更改,分为两步
# 1)、先取消添加暂存区操作: 使用 git reset HEAD hello.txt 或者下面
git restore --staged hello.txt
# 2)、再取消修改
git restore hello.txt

分支基础操作

# 1. 创建 名为 testing 的分支
git branch testing

# 2. 查看当前所在分支
git branch
# 输出如下: * 标记当前所在分支
# testing
# * master

# 3. git branch -v: 查看每一个分支的最后一次提交
# 3. 切换到 testing 分支
git checkout testing
git checkout master
# 1. 先来到master
git checkout master

# 2. 把内容合并; ff模式: 尽可能使用 fast forward 模式;(只需要移动master指针即可)
git merge testing -m "合并了"

# 禁用 fast forward 模式
git merge --no-ff testing -m "合并了"
git branch -d testing
删除分支