GitHub的创始人是Linus,使用C语言编写,也是最初的Linux开发发起人。
集中式和分布式的版本控制不同:
集中式:版本库是放在中央服务器中的,工作的时候要从服务器取得最新版本之后才开始工作,工作完之后,在提交的中央服务器。必须要有网络。
分布式: 没有中央控制系统,每个人的电脑都有完整的版本库,中央服务器只有来大家交换修改的文件,
git在不同系统上的安装,自行百度。(我现在觉得Kali 系统做的越来越好了,之前在物理机上安装的时候兼容性不是很好)
git - config 命令的 --config 参数,表示这台机器上的所有的仓库都使用这个配置,当然也可以对某个仓库指定不同的用户名和Email
创建一个空的仓库 我实在 opt目录下创建了一个叫做learnGit的仓库 (pwd是用来显示当前的目录) 注:创建完后当前目录下生成一个 .git文件 通过命令:ls -ah 可以查看隐藏文件
注:Git只能跟踪文本文件的控制,没有办法控制图像视频文件。另外一点 Word文件时Microsoft的一种二进制文件,因此没有办法跟踪Word上的改动文件。这里也不推荐使用记事本来写代码,最好使用notepad++(默认编码设置是UTF-8.)
将新建的文本添加到仓库中: 使用 git add 提交文件 ,使用 git commit -m "备注“” 提交的跟踪信息
git status 命令可以帮助我们时刻掌握仓库当前的状态, 下载我们先将readme文件修改 ,然后使用该命令 git status (这个命令跟 linux 下 service status 类似)
上面的显示 readme文件修改了但是没有提交 ,如果我们不知道修改了什么地方 可以使用git diff 来查看修改的地方
可以看我们之前添加了一行,知道修改了之后我们就就将它提交一遍(为了放心,我们在 git commit之前再次 git status一下)
最后提交 备注一下
可以使用 git log 命令查看版本的历史记录
现在来看斑斑的回退 使用命令 git reset -- hard 参数 (在 Git 很重 HEAD 表示当前的版本, 上一个版本是 HEAD^ ,上上一个版本是 HEAD^^ ,如果回退的较多可以写成这样 HEAD ~100 表示第一百个版本)
使用 git log 看看,发现之前的一个记录没有了,
如果想撤销之前的操作,不要关闭窗口,继续 git reset --hard 加上前面的 一串记录数据
git 提供了一个记录每次使用命令 命令 : git reflog
总结 使用 git 回退版本 使用命令 : git reset --hard commit_id
git的目录理解:
工作区: 就是我们刚才建立的一个文件 leanGit。在之前我们创建仓库的时候就产生了一个 .git 文件, 他是git的版本控制文件, git版本仓库中有很多东西,其中最重要的是称为stage的暂存区,还有git创建的第一个master,以及master的一个指针 HEAD,(这里我使用廖老师的图)
在前面回顾一下 : 把文件添加到仓库分成了两步:第一步第 使用 git add 把文件添加进去I(实际上是将文件修改添加到暂存区)--------第二步git commit 将暂存区的所有文件添加到当前分支,因为我们在git版本库的时候创建了唯一的一个master分支,所以 git commit就是往 master分支上提交更改。具体的提交变换工程图解
git管理的是修改,而不是文件 ,为了说明这个做一个实验:
首先对readme问价添加一行 ,然后将他添加到仓库暂存区 ,查看
可以看到gitcommit 只负责对暂存区的修改,
所以再次提交之后才会看到结果,更新
如何撤销修改:在文件提交的的时候发现,文件出现错误,为了及时修改,git提示使用 git checkout -- file 可以丢弃修改工作区的修改。
廖雪峰说 一种是 readme自自改之后还没有放到暂存取,现在撤销修改就回到和版本库一模一样的状态,一种是readme已经次该添加到暂存区后,又做了修改,撤销修改就回到添加暂存区后的状态,总之就是让这个文件回到最近一次 gitcommit或者 git add的状态 。
下面的 使用 git commit 之后使用 git checkout 但是发现一旦使用 该命令 就不能撤销,只能使用 git reset -- hard HEAD参数来进行版本的回退
root@kali:/opt/learnGit# cat readme.txt
readme here learn github git is a version control system git is free software tianyaming add a new line add a new line " my boss is stupid"root@kali:/opt/learnGit# git commit -m "have use the git checkout"[master 26aa3fd] have use the git checkout 1 file changed, 1 insertion(+)root@kali:/opt/learnGit# root@kali:/opt/learnGit# cat readme.txtreadme here learn github git is a version control system git is free software tianyaming add a new line add a new line " my boss is stupid"root@kali:/opt/learnGit# git checkout -- readme.txtroot@kali:/opt/learnGit# cat readme.txtreadme here learn github git is a version control system git is free software tianyaming add a new line add a new line " my boss is stupid"root@kali:/opt/learnGit# 如果使用了git add提交了暂存区,庆幸的是你么有使用commit提交 ,可以使用 git reset HEAD 《file》来回退 之后在使用 git checkout清除工作区来一个总结 ,场景一:当你改乱了工作区的某哟个内容,想直接丢掉工作区使用 git checkout -- file ,场景二:当你改乱了某一个文件的内容,还添加到了暂存区,想丢弃修改,第一步使用 git reset HEAD file 回到场景一 ,之后在使用 git checkout --file 丢掉
git 中还有一种操作就是删除文件:
先添加一个新的文件 test.txt 之后使用 git add 、git commit 提交 到版本控制库
之后使用rm 命令删除文件 test ,删除之后版本库中的并没有删除,所以使用 命令 git rm test 删除版本库 之后使用 git commit 提交版本库 (注:git checkout 的作用就是用版本库替换工作区版本)
远程仓库的操作:
首先就是在本地使用ssh创建密钥对, 才用户仓库目录下面看看,有没有 .ssh 目录 ,如果有在看下面有木有id_rsa和 id_rsa.pub两个文件,如果存在直接跳转下一步
使用 ssh 创建 邮箱GitHub账户的秘钥对 命令: ssh-keygen -t rsa -C " 1214tian@sina.com" 之后会在用户占下面产生秘钥对,复制 公钥到GitHub上
现在我们需要将我们的本地仓库和GitHub上的仓库关联起来,首先登陆GitHub账户创建以个git仓库 learnGit
现在将本地仓库关联到GitHub上,使用命令: git remote add origin git@github.com:SueKayTian/learnGit.git
关联之后将本地仓库的文件全部推送的远程GitHub上 使用命令 : git push -u origin master
本地内容推送到远程,实际上是将当前分支master推送到远程, 由于远程是空的,我们第一次推送的master的时候,加上了参数 -u, 这样GIt 不但会将本地的master分支内容推送到远程master分支,还会将本地的master和远程的master关联起来,在以后的推送和拉取中简化命令
第一次关联后推送的时候会弹出SSH警告 ,在这之后只要本地做了提交就可以使用 git push origin master 来推送
分支管理:
创建一个分支使用命令: git checkout -b (分支名字)
git checkout 命令后面加上-b 参数表示创建并切换,相当于下面的命令 :
git branch dev
git checkout dev
之后使用git branch命令查看列出所有分支,当前的分支结构后面会显示一个 *
那么如何将 dev 的工作合并到master上面, 下面使用命令 将 dev 合并到master 分支上面, git merge命令用于价格制定分支合并到当前分支下面, 合并之后就可以放心的删除之前的 Dev 分支
小结:
查看分支 使用命令: git branch
创建分支: git branch <name>
切换分支: git checkout <name>
创建加上切换分支 : git checkout -b <nmae>
合并分支 : git merge <name>
删除分支 : git branch -d <name>
解决冲突问题: 其实很多时候在合并的时候会出现冲突,该如何解决了 ?
首先我们创建一个分支并迁移到当前分支之下,
git 自动提示我们当前master分支比远程的master分支超前一个提交。这时我们在当前master分支下修改 readme文件 ,现在 master和 featurel上都有了自己的型的提交。
这种情况下git无法进行快速的会合并,只能视图将各自的修改合并,但是会出现冲突
当git无法自动合并分支的时候 ,就必须首先解决冲突问题,提提交在合并。结局冲突的办法就是使用手动编辑的方法合并成我们想要的内容,再次提交 可以使用 命令 git log --graph 查看分支合并图
通常合并分支时,会丢掉分支信息,如果可能Git 使用 fast forward模式,但是在这种模式下,删除分支之后,要强制禁止使用Fast foward模式, Git就会在merge时生成一个新的commit,,这样 从分支历史上就可以看出分支信息
下面使用 --no-ff 方式的git merge 测试
首先创建并切换到 Dev分支下面: 使用命令 : git checkout -b dev
之后修改 readme文件 并提交到当前分支下,
合并的时候命令: git merge --no-ff -m "merge with no-ff "dev
之后使用日志记录来查看修改的历史 : 使用吗命令: git log --graph --pretty=oneline --abbrev-commit
在实际的开发中,我们应该按照几个基本的原则进行分支管理,首先master是非常稳健的分支,仅仅能用来发布新的版本,平时干活的时候不能再上面干活。干活都是在类似Dev的分支上开发,之后再将Dev版本合并发哦master分支上面。每个人都有自己的分支,时不时合并到Dev分支上面。
bug 如何修复,
当你接到一个代号为010的bug任务的时候,很自然的你会想创建一个issue-010来修复,但是如果当前正在Dev上进行的工作还没有提交,这个时候可以利用 stash功能,可以将当前的工作线程隐藏起来,等到以后恢复现场后继续工作。
使用 命令 : git stash
Feature功能
在软件开的过程中总有很多功能会不断地被添加进来 ,添加一个新的功能的时候因为不希望一些实验性质的代码,把主分支搞乱了,所以,每添加一个新的 功能,最好新建有个feature分支,在上面开发,完成后,再进行合并,最后删除feature分支,