1.git是分布式版本控制系统;
2.版本控制系统分为集中式,分布式
3.集中式版本控制系统,版本库是集中存放在中央服务器的,中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
4.集中式与分布式的区别
①集中式版本控制系统commit必须联网,分布式不需要联网
②虽然分布式不需要联网也可以进行提交操作,但是在协作开发中也需要建立一个中央服务器,用于多人开发提交
③这里有几个概念:本地、服务器、中央服务器(远程服务器)。每一次
commit是提交到本本机的服务器,这个不需要联网,正所谓的版本管理,就是要方便我
们知道每一个版本,比如回到之前的某个版本(这是其一),而且回退到某个之前的版
本,也是从本机的服务器拿的数据,这些都不需要联网。而 SVN 的每一次 commit 都需
要联网,这就需要网络的等待。 Git只有在Push、pull 的时候需要联网,而我们平时更
多的操作应是commit。
再有就是,断网的情况下,SVN也能工作,但是由于没有版本控制的记录,当多人修改
后就比较难以快速的合并,但是Git都在本地保存了版本记录,所以大家合并起来就方便
得多了。
5.所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB
.git指令集
mkdir xxx 创建xxx文件夹
cd 移动
pwd 显示当前目录
git init 将当前目录变成Git可以管理的仓库
ls 查看当前目录下的文件
ls -ah 查看当前目录下的文件(包括隐藏文件)
git add xxx 告诉Git,把xxx文件添加到仓库
可以add多个文件,一次commit;
git commit -m “xxxxx” 告诉Git,把文件提交到仓库,-m为本次提交说明
提交成功后:
[master 8509df9] 提交了文件
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
解读:
1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。
git status 时刻掌握仓库当前的状态
git diff 查看difference
git log 查看历史记录
git reset --hard HEAD^ 版本回退到上一步
HEAD指向的版本就是当前版本,
git reflog 记录每一次命令
cat xxx 查看xxx文件的内容
一:修改文件后没有add和commit
git checkout – xxx
把xxx文件在工作区的修改全部撤销,这里有两种情况:
一种是xxx自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是xxx已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
二:修改文件后执行add没有执行commit
如果修改文件后,执行git add 了,想要撤销,分两步,①将暂存区清空
git reset HEAD xxx 可以把暂存区的修改撤销掉(unstage),重新放回工作区
②执行git checkout命令撤销修改
git checkout – xxx
三:修改文件后,执行了add和commit
git reset --hard HEAD^
相当于以下场景
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
rm test.txt 删除test.txt文件,但是并没有删掉版本库中的该文件
可以使用git checkout – test.txt 还原
如果要删除掉版本库中的文件需要执行
git rm test.txt 命令再进行commit
如果未执行rm test.txt命令直接执行git rm test.txt命令直接将工作区和版本库中该文件都删掉了最后执行commit命令
如果修改的文件没有commit,删除后,无法还原修改后的文件,只能恢复到上一个commit的HEAD
git remote add origin git@github(gitee).com:path/repo-name.git 关联一个远程库
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
git push origin master 把本地master分支的最新修改推送至GitHub
git clone 你的githup地址 克隆命令
查看分支:git branch
创建分支:git branch xxx
切换分支:git checkout xxx
创建+切换分支:git checkout -b xxx
合并某分支到当前分支:git merge xxx
删除分支:git branch -d xxx
git log --graph 可以看到分支合并图。
git merge --no-ff -m " " xxx 禁用快进模式,合并时会再commit一次
如果不禁用,是将主分支的指针直接指向需要合并的分支
git stash 将当前工作现场隐藏起来
git stash list 查看隐藏的工作现场
git stash drop 恢复工作现场并删除缓存的stash
如果有多个隐藏的工作现场
git stash apply stash@{0} 恢复指定的隐藏工作现场
如果新建的分支add并且commit了,但是现在不想将他融合到主分支,需要销毁git branch -d xxx 会报错 需要写成 git branch -D xxx
git remote -v 查看远程库信息
git tag v1.0 创建v1.0的标签,默认打在最新commit上
git tag 查看所有标签
git tag v0.9 commitId 创建commit id为xxx的标签
git show v1.0 查看标签1.0的具体信息
git tag -a v0.1 -m “version 0.1 released” 1094adb 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -d v0.1 删除标签
git push origin v1.0 远程推送标签
git push origin --tags 一次性推送全部尚未推送的标签
如果需要删除远程库的标签需要先删除本地的标签,然后
git push origin :refs/tags/tagName 删除远程的标签
git remote rm origin 删除关联的远程库
git remote -v 查看远程库信息
多人协作
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branchName推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branchName推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to branchName origin/branchName。
工作区和暂存区
git init 后该文件夹就是一个工作区
在该文件夹下.git隐藏文件夹是Git的版本库
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
git可以忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files …
在Git工作区的根目录下创建一个特殊的.gitignore文件
忽略文件的原则是:
忽略操作系统自动生成的文件,比如缩略图等;
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
遇到需要忽略文件的时候,再研究…