git的简介
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
集中式版本控制系统(svn):
中间是中央服务器,其他所有电脑都需要从中checkout代码下来。只有中央服务器管理着各个版本的代码。其他电脑需要操作时都要和中央服务器交互。如果中央服务器离线或者故障,其他电脑就没法与中央服务器交互。
分布式版本控制系统(git):
分布式每一台电脑都有版本的Database,就不用担心中央服务器离线或者故障。因为本地就有版本的Database,所以可以实现离线操作。分布式也可以有一个中央服务器,但仅仅用于其他成员相互协作,也可以不通过服务器进行协作。
git和svn的区别:
svn需要比较版本之间的不同,然后在进行合并。而git会储存当前版本所有内容,并不需要与其他版本进行比较差异,体现了效率的地方。
git安装与简单配置
1.git的安装:
到git官网下载最新版本git,然后根据安装提示默认next,安装成功就可以了。
安装完成后,在开始菜单里面找到 “Git –> Git Bash”,如下:
会弹出一个类似的命令窗口,就说明Git安装成功。
2.git配置的三个级别:
git配置有三个级别分别是:
git config –local
local是优先级最高的配置,它针对的是当前的仓库。
git config –global
global是优先级第二的配置,它针对的是当前的用户。
git config –system
system是优先级最低的配置,它针对的是系统。
3.查看git的帮助文档:
查看帮助文档的指令:
git config --help
查看git的配置类别:
git config --list
4.git的基本配置:
用户名和邮箱配置
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
设置用户名的指令:
git config --global user.name "用户名"
查询用户名的指令:
git config user.name
设置邮箱的指令:
git config --global user.email "邮箱"
查询邮箱的指令:
git config user.email
如图所示:
**注意:**git config –global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
代理配置
我们有时可能是通过代理上网,所以这时我们也应该为git配置代理才能正常使用git。
设置全局http代理指令:
git config --global http.proxy http://user:password@address:port
eg:
git config –global http.proxy http://aa:111@172.1.2.5:8080
设置全局https代理指令:
git config --global https.proxy https://user:password@address:port
设置完成后,可以通过如下命令来查看设置是否生效:
git config –-get –-global http (或 https).proxy
需要删除代理设置,那么可以使用:
git config --system (或 --global 或 --local) --unset http.proxy
来删除设置。
git基本的工作流程
1.创建版本库:
什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。
所以创建一个版本库也非常简单,如下我是D盘 –> www下 目录下新建一个testgit版本库。
pwd 命令是用于显示当前的目录。
通过命令 git init 把这个目录变成git可以管理的仓库,如下:
这时候在testgit目录下会多了一个.git的目录(一般会被隐藏起来),这个目录是Git来跟踪管理版本的。可以通过:cd .git命令打开。
2.git的工作原理
- working directory:工作区,编辑代码的区域。
- staging area:暂存区,相当于是工作区和历史仓库中间的一个缓冲,代表的需要提交的一个状态。
- history repository:历史仓库。
使用的相关命令:
git add:将工作区的文件添加到暂存区。
git commit:将暂存区的文件添加到历史仓库里。
git status:查看工作区和暂存区之间的区别。
git rm:删除暂存区中不需要的东西。
git mv:移动或重命名文件
git ignore:忽略一些不需要添加到暂存区和历史仓库的东西。
3.git的基本操作
1.git的添加和提交:
demo演示如下:
我在版本库testgit目录下新建一个记事本文件 readme.txt 内容如下:11111111
第一步:使用命令 git add readme.txt添加到暂存区里面去。如下:
如果和上面一样,没有任何提示,说明已经添加成功了。
第二步:用命令 git commit告诉Git,把文件提交到仓库。
现在我们已经提交了一个readme.txt文件了,我们下面可以通过命令git status来查看是否还有文件未提交,如下:
说明没有任何文件未提交,但是我现在继续来改下readme.txt内容,比如我在下面添加一行2222222222内容,继续使用git status来查看下结果,如下:
上面的命令告诉我们 readme.txt文件已被修改,但是未被提交的修改。
接下来我想看下readme.txt文件到底改了什么内容,如何查看呢?可以使用如下命令:
git diff readme.txt 如下:
如上可以看到,readme.txt文件内容从一行11111111改成 二行 添加了一行22222222内容。
知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add 第二步是:git commit)。
如下:
全部添加的指令:
git add -A
2.git的修改撤销:
比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下:
首先在做撤销之前,我们可以先用 git status 查看下当前的状态。如下所示:
在未提交之前,我发现添加5555555555555内容有误,所以我得马上恢复以前的版本,首先在做撤销之前,我们可以先用 git status 查看下当前的状态。如下所示:
可以发现,Git会告诉你,git checkout — file 可以丢弃工作区的修改,如下命令:
git checkout – readme.txt,如下所示:
命令 git checkout –readme.txt 意思就是,把readme.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:
readme.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。
另外一种是readme.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。
对于第二种情况,我想我们继续做demo来看下,假如现在我对readme.txt添加一行 内容为6666666666666,我git add 增加到暂存区后,接着添加内容7777777,我想通过撤销命令让其回到暂存区后的状态。如下所示:
3.git删除文件
假如我现在版本库testgit目录添加一个文件b.txt,然后提交。如下:
如上:一般情况下,可以直接在文件目录中把文件删了,或者使用如上rm命令:(注:只是删除了工作区里的文件,可以通过checkout版本库,找回删除文件)
rm b.txt
如果我想彻底从版本库中删掉了此文件的话,执行命令:
git rm b.txt
4.远程仓库
在了解之前,先注册github账号,由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要一点设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,直接跳过此如下命令,如果没有的话,打开命令行,
输入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”
由于我本地此前运行过一次,所以本地有,如下所示:
id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步:登录github,打开” settings”中的SSH Keys页面,然后点击“Add SSH Key”,填上任意title,在Key文本框里黏贴id_rsa.pub文件的内容。
点击 Add Key,你就应该可以看到已经添加的key。
1.如何添加远程库?
现在的情景是:我们已经在本地创建了一个Git仓库后,又想在github创建一个Git仓库,并且希望这两个仓库进行远程同步,这样github的仓库可以作为备份,又可以其他人通过该仓库来协作。
首先,登录github上,然后在右上角找到“create a new repo”创建一个新的仓库。如下:
在Repository name填入testgit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前,在GitHub上的这个testgit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。
现在,我们根据GitHub的提示,在本地的testgit仓库下运行命令:
git remote add origin https://github.com/tugenhua0707/testgit.git
所有的如下:
把本地库的内容推送到远程,使用 git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了 –u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来, 在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了(注:上面的过程会提示输入github的用户名和密码)
效果如下所示:
从现在起,只要本地作了添加和提交后,就可以通过如下命令:
git push origin master
把本地master分支的最新修改推送到github上了,现在你就拥有了真正的分布式版本库了。
2. 如何从远程库克隆?
上面我们了解了先有本地库,后有远程库时候,如何关联远程库。
假如远程库有新的内容了,我想克隆到本地来 如何克隆呢?
首先,登录github,创建一个新的仓库,名字叫testgit2.如下:
如下,我们看到:
现在,远程库已经准备好了,下一步是使用命令git clone克隆一个本地库了。如下所示:
接着在我本地目录下 生成testgit2目录了,如下所示:
5.分支的创建与合并
当前情况,在git里面只有一个master分支,这个分支叫主分支。现在来创建dev分支,然后切换到dev分支上。如下操作:
git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令
git branch dev
git checkout dev
git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。然后我们在dev分支上继续做demo,比如我们现在在readme.txt再增加一行 7777777777777
首先我们先来查看下readme.txt内容,接着添加内容77777777,如下:
现在dev分支工作已完成,现在我们切换到主分支master上,继续查看readme.txt内容如下:
现在我们可以把dev分支上的内容合并到分支master上了,可以在master分支上,使用如下命令 git merge dev 如下所示:
git merge命令用于合并指定分支到当前分支上,合并后,再查看readme.txt内容,可以看到,和dev分支最新提交的是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,我们可以接着删除dev分支了,操作如下:
总结创建与合并分支命令如下:
查看分支:git branch
创建分支:git branch name****
切换分支:git checkout name
创建+切换分支:git checkout –b name
合并某分支到当前分支:git merge name
删除分支:git branch –d name
分支策略:
首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
Git基本常用命令如下:
mkdir: XX (创建一个空目录 XX指目录名)
pwd: 显示当前目录的路径。
git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
git add XX 把xx文件添加到暂存区去。
git commit –m “XX” 提交文件 –m 后面的是注释。
git status 查看仓库状态
git diff XX 查看XX文件修改了那些内容
git log 查看历史记录
git reset –hard HEAD^ 或者 git reset –hard HEAD~ 回退到上一个版本
(如果想回退到100个版本,使用git reset –hard HEAD~100 )
git cat XX 查看XX文件内容
git reflog 查看历史记录的版本号id
git checkout — XX 把XX文件在工作区的修改全部撤销。
git rm XX 删除XX文件
git remote add origin https://github.com/tugenhua0707/testgit 关联一个远程库
git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库
git clone https://github.com/tugenhua0707/testgit 从远程库中克隆
git checkout –b dev 创建dev分支 并切换到dev分支上
git branch 查看当前所有的分支
git checkout master 切换回master分支
git merge dev 在当前的分支上合并dev分支
git branch –d dev 删除dev分支
git branch name 创建分支
git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 查看所有被隐藏的文件列表
git stash apply 恢复被隐藏的文件,但是内容不删除
git stash drop 删除文件
git stash pop 恢复文件的同时 也删除文件
git remote 查看远程库的信息
git remote –v 查看远程库的详细信息
git push origin master Git会把master分支推送到远程库对应的远程分支上