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 add
或git 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_rsa
和id_rsa.pub
两个文件,一个密钥,一个公钥
4. 将公钥复制给github
多人协作工作模式 :
1. 先pull下最新的版本,与本地合并 2. 工作 3. 所有人轮流push,(第一个只用push,其他人要先pull,再push,因为前人已经做了修改)