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 文件夹内维护历时文件,同时也将历时文件托管在远程仓库
其他:
    集中式:远程服务器保存所有版本,用户客户端有某个版本
    分布式:远程服务器保存所有版本,用户客户端有所有版本
View Code

 

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  // 回去了
View Code

 

 

三、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('直播功能')
        
git stash pop 出现冲突

 

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
....
合并,两个分支的提交记录,合并到一条主线上,让提交记录更加整洁。

--------------------------
View Code

 

六、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
View Code
用户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   
View Code

 

八、补充

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 

 

其他:
a.不用反复输入用户名 密码
Https:
        https://用户名:密码@github.com/wupeiqi/dbhot.git
        git remote add origin https://用户名:密码@github.com/wupeiqi/dbhot.git
SSH:
    git@github.com:wupeiqi/dbhot.git
            ssh-keygen.exe
 
 
b. .ignore 忽略管理哪些文件
 vim .gitignore 
    *.sql
    *.pyc
    *.idea
 
     创建仓库时,选择 忽略 .gitignore
 

 

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个面试题:

----------------
笔记1
-----------------------------
两点一线,写代码;
-----------------------------
家里,公司都有电脑;

版本控制;
保存代码,保存所有的版本的!

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

不允许抄,多沟通,快速完成事的人!价值,先把功能完成!!
---------------
笔记2

 

 


 

拒绝合并无关的历史:

首先将远程仓库和本地仓库关联起来:

git branch --set-upstream-to=origin/master master

然后使用git pull整合远程仓库和本地仓库,

git pull --allow-unrelated-histories    (忽略版本不同造成的影响)

完成,问题解决

 

九、工作

两个仓库,代码合并;
git clone xxxxxxxxxxxxxxx
cd test
git checkout dev
git remote add base-name  ***********************
git remote -v
git fetch base-name
git merge base-name/master   ( refusing to merge unrelated histories )
git merge base-name/master --allow-unrelated-histories 
git push origin master 
 
--------------------------------
上传到分支得某个目录下:
git clone xxx
cd test
git checkout dev
git pull origin dev
git add .
git commit -m "xx"
git push origin dev
 
 
删分支
git branch -a
git push origin --delete dev
git branch -a

 

参考: 

 

十、合并分支代码

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

posted @ 2018-07-06 07:33  Alice的小屋  阅读(181)  评论(0)    收藏  举报