Git
一、版本控制
https://www.cnblogs.com/wupeiqi/p/7295372.html
http://www.cnblogs.com/alex3714/articles/5930846.html
说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象!
毕业论文_初稿.doc
毕业论文_修改1.doc
毕业论文_修改2.doc
毕业论文_修改3.doc
毕业论文_完整版1.doc
毕业论文_完整版2.doc
毕业论文_完整版3.doc
毕业论文_最终版1.doc
毕业论文_最终版2.doc
毕业论文_死也不改版.doc
...
以上就是使用最原始的方式进行版本控制,但是这种方式有显著缺点:
多个文件,保留所有版本时,需要为每个版本保存一个文件...
协同操作,多人协同操作时,需要将文件打包发来发去...
容易丢失,被删除意味着永远失去...(可以选择网盘)
为了解决以上版本控制存在问题,应运而生了一批版本控制工具:VSS、CVS、SVN、Git等,其中Git属于绝对霸主地位。
注意:一般版本控制工具包含两部分
客户端(本地):本地编写内容以及版本记录
服务端(网盘):将内容和版本记录同时保存在远程(可有可无)
二、GIT介绍
Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:
无GitHub:在本地 .git 文件夹内维护历时文件
有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
其他:
集中式:远程服务器保存所有版本,用户客户端有某个版本
分布式:远程服务器保存所有版本,用户客户端有所有版本
1. 安装
https://git-scm.com/downloads
2. 基本使用
- 进入想要管理的文件夹
- git init # 初始化,表示即将对当前文件夹进行版本控制。
- git status # 查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等。
- git add . # 将指定文件添加到版本库的暂存状态。
- git commit -m '一定好好写' # 将暂存区的文件提交到版本库的分支。
# 第一次( git config --global user.email "you@example.com" git config --global user.name "you name" )
- git log # 查看提交记录,即:历史版本记录
- git reset --hard 23xsasdasdasdasdasdad32323sda # 回滚到指定版本
回滚完成了,在回去需要这么做:
- git reflog
- git reset --hard as23a6a # 回滚到某个版本
git软件 帮助我们做版本控制,自动监测是否发生变化 官网: https://git-scm.com/ 下载 管谁 谁变绿 改过红 管理绿的 拿走白的 git init git status git add app.py 变绿; git add . git status git commit -m ‘第一次全部塞道瓶子里’ please tell me who you are git config --global user.email "you@example.com" git config --global user.name "you name" git commit -m ‘第一次全部塞道瓶子里’ git status // 没有内容了 稍微修改之后, git status git add . git status git commit -m '饿了' git log 提交了几次 都可看见 (commit) 回滚到原来的状态 git reset --hard 670c53c0b4000ebbf8b53419ad46c67704431f9b 但是 还能回去吗? git reflog git reset --hard 54f762f git log // 回去了


三、stash
背景
开发进行到一半,之前的版本出现bug需要紧急修复,怎么办?怎么办?
stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。
acBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 开发直播功能,刚开发到一半 MacBook-Pro-4:pondo wupeiqi$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git stash # 将开发到一半的直播功能,临时存储到“某个地方” Saved working directory and index state WIP on master: 0972f4b 非洲专区上线 HEAD is now at 0972f4b 非洲专区上线 MacBook-Pro-4:pondo wupeiqi$ git status # 工作区回到当前版本未做任何操作前 On branch master nothing to commit, working tree clean MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py # 紧急修复bug MacBook-Pro-4:pondo wupeiqi$ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: pondo/settings.py no changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git add . # 添加到修改bug的代码到暂存状态 MacBook-Pro-4:pondo wupeiqi$ git commit -m '紧急修复bug' # 提交修复Bug的代码到分支 [master 1300d33] 紧急修复bug 1 file changed, 1 insertion(+) MacBook-Pro-4:pondo wupeiqi$ git stash pop # 将开发到一半的直播功能从“某个地方”再次拿会工作区继续开发 On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (059d78ca8fa204f9559bd3ce0ae76235969b4301)
特别的:执行 git stash pop 命令时,可能会遇到冲突,因为在紧急修复bug的代码和通过stash存储在“某个地方”的代码会有重合部分,所以执行 git stash pop 时候就会出现冲突,有冲突解决冲突即可。
a. 原来内容: from django.shortcuts import render,HttpResponse def index(request): return render(request,'index.html') def africa(request): return HttpResponse('非洲专区') b. 开发到一半直播功能: 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,回到当前版本未修改状态: 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,此时会出现冲突: MacBook-Pro-4:pondo wupeiqi$ git stash pop Auto-merging app01/views.py CONFLICT (content): Merge conflict in app01/views.py 表示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('直播功能')
stash相关常用命令:
- git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
- git stash list 查看“某个地方”存储的所有记录
- git stash clear 清空“某个地方”
- git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash drop 编号,删除指定编号的记录
四、branch
背景
开发进行到一半,之前的版本出现bug需要紧急修复,怎么办?怎么办?
正常的开发流程:
master
dev(开发)
当紧急修复bug了
a.[dev]将 dev中现在正在开发的功能提交的dev
git add .
git commit -m 'xxx'
b. 切换回主分支
git checkout master
c. 创建并切换到bug分支
git branch bug
git checkout bug
在bug分支上进行修复 。。。
git add .
git commit -m 'xxx'
d. git checkout master
git merge bug
git branch -d bug
ps:git branch
e. 切换到dev 继续开发
git checkout dev
...
git add .
git commit -m "开发完成"
f.git checkout master
git merge bug
重点:
git stash
git stash pop
git branch
git checkout -b dev # 既创建有切换
git branch dev
git checkout dev
git branch -d bug # 删除分支
# 合并,产生冲突
git merge dev ([dev]: git merge master)
两端代码,需要手动修改;产生冲突,协同开发,
-------------------------------------------------------------
分支学习:branch称为分支,默认仅有一个名为master的分支。一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。

MacBook-Pro-4:pondo wupeiqi$ git branch dev # 创建新分支,即:拷贝一份当前所在分支代码到新分支 MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支 MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 开发功能 MacBook-Pro-4:pondo wupeiqi$ git status # 查看状态,即:在dev分支修改了app01/views.py文件 On branch dev Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: app01/views.py no changes added to commit (use "git add" and/or "git commit -a") MacBook-Pro-4:pondo wupeiqi$ git add . # 将修改文件添加到版本库的暂存区 MacBook-Pro-4:pondo wupeiqi$ git commit -m '新功能开发完毕' # 将暂存区的内容提交到当前所在分支,即:dev分支 [dev 32b40cd] 新功能开发完毕 1 file changed, 2 insertions(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切换回master分支 Switched to branch 'master' MacBook-Pro-4:pondo wupeiqi$ git merge dev # 将dev分支内容合并到master分支 Updating 0972f4b..32b40cd Fast-forward app01/views.py | 2 ++ 1 file changed, 2 insertions(+)
临时修改bug
可以按照下图的流程进行:

MacBook-Pro-4:pondo wupeiqi$ git branch # 当前在master分支 * master MacBook-Pro-4:pondo wupeiqi$ git branch dev # 创建dev分支用于开发新功能 MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支 Switched to branch 'dev' MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 开发新功能到一半,需要紧急修复Bug MacBook-Pro-4:pondo wupeiqi$ git add . MacBook-Pro-4:pondo wupeiqi$ git commit -m '新功能开发一半' [dev b3ac2cb] 新功能开发一半 1 file changed, 2 insertions(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切换回master分支 Switched to branch 'master' MacBook-Pro-4:pondo wupeiqi$ git branch bug # 创建bug分支 MacBook-Pro-4:pondo wupeiqi$ git checkout bug # 切换到bug分支 Switched to branch 'bug' MacBook-Pro-4:pondo wupeiqi$ vim pondo/settings.py # 修改bug MacBook-Pro-4:pondo wupeiqi$ git add . # 提交bug MacBook-Pro-4:pondo wupeiqi$ git commit -m '紧急修复bug' # 提交bug [bug f42f386] 紧急修复bug 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切换会master Switched to branch 'master' MacBook-Pro-4:pondo wupeiqi$ git merge bug # 将bug分支内容合并到master分支,表示bug修复完毕,可以上线 Updating 0972f4b..f42f386 Fast-forward pondo/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支,继续开发新功能 Switched to branch 'dev' MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 继续开发其他一半功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 提交新功能 MacBook-Pro-4:pondo wupeiqi$ git commit -m '继续开发完成' # 提交功能 [dev c0bfb27] 继续开发完成 1 file changed, 1 insertion(+) MacBook-Pro-4:pondo wupeiqi$ git checkout master # 切换回master分支 Switched to branch 'master' MacBook-Pro-4:pondo wupeiqi$ git merge dev # 将dev分支合并到master分支 Merge made by the 'recursive' strategy. app01/views.py | 3 +++ 1 file changed, 3 insertions(+)
注意:git merge 时也可能会出现冲突,解决冲突的方式上述stash相同,即:找到冲突文件,手动修改冲突并提交,此处不再敖述。
branch相关常用命令:
- git branch 分支名称 创建分支
- git checkout 分支名称 切换分支
- git checkout -b dev 既创建又切换(没删master)
- git branch -m 分支名称 创建并切换到指定分支(删除了master)
- git branch 查看所有分支
- git branch -d 分支名称 删除分支
- git merge 分支名称 将指定分支合并到当前分支
五、rebase
rebase:
合并 + 将提交记录提交到一条主线上,提交记录更整洁;
如果产生冲突:
合并
解决完冲突
git rebase --skip
merge:
合并,提交在多条线上,保留了所有的提交记录。
所以说:
merge 保留了每次的提交记录,如果不想保留记录,rebase 也可以!
git merge dev

git rebase dev

面试题: git rebase ? 合并 + 将提交记录提交到一条主线上 提交记录更整洁 如果产生冲突, 合并 解决完冲突 git rebase --skip ------ merge rebase 保留每次提交的记录 merge,不想报保留记录 rebase 也可以 问题: git rebase的作用? ------ master touch m1.py git add . git commit -m 'm1' touch m2.py git add . git commit -m 'm1' dev touch d1.py git add . git commit -m 'd1' touch d2.py git add . git commit -m 'd2' git GUI Here visulizerve all branch history git merge master i esc :wq visulizerve all branch history 在这看。。合并了 rebase 不会出现两天线,一条线 就会更加整洁 master touch m1.py git add . git commit -m 'm1' touch m2.py git add . git commit -m 'm1' dev touch d1.py git add . git commit -m 'd1' touch d2.py git add . git commit -m 'd2' git rebase dev .... 合并,两个分支的提交记录,合并到一条主线上,让提交记录更加整洁。 --------------------------
六、GitHub
介绍
版本存储仓库: github
开源优秀的代码都在上面;程序员的交流平台
公共:
-- github(公共的 私有的)
-- 码云(10个私有的。。自己来玩)
自己搭建:(公司)
- gitlab(自己需要服务器)
----------------------------------
1.注册账号,创建项目,拷贝地址 https://gitee.com/wupeiqi/xianglogn.git
2.家:本地的代码推送的远程
cd 项目目录
git remote add origin https://gitee.com/wupeiqi/xianglogn.git
git push origin master
git push origin dev
...继续写code
git add .
git commit -m "提交记录"
git push origin dev
3.第一次到公司
下载代码
git clone https://gitee.com/xianglong.git
或:
git init
git remote add origin https://gitee.com/xianglong.git
git pull orogin master
创建dev分支
git branch dev
git checkout dev
git pull origin dev
继续写代码
git add .
git commit -m "提交记录"
git push origin dev
4.回家
写代码:
git pull origin dev
继续写:
。。。
git add .
git commit -m "提交记录"
git push origin dev
------------
一定要提交,方便回家写代码;
---------------------------
总结:
git clone http://xxx
git init
git remote add xxx http://xxx
git pull xxx master
git pull xxx master
git fetch xxx master
git merge xxx/master 或 git rebase xxx/master(rebase不会产生分叉)
git push xxx master
---------------------------
背景
GitHub,一个基于Git实现的代码托管的平台,可以将内容以及版本记录在远程也保存一份,这样就不用U盘咯(类似于云盘)。PS: 类似GitHub的产品还有许多,如:GitLab、Bitbucket、码云等。

基于GitHub实现代码托管,需要以下步骤:
- 注册GitHub
- 创建仓库,创建完仓库后会有一个URL代指该仓库,如:

- git可以是用该URL进行向远程推送版本信息或获取版本信息
学会使用Git和GitHub之后,就可以基于GitHub进行代码远程托管。
在家里
小P开发完毕部分功能将代码推送到GitHub。
git remote add origin https://github.com/WuPeiqi/pondo.git
git push origin master
username / password
git push origin dev
MacBook-Pro-4:pondo wupeiqi$ git remote add origin https://github.com/WuPeiqi/pondo.git # 为地址起一个别名origin MacBook-Pro-4:pondo wupeiqi$ git push origin master # 将本地master分支内容以及版本信息推送到GitHub Username for 'https://github.com': # 输入GitHub用户名 Password for 'https://wupeiqi@github.com': # 输入GitHub密码 Counting objects: 2, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 270 bytes | 0 bytes/s, done. Total 2 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To https://github.com/WuPeiqi/pondo.git 634aac4..274f1e4 master -> master MacBook-Pro-4:pondo wupeiqi$ git push origin dev # 将本地dev分支内容以及版本信息推送到GitHub Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 261 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To https://github.com/WuPeiqi/pondo.git 274f1e4..50e2169 dev -> dev
在公司
新电脑第一次使用,需要将代码从GitHub中获取并继续开发,开发完事下班就下班回家。
git clone https://github.com/WuPeiqi/pondo.git
cd pondo
git branch
git branch dev origin/dev
git checkout dev
vim app01/view.py
git add .
git commit -m "公司开发功能1"
git push origin dev
username / password
MacBook-Pro-4:github wupeiqi$ git clone https://github.com/WuPeiqi/pondo.git # 将项目从GitHub中获取 Cloning into 'pondo'... remote: Counting objects: 31, done. remote: Compressing objects: 100% (26/26), done. remote: Total 31 (delta 2), reused 30 (delta 1), pack-reused 0 Unpacking objects: 100% (31/31), done. MacBook-Pro-4:github wupeiqi$ cd pondo/ MacBook-Pro-4:pondo wupeiqi$ git Branch # 默认获取到得只有master分支 * master MacBook-Pro-4:pondo wupeiqi$ git branch dev origin/dev # 创建dev分支且和远程dev分支同步 Branch dev set up to track remote branch dev from origin. MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支 Switched to branch 'dev' MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 继续开发新功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本库的暂存状态 MacBook-Pro-4:pondo wupeiqi$ git commit -m '公司开发功能1' # 提交新功能到版本库的分支 [dev 9281447] 公司开发功能1 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ git push origin dev # 提交dev分支内容到远程GitHub托管仓库的dev分支 Username for 'https://github.com': wupeiqi Password for 'https://wupeiqi@github.com': Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 427 bytes | 0 bytes/s, done. Total 4 (delta 2), reused 0 (delta 0) remote: Resolving deltas: 100% (2/2), completed with 2 local objects. To https://github.com/WuPeiqi/pondo.git 50e2169..9281447 dev -> dev
在家里
由于白天在公司已经开发一部分功能并提交到GitHub,家里电脑的代码还是昨晚的版本,所以需要从GitHub拉取最新代码,然后继续开发。
git checkout dev
git pull origin dev
vim app01/views.py
git add .
git commit -m "家里开发功能1"
git push origin dev
MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支 Already on 'dev' MacBook-Pro-4:pondo wupeiqi$ git pull origin dev # 从远程GitHub仓库获取dev分支最新内容,并合并到本地 remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0 Unpacking objects: 100% (4/4), done. From https://github.com/WuPeiqi/pondo * branch dev -> FETCH_HEAD 50e2169..9281447 dev -> origin/dev Updating 50e2169..9281447 Fast-forward app01/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 继续开发新功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本库的暂存状态 MacBook-Pro-4:pondo wupeiqi$ git commit -m '家里开发功能1' # 提交新功能到版本库的分支
在公司
由于昨天晚上在家已经开发了一部分功能,在公司需要先把昨晚开发的功能从GitHub中拉取,并继续开发。
git checkout dev
git fetch origin dev
git merge origin/dev
vim app01/views.py
git add .
git commit -m "公司开发功能2"
git push origin dev
MacBook-Pro-4:pondo wupeiqi$ git checkout dev # 切换到dev分支 MacBook-Pro-4:pondo wupeiqi$ git fetch origin dev # 从GitHub仓库获取dev分支最新内容到版本库的分支 remote: Counting objects: 3, done. remote: Compressing objects: 100% (1/1), done. remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0 Unpacking objects: 100% (3/3), done. From https://github.com/WuPeiqi/pondo * branch dev -> FETCH_HEAD 150d891..65b6604 dev -> origin/dev MacBook-Pro-4:pondo wupeiqi$ git merge origin/dev # 将版本库的分支内容合并到工作区 Updating 150d891..65b6604 Fast-forward readme | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) MacBook-Pro-4:pondo wupeiqi$ vim app01/views.py # 继续开发新功能 MacBook-Pro-4:pondo wupeiqi$ git add . # 添加文件到版本库的暂存状态 MacBook-Pro-4:pondo wupeiqi$ git commit -m 'xxxxxxxxxxx' # 提交新功能到版本库的分支
长此以往,将Git和GitHub结合使用做到避免电脑损坏造成数据丢失以及多地开发的问题,上文执行过程中执行 【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】,并且在执行过程中可能会出现冲突,原因是由于本地代码和获取的最新代码有重合部分,那么就需要自己手动解决冲突然后再继续开发。
七、协同开发
多人协同开发:每个人创建一个分支;合并到dev
公司是否做代码的review
master
dev
- review(组长做代码的review)
- kongxinlogn
- heng
产生冲突,解决冲突,继续提交;
一个小功能就合并;3 2天 合并一下;越晚提交,冲突越多
一般:小功能合并: 1/2/3
协同开发:
3种方法:合作者 / 组织 / (fork new pull request)
背景
平台需要三人协同开发,GitHub中多人协同开发和单人开发还是有点差别,协同开发一般有两种方式:
- 合作者,将其他用户添加到仓库合作者中之后,该用户就具有向当前仓库提交代码。

- 组织,创建一个组织,然后再该组织下可以创建多个项目,组内成员可以向组内所有项目提交代码。PS:也可以对某个项目指定合作者



协同开发命令和以上步骤类似,此处就不再重新写代码,而是使用文件描述三人协同开发整个过程。
- 创建程序
- 用户A创建程序,提交到GitHub
- 用户B克隆项目
- 用户C克隆项目
- 开发功能
- 用户A开发功能1
- 用户B开发功能2
- 用户C开发功能3
- 提交
- 用户A提交功能1,并push(A用户手速快,先提交。)
- 用户B提交功能2,无法push,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能2。 - 用户C提交功能3,无法push,无法提交,因为GitHub上已经有其他人提交的新代码。
解决方法:从GitHub上获取最新代码并合并到本地,提交自己开发的功能3。 - 获取最新代码
- 用户A获取最新代码
- 用户B获取最新代码
- 用户C获取最新代码
在上面红色标注的解决方法位置可以有三种方式操作,三者都可以完成合并并提交新功能,但是日志记录会有差异,如:前两者版本记录中会出现合并,而第三种可以保证版本记录干净整洁。
- 先 git pull origin master 然后 git push origin master
- 先 git fetch origin master 然后 git merge origin/master 再 git push origin master
用户A: touch 4.py git add . git commit -m '功能4' git push origin master 用户B: touch 5.py git add . git commit -m '功能5' git push origin master # 报错,因为GitHub中已经有人提交新代码 git pull origin master git push origin master
用户A: touch 4.py git add . git commit -m '功能4' git push origin master 用户B: touch 5.py git add . git commit -m '功能5' git push origin master # 报错,因为GitHub中已经有人提交新代码 git fetch origin master git rebase origin/master git push origin master
八、补充
fork
每天都是逛逛github,看看别人有什么好的项目,自己可以给他挑挑bug,但是别人不可能给小P搞成合作者什么的,那怎么才能给别人贡献代码呢?那就是fork了。。。。
- 找到想搞的项目,fork一下,然后这个项目就在自己仓库出现了


- 从自己仓库获取代码并进行编辑提交
- 创建并提交一个pull request,然后等待原作者是否同意这个pull request,如果同意那么在作者的源代码中就推出现小P提交的功能

.gitignore
git init
vim 100.py
vim .gitignore
100.py
----
100.py 怎么修改,都不会出现 红色
----------------------------
gitignore() 该怎么写,/ * ? [] ?
github写好了
官方文档 gitignore 搜索;
https://github.com/github/gitignore/blob/master/Python.gitignore
可以忽略
.idea/
---------------------------
以斜杠“/”开头表示目录; 以星号“*”通配多个字符; 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表; 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
版本
git 版本 git tag 用于定义v1 v2 版本
git tag -a v1.0 -m '版本介绍' 本地创建Tag
git show v1.0 查看
git tag -n 查看本地Tag
git tag -l 'v1.4.2.*' 查看本地Tag,模糊匹配
git tag -d v1.0 删除Tag
git push origin :refs/tags/v0.2 更新远程tag
git checkout v.10 切换tag
git fetch origin tag V1.2
git push origin --tags
git pull origin --tags
git clone -b v0.1
eg:
git clone -b v0.1 https://github.com/django/django.git
敏感
一定不能将公司代码,放到github上;
乌云:有公司的漏洞,公司的领导,认领,耻辱;违约,保密协议;小哥,检讨!
敏感信息,不要放到github上,excel表格,分析 锤子手机造假,网上爆出来了!
公司的代码不能放到,个人平台上!
其他补充
1. 配置文件
Git的配置文件有三个:
- 系统配置: /private/etc/gitconfig
- 用户配置: ~/.gitconfig
- 项目配置:.git/config
2. 用户凭证
由于Git和Github交互操作可能会很频繁,那么一定少了用户授权的操作,为了防止每次操作重复输入用户名和密码,Git提供了两种解决方法:
- 秘钥
首先创建一对秘钥 ssh-keygen -t rsa,然后将 id_rsa.pub (公钥)内容拷贝到github中,日后操作无需再输入用户名和密码。
注意:这种方式需要使用GIt中 git@github.com:WuPeiqi/xxxxx.git 格式地址。 - 密码
Https访问git时,避免每次操作需要输入用户名和密码,可以在配置文件中添加如下配置项:
[credential]
helper = store/cache/第三方
store:
表示将用户名和密码保存在硬盘上
第一次输入过用户名和密码之后,用户名和密码就会保存在当前用户根目录的 .git-credentials 文件中,内容格式为:https://用户名:密码@github.com自动添加配置命令:git config credential.helper store
cache:
表示将用户名和密码保存在缓存中
第一次输入过用户名和密码之后,用户名和密码就会保存在缓存中,默认超时时间是 900 秒,缓存相关文件保存在当前用户根目录的 git-credential-cache 中
自动添加配置命令:
git config credential.helper cache
git config credential.helper 'cache --timeout=300'相关操作:
清除缓存:git credential-cache exit
指定超时:
[credential]
helper = cache --timeout=300
注意:
这种方式需要使用GIt中 https://github.com/WuPeiqi/xxxx.git 格式地址。
指定用户名和密码: https://用户名:密码@github.com/wupeiqi/xxx.git
Git 内容回顾: 3.Git 版本管理 git软件 帮助我们做版本控制,自动监测是否发生变化 官网: https://git-scm.com/ 下载 管谁 谁变绿 改过红 管理绿的 拿走白的 git init git status git add app.py 变绿; git add . git status git commit -m ‘第一次全部塞道瓶子里’ please tell me who you are git config --global user.email "you@example.com" git config --global user.name "you name" git commit -m ‘第一次全部塞道瓶子里’ git status // 没有内容了 稍微修改之后, git status git add . git status git commit -m '饿了' git log 提交了几次 都可看见 (commit) 回滚到原来的状态 git reset --hard 670c53c0b4000ebbf8b53419ad46c67704431f9b 但是 还能回去吗? git reflog git reset --hard 54f762f git log // 回去了 --------------------- 总结: https://www.cnblogs.com/wupeiqi/p/7295372.html a.安装: https://git-scm.com/downloads b.基本使用: - 进入想要管理的文件夹 - git init - git status - git add . - git commit -m '一定好好写' - git log - git reset --hard 23xsasdasdasdasdasdad32323sda - git reflog - git reset --hard as23a6a ------------------- 笔记,依赖学习,思考, 设计能力;要有自己的想法; 编程思想; ------------------- 内容回顾: - rest api 10条规范 - rest framework 10个组件 - contenttype - cors jsonp - 响应头 - 简单和复杂请求 - git 今日内容: git 路飞学城 内容详细: git 翔龙创业: 线上方便面 ------------- 开发的一半的功能暂时存起来, git stash git stash pop 会有冲突。 产生冲突。。找到文件一个一个修改 1.问题:当在开发某个功能1/2时,如果想要回到原来的状态修复原来的代码。 git stash 修复 git stash pop (冲突解决) 关掉 pycharm git status git checkout .idea/workspace.xml git stash pop 打开文件,修复 pycharm 修改了 git status git add . git commit -m "辣条开发完成" git log (开发一半,暂存了,可能会出现冲突) git stash git status git add . git commit -m "修复bug2" git stash pop 就不会产生冲突了。。 之前开发到一半的就出现了,继续开发了 所以说产生冲突找到文件,一个一个修改。 ----------- ----- git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态 git stash list 查看“某个地方”存储的所有记录 git stash clear 清空“某个地方” git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突) git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突) git stash drop 编号,删除指定编号的记录 ----- 面试题:master 上开一条叉; master 分一条叉 去dev上开发, git branch dev git checkout dev touch a.log ls git add . git commit -m "dev上开发a.log" git checkout master git checkout dev // 基于分支就可以操作,最少创建两个分支,每个人都会有一个分支 又出现bug ,a.log 开发一半,怎么办? 切换到其他分支之前,要先提交一下; git add . git commit -m "瓜子一半" 修复bug去了 切换去了。。 如果出现gug 在创建 分支 git branch bug git checkout bug (专门用来修复bug的) eg: touch b.log git add . git commit -m "修复bug分支完成" 在修复一个 vim b.log cat b.log ------ 合并bug 分支到 master git merge bug 现在是 master 和 bug 就一样, 如何删除 bug fenzhi git branch -d bug git branch // 查看所有分支 ------- 正常的开发流程: master dev(开发) 当紧急修复bug了 a.[dev]将 dev中现在正在开发的功能提交的dev git add . git commit -m 'xxx' b. 切换回主分支 git checkout master c. 创建并切换到bug分支 git branch bug git checkout bug 在bug分支上进行修复 。。。 git add . git commit -m 'xxx' d. git checkout master git merge bug git branch -d bug ps:git branch 面试题: 如果公司出现了bug怎么办?协同开发 创建一个bug分支,在bug分支上进行修复,修复完成后合并到master上。 -------------------- 之后再回到之前的 dev 上面 冲突的 开发 git add . git commit -m "在dev上开发瓜子完成" git checkout master 回到msater git merge dev 编辑 i esc :wq git log 合并了 ------- e. 切换到dev 继续开发 git checkout dev ... git add . git commit -m "开发完成" f.git checkout master git merge bug ------ bug 处理; 重点: git stash git stash pop git branch git checkout -b dev # 既创建有切换 git branch dev git checkout dev git branch -d bug # 删除分支 # 合并,产生冲突 git merge dev ([dev]: git merge master) 两端代码,需要手动修改;产生冲突,协同开发, -------------------------- 面试题: git rebase ? 合并 + 将提交记录提交到一条主线上 提交记录更整洁 如果产生冲突, 合并 解决完冲突 git rebase --skip ------ merge rebase 保留每次提交的记录 merge,不想报保留记录 rebase 也可以 问题: git rebase的作用? ------ master touch m1.py git add . git commit -m 'm1' touch m2.py git add . git commit -m 'm1' dev touch d1.py git add . git commit -m 'd1' touch d2.py git add . git commit -m 'd2' git GUI Here visulizerve all branch history git merge master i esc :wq visulizerve all branch history 在这看。。合并了 rebase 不会出现两天线,一条线 就会更加整洁 master touch m1.py git add . git commit -m 'm1' touch m2.py git add . git commit -m 'm1' dev touch d1.py git add . git commit -m 'd1' touch d2.py git add . git commit -m 'd2' git rebase dev .... 合并,两个分支的提交记录,合并到一条主线上,让提交记录更加整洁。 -------------------------- 3个面试题: ----------------
----------------------------- 两点一线,写代码; ----------------------------- 家里,公司都有电脑; 版本控制; 保存代码,保存所有的版本的! 4.版本存储仓库: github 开源优秀的代码都在上面;程序员的交流平台 公共: -- github(公共的 私有的) -- 码云(10个私有的。。自己来玩) 自己搭建:(公司) - gitlab(自己需要服务器) ------上传到码云 git clone ... git branch ... //只拉 master git branch dev git checkout dev 拉代码 git pull origin dev ... 这个就是最新的了。。 改代码。。。 git status git add . git commit -m "在公司的第一次" // 公司的本地 应该推送过去 git push origin dev 回到家之后 git pull orign dev cat a.log 拉下来之后继续写代码。。 家里开发完,在推送 git add . git commit -m "已经开始不适应" git push orign dev 到公司 git pull origin dev ... .. git add . git commit -m "在公司的第二天" (没提交到远程,怎么办) 到家后 想继续写,怎么办 touch a.log git add . git commit -m "在家继续写。。2.30" git push origin dev 到公司后,远程有新的,也有之前的 冲突怎么办 git pull origin dev 没有冲突就合并 , ------- 有了远程仓库之后,命令分别是什么 ------------- 1.注册账号,创建项目,拷贝地址 https://gitee.com/wupeiqi/xianglogn.git 2.家:本地的代码推送的远程 cd 项目目录 git remote add origin https://gitee.com/wupeiqi/xianglogn.git git push origin master git push origin dev ...继续写code git add . git commit -m "提交记录" git push origin dev 3.第一次到公司 下载代码 git clone https://gitee.com/xianglong.git 或: git init git remote add origin https://gitee.com/xianglong.git git pull orogin master 创建dev分支 git checkout dev git pull origin dev 继续写代码 git add . git commit -m "提交记录" git push origin dev 4.回家 写代码: git pull origin dev 继续写: 。。。 git add . git commit -m "提交记录" git push origin dev ------------ 一定要提交,方便回家写代码; --------------------------- 总结: git clone http://xxx git init git remote add xxx http://xxx git pull xxx master git pull xxx master git fetch xxx master git merge xxx/master 或 git rebase xxx/master(rebase不会产生分叉) git push xxx master --------------------------- 面试题:怎么进行协同开发的呀? 为每个人创建一个分支; 开发规范: 多人协同开发:每个人创建一个分支;合并到dev 公司是否做代码的review master dev - review(组长做代码的review) - kongxinlogn - heng 产生冲突,解决冲突,继续提交; 一个小功能就合并;3 2天 合并一下;越晚提交,冲突越多, 一般:小功能合并: 1/2/3 ------------------------------------ 面试题:有没有改过开源的代码; django flask 默认不允许修改 创建团队,称为一员,协同开发; 管理 项目成员,邀请它,一起来开发了, 创建组织,新建项目,添加成员,加入到组织,才能一起开发; 面试题:邀请其他人一起开发 - 项目合作者 - 创建组织,邀请成员 ---------------------------------- 面试题:django 如果发现 bug 可以告知,贡献过代码; fork 代码,对人家的代码, fork 过来相当于放在自己的仓库,可以二次开发 自己仓库开发,。。。 修改之后(new pull request) 请求发给它了, 对方可没有;得到的消息是什么燕子的呢 commit 先fork - fork 代码到自己的目录 - 修改daima - 创建pull request --------------------------- 协同开发: 3种方法:合作者 组织 (fork new pull request 面试常问的,就可以发出去了) ----------------------------- 还有一个: 写程序 pycharm .idea 可以让 git 忽略不管的一些文件 git 可以管理哪些文件 ,也可以忽略一些文件 7.创建 .gitignore 文件 编写git忽略哪些文件 那个代码 怎么改 都不会变红色 ls touch 100.py git status // 红色 touch .gitignore (100.py) git status //不在出现,不管你了,监测不到了 git add . git git commit -m "创建ignore" // gitignore() 该怎么写,/ * ? [] ? github写好了 官方文档 gitignore 搜索; https://github.com/github/gitignore/blob/master/Python.gitignore 可以忽略 .idea/ --------------------------------------- git 先说这么多,发布系统的项目; git 版本 git tag 用于定义v1 v2 版本 ------------------------ 申请 github gitlab .. 简单交流 英文去写!! 私有项目,可以弄些码云;先用码云,再到github 练习: - 先用码云 - github 作业: - 模拟自己创业 - 协同开发 - 组长,创建仓库 - 合作者模式,邀请成员,要给它写的权限 - master/dev/review - 创建自己的分支 - 写代码 - 提交到自己的分支 - 切换到review分支,将个人分支上的代码合并到review - 再将review分支推送到代码仓库【可能报错】, 如果报错,有人已经在这段时间先提交了。 拉下来,解决冲突 - 在提交 - 组长review分支:看一看 , - 在本地合并到dev分支。 本地先合并,在推送到远程 - 将本地dev推送到代码仓库 - 测试 master / dev 上都可以测试;主动出现冲突; ---------------- 补充一个: 一定不能将公司代码,放到github上; 乌云:有公司的漏洞,公司的领导,认领,耻辱;违约,保密协议;小哥,检讨! 敏感信息,不要放到github上,excel表格,分析 锤子手机造假,网上爆出来了! 公司的代码不能放到,个人平台上! ------------- 下一部分:luffy: 视频上传到数据库,后端是restframework 前端是vue jquery ajax npm run dev 跨域 cors restfrmaework 序列化 vue 显示出来了 (766行 表结构) 课程 账户 奖惩 深科技 3张表 - 展示课程列表 - - serializer 接口的开发; - vue的项目 发个ajax - 跨域cors 加到接口的中间件!!! - vue v-for 。。。必须要实现!! 每个人都要创建 contenttype... -------------- 今日作业: git 接口 vue 不允许抄,多沟通,快速完成事的人!价值,先把功能完成!! ---------------
拒绝合并无关的历史:
首先将远程仓库和本地仓库关联起来:
git branch --set-upstream-to=origin/master master
然后使用git pull整合远程仓库和本地仓库,
git pull --allow-unrelated-histories (忽略版本不同造成的影响)
完成,问题解决
九、工作
参考:
十、合并分支代码
git add .
git commit -m 'dev'
git push -u origin dev
git checkout master
git pull origin master
git merge dev
git status
git push origin master
十一、修改用户名密码
https://www.cnblogs.com/wyhlightstar/p/6283517.html
>git config --global user.name "xx"
>git config --global user.email "xx@xx.com"
>git config user.name
>git config user.email
浙公网安备 33010602011771号