Git原理

关于版本控制

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

  • 本地版本控制系统(一个软件,记录文件夹的变化,保存一些基本的信息)。
  • 集中式版本控制系统(SVN,一个服务器,在自己的电脑上操作,操作后推送到中心服务器上,别人想操作时,从服务器上下载下来在操作,之后在推送,以此类推,服务器起到中间搭建的作用。问题:服务器坏掉,则导致所有人无法操作;推送需要联网条件。)
  • 分布式版本控制系统(Git,做好的东西先提交到本地仓库,最后在提交到远程仓库,好处:断网了,可以先提交到本地仓库;其他人的东西的毁坏不影响你。)

集中式(SVN)和分布式(Git)版本控制系统的简单比较

  • 是否有中央服务器:
  1. SVN有,开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。开发者不能脱离服务器工作。
  2. Git没有中央服务器,开发人员都有Local Respository。
  • 网络依赖:
  1. SVN必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制。
  2. Git在没有网络的情况下也可以执行commit,查看版本提交记录,以及分支操作,再有网络的情况下执行push到Remote Repository。
  • 文件存储格式:
  1. SVN按照原始文件存储,体积较大。
  2. Git按照数据方式存储,体积较小。
  • 是否有版本号:
  1. SVN有
  2. Git没有
  • 分支操作的影响
  1. SVN创建新的分支则所有人都会拥有和你一样的分支。
  2. Git分支操作不会影响其他开发人员。
  • 提交
  1. SVN提交的文件会直接记录到中央版本库
  2. Git提交是本地操作,需要执行Push操作才会到主要版本库。

git的优势:

诞生于2005年,Linux开源社区。

  • 速度快
  • 简单的设计,原理简单
  • 允许上千个并行分支
  • 分布式管理系统

在仓库(Git)中文件的三种状态:

  • 已提交(mommitted)该文件已经被安全地保存在本地数据库中了,可以被push到GitHub上了。
  • 已修改(modified)修改了某个文件,但还没有提交保存。
  • 已暂存(staged)把修改的文件放在下次提交时要保存的清单中。(提交到的是本地仓库,不是远程仓库)

起步:

设置用户名和邮箱,因为东西Push到github上时,是有个记录的,记录展示的就是姓名和邮箱。

 git config --global user.name "lliqi"
 git config --global user.email "[email protected]"
--global的意思是,设置一次之后,所有的仓库都可以使用,就不需要在设置了。

Clone项目

用于把一个GitHub的项目clone(下载)到本地变为本地仓库。

git clone [email protected]:lliqi/blog.git
cd blog//切换到blog目录下

添加文件并提交

touch a.md//创建文件
echo "hello" > a.md//在文件中写入一个字符串
git status //查看文件的状态,要先git add . (把当前文件夹下的所有文件都放入暂存区)
git add . 
git status
Git原理_第1张图片
1.png
git reset HEAD ... //把文件拿出来的命令

下一步

git commit -am "add "//所有的变动提交到本地仓库
git status
Git原理_第2张图片
2.png

利用git push

git push//操作失败的情况下,应该使用git push origin master,使用过这个命令一次后,直接使用git push就可以了。(把当前本地库里面的改动推送到远程库(origin)的master分支)
git status

修改删除文件

远程仓库可能被修改,所以你直接在之前的仓库上修改,可能会报错,因为远程被修改,有一些东西你之前的额本地仓库是没有的,


Git原理_第3张图片
3.png

为避免这种情况,应该先把远程仓库变为本地仓库

git pull

git pull之后会进入到如下界面

Git原理_第4张图片
4.png

相当于git自动把远程的代码拉过来和自己的做了一个合并,合并之后打开了一个vim编辑器,如果觉得信息没用,可以删除重新添加,也可以直接保存退出。
Git原理_第5张图片
5.png

每次访问远程仓库,一定要先git pull

每次修改文件后,git status后,会发现文件处于待放入暂存区状态,所以git add . git commit -am "add" git push等。git commit -a没有m,会自动进入一个vim编辑器,需要添加一些消息。
删除文件同理:rm b.md
git add . git commit -am "add" git push
每次操作完想推送,必须先推送到本地仓库

问题

  • .git/文件夹,表示是一个仓库。
    在GitHub上没有建立仓库,需要本地创建,之后推送
- 把本地空文件夹变成一个仓库
**(空文件夹才可以执行git init)**
git init
a.png
之后进行文件的推送,但并不知道要推送到哪里,所以要执行
git remote add origin [email protected]:lliqi/blogtest.git
把远程仓库起一个名字叫Origin把它保存起来。
Git原理_第6张图片
b.png

Git原理_第7张图片
c.png
  • 标签含义:
**git remote -v //查看本地库里记录的远程库地址
git remote add origin [email protected]:lliqi/bt.git //这里把远程库的地址添加个标签叫origin
git push origin master //推送远程库地址**
git push -f origin master // 慎用,这样会强制推送,会覆盖别人的代码。
git remote add gitlab [email protected]:lliqi/bt.git //在添加一个远程库的标签
git push gitlab master //推送到gitlab标签的地址上
git remote remove gitlab //删除gitlab标签
git remote set-url origin [email protected]:lliqi/bt/git //修改origin标签对应的地址
git remote rename gitlab coding // 把gitlab标签改名为coding

本地库可以推送到任何有权限的地方。

分支操作:

  • git branch -a //查看所有的分支
    绿色代表:本地分支
    红色的代表:远程分支
    *代表当前我们所处的分支,我们当前处于本地仓库的主干master上。


    e.png
  • git branch dev //创建本地dev分支


    Git原理_第8张图片
    f.png
  • git checkout dev // 切换到dev分支,同一个文件夹,切换到不同的分支,就会展现不同的状态。
touch b.md
git add .
git commit -am "add"
  • git push origin dev //推送到origin的dev分支上


    Git原理_第9张图片
    g.png
dev的东西和master合并
git checkout master
git merge dev
推送到等待局域,远程库master还没有
Git原理_第10张图片
h.png
最后再把所有的推送到远程库里
git push origin master
远程库已经存在
Git原理_第11张图片
i.png

冲突:

  • 当自己和别人改同一个文件的同一个地方,在执行git pull时更新本地合并时会出现冲突
  • 解决办法
  1. 修改冲突文件
  2. 重新提交
  • git clone url 和git pull 有什么区别:
  1. git clone将会克隆一个本地库,git clone会为被克隆的远程仓库创建一个名为origin的本地仓库,并为远程仓库的活动分支创建一个本地分支以及远程跟踪分支。
  2. git pull是拉取远程分支到本地仓库的操作,相当于从远程仓库获取最新版本,之后与之前的版本进行merge。
  • 本地仓库和远程仓库有什么区别:
    本地仓库就是电脑上的一个仓库,远程仓库就是在服务器上的仓库,在本地进行操作的文件,会先Push到本地是仓库,进入暂存区,之后再被Push到远程仓库。
  • origin代表什么:远程地址存储的名称,master远程地址的主干。

你可能感兴趣的:(Git原理)