目录
git工作原理
图源某CSDN@小蓝稳住
git的工作原理可以分成三个模块:
workspace(工作区)、Repository(版本库)、Remote(远程仓库)
Workspace 工作区
workspace 可以理解为本地计算机中的实际工作目录,增删改文件是会在workspace里直接体现的
Repository 版本库
Repository 虽然说是版本库,其实是一个.git隐藏文件(如下图)
Repository 会记录我们使用git的每一次add,每一次commit,以及我们使用的历史命令等版本信息
下面是Workspace 和 Repository 的关系(图源廖雪峰官网)
**Repository **里面会有一个 stage(暂存区)和仓库的若干分支(当我们创建仓库的时候会默认创建一个master分支)
当我们使用命令 $ git add <fileName>
git版本库中就会将文件的修改情况更新到 stage 中
当使用命令 $ git commit -m [message]
版本库暂存区中所有文件修改都会更新到 master分支 上去
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改
**HEAD **可以理解为一个指针,指向当前分支的最近一次提交
Remote 远程仓库
Remote 是远程仓库,其实 个人电脑的版本控制在有Repository的情况下是足够的
Remote的作用就是,提供了一个远程备份,这样做有两个好处:
- 计算机数据损失后仍然可以通过远程仓库备份恢复数据
- 其他人可以从远程仓库拉取备份,从而实现多人合作
所以commit以后可以通过$ git push
把最近提交推送至远程仓库进行备份
我们也可以通过 $ git clone
去克隆一份别人仓库的备份到自己电脑上
在多人协作的时候,
A本地的更新如果想被团队中其他人所获取,需要通过$ git push
推送到远程仓库
同样,A更新并推送修改至远程仓库后,B可以 $ git pull
拉取A修改后的版本
git基本使用流程
创建工作区文件夹
$ mkdir mydir
# 进入工作区文件夹
$ cd mydir
# 显示工作区文件夹路径
$ pwd
初始化仓库
$ cd mydir
$ git init
该操作会在工作区文件夹内生成一个 .git文件,.git文件就是版本库
将工作区文件添加到版本库缓存区
假如我在 mydir 工作目录里面添加了一个test1.txt文件,现在要将其同步到版本库中去
$ git add <filename>
# 或者添加所有修改文件
$ git add.
现在版本库的缓存区内已经有了 test1.txt 的信息了
此时又在工作目录里新建了一个文件 Readme.md 同理
$ git add <filename>
将缓存区文件提交到git仓库
$ git commit -m "I commit two new files: test1.txt and Readme.md"
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
状态查询
查看当前仓库状态
$ git status
查看某个文件与最近一次提交的差别
$ git diff <filename>
查看提交日志
$ git log
查看历史命令
$ git relog
版本跳跃
提交后回退到上一个版本
$ git reset --hard HEAD^
回退到指定版本
$ git reset --hard <commit_id>
# commit_id 可以通过 git reflog 查看
撤销修改
文件修改在工作区,未add,撤销工作区修改
# 让文件回到最近一次 git commit 或 git add 时的状态
$ git checkout -- <filename>
文件已add,未commit , 回退暂存区
# 该操作会回到上面那种情景
$ git reset HEAD <file>
文件已commit, 则进行版本回退(参考版本跳跃部分)
文件删除
文件删除会多一个操作
当 从工作目录里删除一个文件的时候,git知道我们删除了
使用$ git status
可以看到git给我们的提示
此时 我们需要进行以下操作来让git真的删除这个文件
$ git rm <filename>
$ git commit -m "delete file ......"
远程仓库
如何添加远程仓库以及从远程仓库克隆
廖雪峰官网:
添加远程库 - 廖雪峰的官方网站 (liaoxuefeng.com)
从远程库克隆 - 廖雪峰的官方网站 (liaoxuefeng.com)
分支管理
比较复杂,详见廖雪峰官网
分支管理 - 廖雪峰的官方网站 (liaoxuefeng.com)
比较基本的用法是:
将本地改动推送到远程仓库
$ git push origin master
将远程仓库的最新改动更新到本地仓库
$ git pull