GitHub的创始人是Linus,使用C语言编写,也是最初的Linux开发发起人。linux
集中式和分布式的版本控制不一样: git
集中式:版本库是放在中央服务器中的,工做的时候要从服务器取得最新版本以后才开始工做,工做完以后,在提交的中央服务器。必需要有网络。github
分布式: 没有中央控制系统,每一个人的电脑都有完整的版本库,中央服务器只有来你们交换修改的文件,服务器
git在不一样系统上的安装,自行百度。(我如今以为Kali 系统作的愈来愈好了,以前在物理机上安装的时候兼容性不是很好) 网络
git - config 命令的 --config 参数,表示这台机器上的全部的仓库都使用这个配置,固然也能够对某个仓库指定不一样的用户名和Email并发
建立一个空的仓库 我实在 opt目录下建立了一个叫作learnGit的仓库 (pwd是用来显示当前的目录) 注:建立完后当前目录下生成一个 .git文件 经过命令:ls -ah 能够查看隐藏文件ssh
注: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.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 checkout -- readme.txt
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 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分支,