Git使用基础介绍

git教程:
一、git的简介:
    -git是分布式版本控制系统由Linus为Linux用C语言写的。
  -什么是集中式版本控制系统:
       版本库是集中存放在中央服务器,干活的时候用自己的电脑,
    所以要先从中央服务器取得最新的版本,然后开始干活,干完活后在将自己的活推送到服务器。
    缺点:必须联网。
  -什么是分布式版本控制系统:有一台充当中央服务器的电脑,但是这台电脑不仅仅用来方便交换大家的修改,
          没有他大家一样干活,只是交换修改不方便。
       优点:不必联网,     
    强大的分支管理
   
二、Git的安装
    -在Windows上使用Git直接从官网上下载,然后按默认安装完成就行,安装成功后在菜单找到Git-Git Bash,弹出类似命令窗口的东西说明安装成功。
 安装成功后:
 $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
三、创建版本库
1、什么是版本库?版本库就是仓库英文repository相当于目录,目录里面的文件都可以被Git管理,
每个文件删除,修改,Git都可以追踪,以便任何时候都可以追踪历史,或者在将来某个时刻可以被还原。
2、开始创建,版本提交:
     -建一个空的文件夹
  -在文件夹中创建一个文件
  -在git bash命令中,在该目录下使用命令 git init进行初始化,此时文件夹下会出现一个.git文件夹,如果看不见,请选择显示隐藏文件夹。
  -在使用git add file 命令,将文件加入管理仓里。命令,将文件加入管理仓里。
  -使用命令 git commit -m "wrote a readme file "
 
  git commit命令后面-m输入本次提交的说明,可以输入任何信息。
  -为什么需要add,commit两步:因为commit可以一次提交多个文件,所以可以多次add文件
  -git status命令:让我们时刻掌握着仓库当前的状态。
  -git diff+文件:显示具体更改的内容。
  -查看更改情况后再将文件提交到仓库git add
3、版本回退:
     -git log 查看日志 最近三次的更改情况
  -git reset --hard HEAD^回退到上个版本号
    HEAD当前版本 HEAD^上个版本 HEAD^^上上个版本,HEAD~100回退到100个版本。
  -当回退到上个版本了,再想回来就必须找到commit id。Git提供了一个命令git reflog来记录每一次的命令。
  git reset --hard commit_id
4、工作区和暂存区
     - Git和其他版本控制系统SVN等的不同之处就是暂存区。
     -工作区就是文件夹
     -工作区里面有个隐藏的.git目录,这个不算工作区,而是Git的版本库。
     Git的版本库有很多东西,其中最重要的就是stage(或index)的暂存区,Git为我们自动创建了第一个分支master,以及master的指针HEAD
  -第一步git add 文件名 把文件往Git版本库中添加进去,实际上就是把文件修改添加到暂存区。
  第二部git commit提交更改,实际上就是把暂存区的内容提交到当前分支。
5、撤销修改:
    -当改乱了工作区某个文件的内容,想直接丢掉工作区的修改时,用git checkout --file
 -当你不但改乱了工作区某个文件的内容,还添加到 了暂存区时,想丢弃修改,分两步
 第一步:git reset HEAD<file>然后回到场景1按照场景一操作。

6、删除文件:
- rm text.txt
-当git知道删除了文件,工作区和版本库就 不一致了,git status命令就会告诉那些文件被删除了。
-此时有两种做法:-1、确定在版本库中删除该文件,用命令git rm test.txt删掉然后commit.
--2、删除了版本库里面还有,可以轻松的将文件恢复到最新版本。git checkout --test.txt.
-git checkout 其实是笨笨酷里面的版本替代工作区的版本,无论是修改还是删除,都可以一键还原。

四、远程仓库
1-、git是分布式版本仓库控制系统,同一个git仓库可以分布到不同的机器上。
 -最早,只有一台机器有一个原始版本库,此后的机器可以克隆这个原始的版本库,而且每台机器的版本仓库其实都是一样的。
2-、搭建远程仓:
 -GitHub是一一个提供git仓库托管的网站。
本地仓库和GitHub仓库之间的传输是通过ssh加密的,所以需要设置:
 -第一步:创建ssh key,在主目录下查看是否有.ssh,如果有查看是否有id_rsa和id_rsa.pub文件,如果有直接跳过该步。
          如果没有,打开shell(Windows下打开git bash)创建ssh key。
    -$ssh-keygen -t rsa -C"your email@example"
    -在.ssh目录下面找到.id_rsa和id_rsa.pub这就是ssh key的两个秘钥,id_rsa是私钥,id_rsa.pub是公钥。
 -第二步:登录GitHub,在account setting,ssh key页面进行设置。
           点击Add ssh key填上任意title,在key文本框里面粘贴id_rsa.pub点击add ssh就已经添加key。
   为什么需要ssh?因为GitHub需要识别出推送的是你提交的,而不是别人冒充的,而git支持ssh协议,所以GitHub知道你的公钥就可以确定只有你才能推送。
   GitHub允许添加多个key。    
五、添加远程仓:
   1-、现在已经在本地创建了一个git仓库后,又想在GitHub上创建一个git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库就既可以作为备份,又可以让别人通过该仓来协助。
    -、登录github后create a new repository,在repository name中填入仓库名字learngit,其他保持默认,就成功创建了一个git仓库。
   2、目前在github上的learngit还是空的,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库。
   3、在本地仓运行命令:
      - $git remote add origin git@github.com:yourusername/learngit.git  
      -此时本地仓与远程仓关联。
  
   -将本地仓的内容推送到远程仓:
   $git push -u origin master
  
   由于第一次推送,远程仓中没有东西,加上参数-ugit不但会把本地仓的master分支推送到远程新的master分支,还会把本地的master分支和远程的master关联起来。
  在以后的推送或者拉去中就可以简化命令。
   $git push origin master
六、从远程仓克隆:
    1-、先创建远程库,然后从远程库中克隆。
  -create a new repository
  -repository name:gitskill
  -选择initialize this repository with a README,这样github为我们创建一个README.md文件。
 2-、 远程库已经准备好了,下一步就是克隆:
  -、$git clone git@github.com:yourusername/gitskill.git
七、分支管理:
    1-、当你创建了一个分支,别人看不见,还继续在原来的分支上正常工作,而你在自己分分支上干活,想提交就提交,知道开发完毕,再一次性的合并到原来的分支上。
    2、创建与合并分支:
       -创建分支,实际就是创建一个指针,head指向master,创建新指针后,如果合并则master会与新指针合并,回退就是删除指针。
   
    -创建dev分支,然后切换dev分支:
    -$git checkout -b dev
    -git checkout命令加上参数-b表示创建并切换,相当于:
    -$git branch dev
    -$git checkout dev
    -然后用git branch命令查看当前分支
    -$git branch:会列出所有分支,当前分支会标*
    -然后就可以在dev分支上正常提交。
    -切回master分支
     $git checkout master
  现在再查看,刚才添加的内容不见了,因为刚才提交的是在dev分支上,现在在master分支上。
    -现在把dev分支的工作成果合并到master分支上
        $git merge dev
  合并后就可以将dev分支删除了。
  $git branch -d dev
 3-、总结:
    -查看分支:git branch
    -创建分支:git branch <name>
    -切换分支:git checkout<name>
    -穿件切换分支:git checkout -b <name>
    -合并某个分支到当前分支:git merge <name>
    -删除分支:git branch -d<name>
八、解决冲突:
    1-、创建新分支
     -$git checkout -b feature1
     -修改readme.txt文件
     -在feature1分支上提交
     -$git add readme.txt
     -$git commit -m "and simple" 
  -切换到master分支上:
   $git checkout master
   git会自动提示我们当前master分支比远程的master分支要超前1个提交
   在master分支上把readm.txt文件最后一行改为&simple
   -提交:$git add readme.txt
          $git commit -m "&simple"
     -现在master和feature1各自分别有了新的提交。
  -在这种情况下,git无法执行快速合并,只能试图把自己修改的合并起来,但是这种合并可能会有冲突。
  -当查看readme.txt文件时会标出分支不同的内容分。
  -我们修改为文件如下:
  Creating a new branch is quick and simole.
  -用带参数的git log看分支合并的情况:
  $git log --graph --pretty=online --abbrev-commit
  -最后删除feature1分支
  $git branch -b feature1
  2、总结:
         -先创建分支,修改文件,在分支上提交。
         -切换到master,修改文件,在分支上提交。
   -合并,出现错误。
   -查看文件,看两个分支的不同手动修改文件
   -提交,删除创建新分支。
   -完成。
九、分支策略:
    1、通常合并时,如果可能,git会用Fast forward模式,但是这种模式下,删除分支,会丢掉分支信息。
       如果禁用Fast forward模式,git就会在merge时生成一个新的commit,这样,从分支既可以看出分支信息。
 2、创建新分支:  
    -$git checkout -b dev
    -修改文件,并提交新的commit
    -切回master:
    $git checkout master
    -合并分支:
    $git merge --no-ff -m "merge with no-ff"dev
    本次要创建一个新的commit所以带-m
    -然后用git log --graph --pretty=oneline --obbrve-commit
    查看。
  3、在实际开发中应按照几个基本原则进行分支管理。
   -master非常稳定,也就是仅用来新版本发布,平时不能在上面干活。
   -平时都在分支上干活,分支是不稳定的。到某个时候,再把分支合并到master上。每个人都在分支上干活,是不是的合并到分支上就可以了。
 
九、bug分支
    1-、软件开发中遇到需要修复的bug时,需要将当前的分支进行工作现场存储。
   -$git stash。
   等以后恢复现场后继续工作。
   -git status查看工作区
   -git stash list 查看存储的工作现场
   -1、git stash apply恢复,但是stash内容并没有删除,还需要
    git stash drop进行删除
   - 2、git stash pop 恢复并删除。
十、feature分支
    1-、在开发的过程中,新功能不断的添加进来,为了不让一些实验性的代码把主分支搞乱,每次添加新功能的时候,最好新建一个feature分支。在上面开发,完成后,合并最后删除该feature分支。
   -创建新分支:
   $git checkout -b feature2
   -添加新功能:
   git add vulcan.py
   -切回dev,准备合并
   git checkout dev
   -feature分支和bug分支类似,合并然后删除
   -此时需要删除分支,但是删除不了必须d大写D
   $git branch -D feature2
十一、多人协作
    1-、-查看远程库信息,使用git remote -v 
     -本地新建的分支如果不推送到远程,其他人是不可见的。
  -从本地推送分支,使用git push orgin branch-name如果推送失败,先用git pull抓取远程的新提交。
  -在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
  -建立本地分支和远程分支的关联,使用git checkout --set-upstream branch-name orgine/branch-name.
  -从远程抓取分支,当本地链接与远程链接不一致的时候会报错,此时根据提示设置链接,再使用git pull 如果有冲突,要先处理冲突。
十二、Rebase
     git rebase将分叉变成一条直线。
十三、标签:
      1、git tag <tagname>  用于新建一个标签,默认为HEAD,也可以指定一个commit id
   2、gti tag -a<tagname>-m"..."可以指定标签信息
   3、git tag可以查看所有标签。
   3、删除标签git tag -d v0.1
   4、创建的标签都只存在本地,不会自动推送到远程,所以打错的标签可以在本地安全的删除。
      如果要推送某个标签到远程,使用命令:
   git push origin<tagname>
   或者一次性推送全部尚未推送到远程的本地标签
   git push origin --tags
   5、如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
      git tag -d v0.9
   然后再删除远程,删除命令也是push
   git push origin :refs/tags/v0.9
  
 
 
  
 
   
 
  
    
  
 
 

  
 
 

 
原文地址:https://www.cnblogs.com/lsb123/p/10558821.html