git 命令和使用场景总结

资料地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

       http://www.cnblogs.com/wupeiqi/p/7295372.html

一、git的起源 ?

  git是Linux的创始人Linus为了管理linux的版本而花了两个星期写的。之前用过一段时间BitKeeper这个软件,

  后来闹出矛盾了,一个道歉就可以解决的事,作为一个特立独行的大牛,Linus索性自己搞。

  所以之后才能出现git和基于git的全球最大同性交友网站github。

  大牛任性改变历史,普通人任性只能改变自己。

二、git的作用?

  从起源可以看出来,可以用作版本管理,特别是多人协作的情况下,在当今集团军作战的时代,git已经成为必不可少的分布式版本控制工具。

三、 git的安装?

  没有特殊的

  windows 官网下载

  Linux yum install git

  

四、git 命令大全

五、 git 原理 

   git 把当前文件夹在生成一个 .git 文件夹用作版本控制库,这个文件夹以后可能会很大,因为所有代码都存放在里面。

  分为隔离的四个区,通过不同命令实现内容改变,换句话说你做的所有改变的代码,都被作为素材提交到库中。

  当我们需要回到哪个时刻,就把素材按照当时顺序组织,所以在内存角度没变多少,所以版本更替很快。

  HEAD,一个指针,代表当前处理的版本

  master,主分支,代表我们主要的版本

  dev,测试分支,代表我们公司开发版本

  xxx,自己名字,代表自己负责工作分支

  平时master稳定运行,自己做完把自己分支向dev分支上merge,公司安排测试等测试dev版本,ok了运维部门安装到服务器,也就是上线。

 

 

分支合并简单情况,修改-----保存

分支合并冲突情况,解决冲突。前后冲突的文件中,冲突的内容两者都会显示,需要人工手动选择一个,修改完毕,再提交。

六、使用场景总结:

本地开始

$ pwd                   # 显示当前目录
$ git init                # git初始化
$ git status                        # 查看当前git状态
$ git add .                         # 添加当前目录下所有文件到版本库
$ git commit -m '第一次提交'          # 提交到版本库,并填写版本说明,以便以后回滚。
$ ls                                # 查看目录下文件
$ touch a.py                        # 创建新文件
$ git log                           # 查看历史版本提交记录(根据版本commit值可以进行回滚)
$ git reset --hard 版本号            # 工作区向历史滚
$ git reflog                        # 查看回滚记录
$ git reset --hard 0972f4b          # 工作区向未来滚
$ git checkout -- file # 撤回工作区修改,让这个文件回到最近一次git addgit commit时的状态。这两个点相当于单机游戏中的存档点,执行就保存一次状态
$ git reset HEAD file # 撤回提交到暂存区的修改,工作区未退回,
$ git rm file # 删除文件,需要commit
$ git commit
$ git tag # 查看所有标签
$ git show tagename # 查看便签详细
$ git tag -a tagname -m message commit_id # 给commit创建标签,方便以后查看,默认是打在HEAD上
$ git tag -d tagname # 删除本地便签
$ git push origin tagname # 推送标签到远程库,便签不推不会到远程库
$ git push origin --tags # 推送全部标签

新功能开发方案

$ git branch dev                           # 创建新分支,即:拷贝一份当前所在分支代码到新分支
$ git checkout dev                         # 切换到dev分支
$ vim app01/views.py                       # 开发功能
$ git status                               # 查看状态,即:在dev分支修改了app01/views.py文件
$ git add .                                # 将修改文件添加到版本库的暂存区
$ git commit -m '新功能开发完毕'             # 将暂存区的内容提交到当前所在分支,即:dev分支
$ git checkout master                      # 切换回master分支 
$ git merge dev                            # 将dev分支内容合并到master分支


$ git branch -d dev # 新功能没完成,老板说不要了
$ git branch -D dev # 还没提交就不要了,强制删除


新功能开发中去修复bug之stash方案

$ vim app01/views.py                               # 开发直播功能,刚开发到一半 ,不想提交
$ git status
$ git stash                                        # 将开发到一半的直播功能,临时存储到“某个地方”
$ git status                                       # 工作区回到当前版本未做任何操作前
$ vim pondo/settings.py                            # 紧急修复bug
$ git add .                                        # 添加到修改bug的代码到暂存状态
$ git commit -m '紧急修复bug'                       # 提交修复Bug的代码到分支
$ git stash pop                                    # 将开发到一半的直播功能从“某个地方”再次拿会工作区继续开发

stash 命令
  git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
  git stash list 查看“某个地方”存储的所有记录
  git stash clear 清空“某个地方”
  git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
  git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突) 
  git stash drop 编号,删除指定编号的记录

例子
a. 原来内容:
  from django.shortcuts import render,HttpResponse

  def index(request):
    return render(request,'index.html')

  def africa(request):
    return HttpResponse('非洲专区')


b. 在a基础上开发到一半直播功能:
  from django.shortcuts import render,HttpResponse

  def index(request):
    return render(request,'index.html')

  def africa(request):
    return HttpResponse('非洲专区')


  def live(request):
    print('开发到一半')
    return HttpResponse('....')


c. 执行git stash,回到当前版本未修改状态a:
  from django.shortcuts import render,HttpResponse

    def index(request):
      return render(request,'index.html')

    def africa(request):
      return HttpResponse('非洲专区')

d. 修复Bug并提交:
  from django.shortcuts import render,HttpResponse

    def index(request):
      return render(request,'index.html')

    def africa(request):
      return HttpResponse('非洲xxxxx专区')


e. 继续开发直播功能 git stash pop,此时会出现冲突:

  $ git stash pop
  表示app01/views.py存在冲突需要解决,此时文件内容为:

  from django.shortcuts import render,HttpResponse

    def index(request):
      return render(request,'index.html')

    def africa(request):
    <<<<<<< Updated upstream:                # 修复Bug时更改的内容
      return HttpResponse('非洲xxxx区') 
    =======                                   # 修复Bug前正在开发新功能时的内容
      return HttpResponse('非洲专区')

    def live(request):
      print('刚开发到一半')
      return HttpResponse('直播功能')
    >>>>>>> Stashed changes


需要自行解决冲突,然后继续开发,如:

    from django.shortcuts import render,HttpResponse

      def index(request):
        return render(request,'index.html')

      def africa(request):

        return HttpResponse('非洲xxxx区') 

      def live(request):
        print('刚开发到一半')
        return HttpResponse('直播功能')

新功能开发中去修复bug之修补bug分支方案

$ git branch                             # 当前在master分支
$ git branch dev                         # 创建dev分支用于开发新功能
$ git checkout dev                       # 切换到dev分支
$ vim app01/views.py                     # 开发新功能到一半,需要紧急修复Bug
$ git add .
$ git commit -m '新功能开发一半'
$ git checkout master                    # 切换回master分支
$ git branch bug                         # 创建修复bug分支
$ git checkout bug                       # 切换到bug分支
$ vim pondo/settings.py                  # 修改bug
$ git add .                              # 提交bug
$ git commit -m '紧急修复bug'             # 提交bug
$ git checkout master                    # 切换回master
$ git merge bug                          # 将bug分支内容合并到master分支,表示bug修复完毕,可以上线
$ git checkout dev                       # 切换到dev分支,继续开发新功能
$ vim app01/views.py                     # 继续开发其他一半功能
$ git add .                              # 提交新功能
$ git commit -m '继续开发完成'             # 提交功能
$ git checkout master                    # 切换回master分支
$ git merge dev                          # 将dev分支合并到master分支


branch相关常用命令:
  git branch 分支名称 创建分支
  git checkout 分支名称 切换分支
  git branch -m 分支名称 创建并切换到指定分支
  git branch 查看所有分支
  git branch -d 分支名称 删除分支
  git merge 分支名称 将指定分支合并到当前分支



在家第一次推送远程库(github)

$ git remote add origin 地址             # 为地址起一个别名origin
$ git push origin master                # 将本地master分支内容以及版本信息推送到GitHub
Username for '':                        # 输入GitHub用户名
Password for '':                        # 输入GitHub密码
$ git push origin dev                   # 将本地dev分支内容以及版本信息推送到GitHub


在公司第一次使用远程库继续开发

$ git clone https://github.com/WuPeiqi/pondo.git       # 将项目从GitHub中获取
$ cd pondo/                                            # 切换到工作目录
$ git branch                                           # 默认获取到得只有master分支
$ git branch dev origin/dev                            # 创建dev分支且和远程dev分支同步
$ vim app01/views.py                                   # 继续开发新功能
$ git add .                                            # 添加文件到版本库的暂存状态
$ git commit -m '公司开发功能1'                          # 提交新功能到版本库的分支
$ git push origin dev                                  # 提交dev分支内容到远程GitHub托管仓库的dev分支
Username for '':
Password for '':


回家继续开发

$ git checkout dev                            # 切换到dev分支
$ git pull origin dev                         # 从远程GitHub仓库获取dev分支最新内容,并合并到本地
$ vim app01/views.py                          # 继续开发新功能
$ git add .                                   # 添加文件到版本库的暂存状态
$ git commit -m '家里开发功能1'                 # 提交新功能到版本库的分支
$ git push origin dev                         # 提交dev分支内容到远程GitHub托管仓库的dev分支
Username for '':
Password for '':
 


回公司继续开发

$ git checkout dev                            # 切换到dev分支
$ git fetch origin dev                        # 从GitHub仓库获取dev分支最新内容到版本库的分支
$ git merge origin/dev                        # 将版本库的分支内容合并到工作区
$ vim app01/views.py                          # 继续开发新功能
$ git add .                                   # 添加文件到版本库的暂存状态
$ git commit -m 'xxxxxxxxxxx'                 # 提交新功能到版本库的分支
$ git push origin dev                         # 提交dev分支内容到远程GitHub托管仓库的dev分支
Username for '':
Password for '':
 

设置密钥(解决每次都要输入用户名,密码):

1. $ ssh-keygen -t rsa -C "youremail@example.com"        #配置密钥
2. 一直默认回车
3. .ssh目录,里面有id_rsaid_rsa.pub两个文件,一个密钥,一个公钥
4. 将公钥复制给github


多人协作工作模式 :

  

1. 先pull下最新的版本,与本地合并

2. 工作

3. 所有人轮流push,(第一个只用push,其他人要先pull,再push,因为前人已经做了修改)

  

原文地址:https://www.cnblogs.com/xinghuaikang/p/8507135.html