在本地模拟一个git远程仓库

在本地搭建一个仓库来模拟git的远程仓库,主要是帮助理解一下git作为一个版本控制器的实现过程

创建一个本地共享仓库

首先我们要知道一下git要求共享仓库是一个以.git结尾的目录。
所以我们第一步先新建一个这样的目录

1
2
3
4
5
6
7
8
9
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ mkdir repo.git # 创建以.git结尾目录

92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ cd repo.git # 进入这个目录

92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/repo.git
$ git init --bare # 初始化一个共享仓库,也叫裸仓库 注意选项--bare
Initialized empty Git repository in C:/Users/92816/Desktop/在本地模拟远程仓库/repo.git/

这样就建好了一个共享的仓库,但这时这个仓库是一个空的仓库;其实在远端的也是这个原理,比如我们在github上初始化了一个仓库,也相当于这里的repo.git,这样接下来就可以把它当成一个远端来进行了

创建一个本地的测试仓库

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/repo.git (BARE:master)
$ cd ../

创建一个test1测试目录

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ mkdir test1

创建一个test1测试目录

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ cd ./test1/

创建一个demo01.js文件,touchbash操作命令,可以创建一个文件

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1
$ touch demo01.js

通过vi编辑器简单编辑了一下,当然你也可以拿一个现成的文件

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1
$ vi demo01.js

通过cat查看文件里的内容

1
2
3
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1
$ cat demo01.js
这是第一次创建的demo # 这是demo01.js里的内容

将test1这个测试目录初始化一下,以便进行git相关操作

1
2
3
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1
$ git init
Initialized empty Git repository in C:/Users/92816/Desktop/在本地模拟远程仓库/test1/.git/

将test1中的文件提交到缓存区

1
2
3
4
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ git add .
warning: LF will be replaced by CRLF in demo01.js.
The file will have its original line endings in your working directory.

提交一下描述信息

1
2
3
4
5
6
7
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ git commit -m "test"
[master (root-commit) 891fe92] test
warning: LF will be replaced by CRLF in demo01.js.
The file will have its original line endings in your working directory.
1 file changed, 1 insertion(+)
create mode 100644 demo01.js

推送到本地模拟的共享仓库 repo. gitmaster分支当中

1
2
3
4
5
6
7
8
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ git push ../repo.git/ master
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo.git/
* [new branch] master -> master
git push ../repo.git master

回退到上一级

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ cd ../

将repo. git 克隆到test2当中,因为目录当中没有test2这个目录,会直接新建一个test2目录

1
2
3
4
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ git clone ./repo.git/ test2
Cloning into 'test2'...
done.

进入到test2目录当中

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ cd ./test2

通过ls命令列出test2目录,可以看出里面已经有d emo01.js这个文件了,也就是已经复制过来了

1
2
3
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ ls
demo01.js

通过vi编辑器打开 demo01.js文件,进行了一下修改,添加了“在test2中进行了内容修改”这样一段话

1
2
3
4
5
6
7
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ vi demo01.js

92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ cat demo01.js
这是第一次创建的demo
在test2中进行了内容修改

可以通过git status来查看一下当前的文件状态

1
2
3
4
5
6
7
8
9
10
11
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: demo01.js # 提示文件已经更改了

no changes added to commit (use "git add" and/or "git commit -a")

将更改的demo01. js文件添加到缓存区

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ git add demo01.js

提交一下描述信息

1
2
3
4
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ git commit -m "test"
[master 205e461] test
1 file changed, 1 insertion(+)

将其推送到 repo. gitmaster分支当中

1
2
3
4
5
6
7
8
9
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test2 (master)
$ git push ../repo.git/ master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 295 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo.git/
891fe92..205e461 master -> master

进入到test1目录

1
2
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库
$ cd ./test1

从共享仓库中将内容拉回来

1
2
3
4
5
6
7
8
9
10
11
12
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ git pull ../repo.git/ master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../repo
* branch master -> FETCH_HEAD
Updating 891fe92..205e461
Fast-forward
demo01.js | 1 +
1 file changed, 1 insertion(+)

再次查看现在的demo01. js,你会发现在test2中修改的内容已经在test1中了

1
2
3
4
92816@MrLiu MINGW64 ~/Desktop/在本地模拟远程仓库/test1 (master)
$ cat demo01.js
这是第一次创建的demo
在test2中进行了内容修改

结语

    这样就实现了test2中的修改能够在test1中体现出来了,也就是达到了同步的效用,其实在项目当中,这里模拟的共享仓库就是服务器上部署的仓库,步骤也都差不多,就是不管你哪一个人在自己的本地仓库中进行的修改,你通过git add .或者文件名现将其到缓存区,然后在git commit -m 描述信息,然后再git push ../repo.git/ master就能推送到远端了,这样另一个同事只需要git pull ../repo.git/ master就可以将这个共享仓库中改变的部分拉下来,实现同步功能,总归来说,一般我们用的远端仓库只不过是放在服务器上,可以从外网访问而已。

注意点:我们如果想要利用git进行版本控制,就一定注意需要将现有项目初始化为一个仓库,也就是通过git init或者将一个已有的使用git进行版本控制的仓库克隆到本地git clone 仓库地址,其实这个也不难理解,只有这样git才能知道它要操作的文件,以后就直接可以使用git的相关命令了