git

代码版本控制工具
我们在项目开发过程中,经常会需要将代码回退到前一天或者其他的某个时间节点,这个时候我们可以针对情况对代码进行删除等操作,但是这种删除的操作一般代价都比较大,成本比较高,这个时候我们就可以对我们的代码进行版本控制,当然我可以手动的在开发发某个功能之后,将代码文件都保存一份,然后需要更改回退的时候再将保存好的代码复原,但是这样手动的代码版本控制比较麻烦,出错几率高。
两个代码版本控制工具:git/svn
    
两者的区别
    svn
        是集中式管理方式,类似于*集权制,svn会有一个*服务器,所有的代码的版本都是管理在*服务器的,所有开发者都会从*服务器去选择下载想要的版本的代码,也会将写好的代码进行提交
       svn的缺点也很明显:1. 代码版本管理依赖于*服务器,每个客户端无法在本地进行代码的版本控制 2. 一旦*服务器奔溃(宕机)甚至数据泄露或者误删的话,整个项目的代码都没办法找回了
 
    git
       是分布式管理方式, 每一台客户端都可以看作一个*服务器,客户端就可以在本地就进行代码版本管理,为了协同合作和代码保护有时也会需要创建一个远端仓库,因为每个客户端其实都会保留完整的代码版本库,所以安全性大大提升。
 
git    本地基本操作
git也是依赖于命令行工具来执行任务,但git按照后自带GUI可视化界面
git命令行工具中会使用一些linux的操作命令
 
我们从官网下载了git安装包后进行安装,git也是依赖于命令行工具来执行任务的,但是安装的时候会自带一个GUI这样的可视化界面,市场上也有很多可视化GIT操作,例如tortoisegit, 但是一个好的程序员都不使用可视化工具
 
操作
1、创建目录
 
2、进行git仓库的初始化    git init
        Reinitialized existing Git repository in E:/git/love-letter/.git/    初始化了一个空的git仓库在项目目录中的.git文件夹就是本地仓库,里面保存了本地代码
 
3、提交命令    git add .    
    项目目录中所有的代码添加到缓存区里
 
4、查看上一次的提交状态   git status    
    查看当前git的状态,可以看到是
            On branch master
        No commits yet
        Changes to be committed:
       (use "git rm --cached <file>..." to unstage)
       new file:   introduce.md
          new file:   love-letter.md
      描述还没有提交,在缓存区里已经有了新文件
 
5、把缓存区里的文件进行提交,并作出注释    git commit -am '备注的内容'
            这个时候会有一个警告:
            *** Please tell me who you are.
        Run
        git config --global user.email "you@example.com"
        git config --global user.name "Your Name"
        to set your account's default identity.
        Omit --global to set the identity only in this repository.
        fatal: unable to auto-detect email address (got 'Administrator@DCR8WCBA96DBJX9.(none)')
            git进行版本管理的时候,必须得配置一个用户名和邮箱,这样git才能知道操作者是谁,才能运行我们提交
 
6、配置用户名和邮箱
      邮 箱:git config --global user.email "209774229@qq.com"
           用户名:git config --global user.name "Ting"
      接下来就会出现这样的情况:
       [master (root-commit) 8f5a228] 我去抽烟了,此次提交的只是写好了情书的开头,个人介绍中写个了名字
       2 files changed, 8 insertions(+)
       create mode 100644 introduce.md
       create mode 100644 love-letter.md
           8f5a228是此次提交的版本号,显示了此次提交的注释和此次提交的代码的变化  
 
7、查看历史版本    git log
      查看有哪些版本
 
8、查看修改后的内容    git diff
          可以查看一些当前工作区与暂存区(.git)的代码区别
 
9、退回某个版本    
        git reset --hard HEAD^ --------->回退到上一个版本
     git reset --hard HEAD^^ --------->回退到上上个版本
     git reset --hard HEAD~N --------->回退到第N个版本 N是一个整数
        git reset --hard 版本号 --------->回退到指定版本
 
10、查看每次的版本操作    git reflog
        就能看到我们每一次的版本操作,就能找到每个版本的版本号了
 
 
git    本地分支操作
git中提供了分支管理这样的机制,我们可以针对不同的功能模块利用不同的分支来管理(branch)
 
1、创建分支    git branch 分支名
 
2、查看分支    git branch
    包括了自己创建的本地子分支和本地主分支master
    master是创建git init时自动创建的本地组分支,而master前面的*,代表当前所在的分支
    而自己创建的分支为本地子分支
 
3、切换分支    git checkout 分支名   
    切换分支后,进行操作之后,记得也要提交,并且,分支里面的各种操作对于其他分支来说都是独立的,彼此之间不能相互控制版本
 
4、合并分支    git merge 分支名
    当我们项目中某个功能模块开发完成后,比如introduce已经开发完成了,需要切换回master分支,因为master分支上的代码才是真正的项目代码,最终上线的代码都在master中在A分支中执行 git merge B,就是把B分支的代码合并到A分支来
 
5、查看哪个版本在合并时删除了某个文件    git log --diff-filter=D --summary
     当我们合并了分支之后,可能master中有a这个文件,但是在B分支中没有a这个文件,所以合并后可能a这个文件就被误删,这个时候执行:git log --diff-filter=D --summary可以看到是哪个版本在提交的时候删除了
 
6、恢复误删的文件    git checkout 486532~1 文件名+扩展名
    情况主要是因为,master中有两个文件,但是在分支中都各只有一个文件,导致合并过来的时候出现了问题,所以,其实我们应该保证,分支中的代码和master中的文件应该是只能多不能少
 
7、尽量保证进入新创建的分支后,别删除之前的其他的文件,不然的话在和本地主分支合并时会误删文件。当在A中修改了某个文件,在master中合并了,在B中也修改了这个文件,在master中合并的时候会出现冲突,出现>>>><<<<<=====>>>>>描述更改的地方,所以可以利用编辑器来处理冲突,也可以手动的删去不想要的内容,冲突解决完成后,才能再次提交
 
github    远端仓库操作
1、注册github账户并登录
 
2、配置ssh key    ssh-keygen -t rsa -C "github账号的邮箱"
        生成好之后默认是保存在 /c/Users/Administrator/.ssh/id_rsa.pub中
 
3、将id_rsa.pub中生成的key复制到github中的new ssh key中
        在github网站中点击setting里,有个SSH and GPG key
 
4、在git中配置全局email和name
        邮 箱:git config --global user.email "209774229@qq.com"
       用户名:git config --global user.name "tis1002**"
        为了和github远端仓库做联系,我们将email和name配置成github账号的email和name
 
5、与远端仓库关联的两种方式
        1)先建立仓库,再去开发    克隆远端仓库
               a) 在本地执行    git clone远端仓库地址
               b)然后再进行开发合并等操作    每次操作都要add和commit
               c)将本地文件提交到远端仓库中    git push origin master/git push -u origin master -f 强制推上
                    
        2)先建立仓库,再clone,再开发,也可以先开发,再建仓,再关联
               a)搭建node环境
               b)创建本地仓库初始化    git init
               c)进行git本地操作    每次操作都要add和commit
               d)合并以及提交版本    git merge
               f)与远端仓库进行关联    git remote add origin 远端仓库的地址    
               e)提交到远端仓库    git push origin maste/git push -u origin master -f 强制推上
                        在每次push代码到远端的时候应该先git pull一次,将远端代码拉下来之后合并一下,没问题之后再push