Git分布式版本控制系统

集中式(SVN) vs 分布式 (Git)

SVN集中式:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

GIT分布式:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

Git的三棵树

  • 工作区:我们编写代码的文件环境。

  • 暂存区:临时存储区域。

  • 版本库:代码仓库,即分支。文件最终保存的区域。

    img

安装 Git

mac 自带 git,windows 需要安装 git。

 git --version         //  git version 2.23.0.windows.1

安装完成后,还需要最后一步设置,在命令行输入:

 git config --global user.name "Your Name"
 git config --global user.email "email@example.com"

使用git config user.name或git config user.email可以查看用户名和邮箱。

创建版本库

理解成这个目录里面的所有文件都可以被Git管理起来。

创建一个文件夹repo1,命令行进入到这个文件夹。(可以忽略)

 # mkdir repo1 # 创建repo1目录
 cd repo1      # 进入到repo1目录
 # pwd         # 显示当前目录的路径
 # ls          # 显示当前目录的内容

然后把这个目录变为 Git 可以管理的目录

 git init    # git初始化

不报错就是创建成功

把文件添加到代码仓库

在 repo1 这个文件夹里,创建一个名字叫做 a.txt 的文件。里面写点内容,比如写111。

 # touch 是linux中创建文件的命令,如果不习惯,也可以右键新建文件创建a.txt
 touch a.txt # 在当前目录下创建 a.txt 文件,如果装了xcode,可以用 open a.txt -a xcode 来编辑文件

add:工作区->暂存区

第一步,用命令git add告诉Git,把文件添加到仓库

 git add a.txt
命令描述
git add .这表示提交所有有变化的文件
git add abc这表示提交abc这个文件夹
git add *.js这表示提交所有js文件

commit:暂存区->代码库

第二步,用命令git commit告诉Git,把文件提交到仓库:

 git commit -m "日志1"

修改内容-查看状态

把 a.txt 的内容改为222

 git status  # 查看状态

哪些文件被修改了

Changes not staged for commit 指有些文件做了改动,但还没有被提交。

git status 执行完后,提示信息中,告诉我们有些文件做了改动,但还没提交,然后建议我们使用 add 提交,或者使用 checkout 撤销修改。

文件中哪段内容被修改了

如果我们想看到某个文件具体的改动,可以使用 diff 命令。

 git diff a.txt # 查看哪些内容发生了变化
 ​
 git diff 比较的是工作区和暂存区的差别
 git diff --cached 比较的是暂存区和版本库的差别
 git diff HEAD 可以查看工作区和版本库的差别

重新提交

我们把刚才修改过的文件添加一下。

 git add a.txt

然后再次看看它的状态

 git status

这回提示修改的文件已经添加,但没提交,那我们提交一下

 git commit -m "日志2"

然后再次看看它的状态

 git status

这回提示的是没有改动的文件了,即仓库里和本地的文件都一致了。

每当对文件做了一些改动,就要重复的执行上面add和commit。就相当于玩游戏时的存盘,如果哪天想回退,就可以用reset命令了。

版本

log 日志

log 命令显示从最近到最远的提交日志。

 git log

如果嫌弃输出的内容太多,可以加参数,简化输出。

 git log --pretty=oneline
 git log --oneline

版本回退(版本库->工作区)

你看到的一大串类似3628164...882e1e0的是commit id(版本号)

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

 git reset --hard HEAD^

然后查看 a.txt 的内容,发现果然回退到上一版本。

然后继续使用log查看

 git log

发现撤销前的那个版本竟然看不到了,即想回去回不去了,怎么办?

只能想办法找到版本号(如果你命令行窗口未关闭的话)

 git reset --hard 63300dca594

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

如果已经回退到了某个版本,如果想知道回退前的版本号,可以使用reflog找到版本号。

Git提供了一个命令git reflog用来记录你的每一次命令(所有的操作记录)

 git reflog

git的执行流程

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的repo1文件夹就是一个工作区。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

流程

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

撤销修改

工作区->工作区

继续对 a.txt 的内容进行修改,然后保存文件。不要进行 add 和 commit。

在命令行中,使用 checkout 可以撤销修改。

 git checkout -- a.txt   # 注意文件名和--之间有空格

然后打开文件,就发现内容确实撤销了。

暂存区->工作区

如果是对文件内容修改后,已经执行了add,那么撤销就应该用reset了。

 # 先把暂存区的修改,回退到工作区
 git reset HEAD a.txt
 ​
 # 然后撤销工作区的修改
 git checkout -- a.txt

版本库->工作区

如果是对文件内容修改后,已经执行了add,并且已经执行了commit,那么撤销应该这么做:

 git reset --hard HEAD^      # 上文讲过

删除文件

把刚才的 a.txt 删除掉,然后在命令行中输入 git status 能够看到已经删除文件的提示。

如果我们想把已经删除的文件还原回来,可以使用 checkout

 git checkout -- a.txt

如果我们确定删除这个文件,那么就要保证工作区和版本库一致

 git rm a.txt    #版本库中删除 a.txt
 ​
 git add a.txt
 git commit -m '删除了a.txt'

小结

命令示例作用
initgit init初始化git
statusgit status查看版本库状态
addgit add a.txt把a.txt文件由工作区添加到暂存区
commitgit commit -m "日期"把暂存区文件,提交到代码仓库中
diffgit diff a.txt查看a.txt发生了哪些变化
loggit log --pretty=oneline从最近到最远的提交日志
refloggit reflog用来记录你的每一次命令
resetgit reset --hard HEAD^回退到某一个版本(代码仓库->工作区)
resetgit reset HEAD a.txt先把暂存区的修改,回退到工作区(暂存区->工作区)
checkoutgit checkout -- a.txt撤销a.txt文件的操作(工作区->工作区)
rmgit rm a.txt版本库中删除 a.txt
  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值