Git

git的官方网站:http://git-scm.comhtml

Git介绍

Git是一个开源的分布式版本控制软件,用以有效、高速的处理很小到大的项目版本管理。Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
Git就是一个用于帮助用户实现版本控制的软件。

GitHub是一个基于Git的远程文件托管平台。
Git自己彻底能够作到版本控制,但其全部内容以及版本记录都只能保存在本机,若是想要将文件内容以及版本记录同时保存在远程,则须要集合github来使用。

 首先将咱们写好的项目创建好,而且下载好git后,使用git管理。python

基础命令

一、初始化,让git把这个文件管理起来git

git init

会出现.git文件,若是没有,将设置一下隐藏文件就能够了,正常状况下会是这种状况github

Initialized empty Git repository in D:/python/gitdemo/.git/

二、查看当前文件夹的状态web

git status

会显示:面试

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .idea/
        app01/
        gitdemo/
        manage.py
        templates/

nothing added to commit but untracked files present (use "git add" to track)

这个时候文件都尚未被管理,因此都是红色的缓存

三、咱们先随便对一个文件进行管理,例如:manage.py安全

git  add   manage.py(文件名)     # 就是对当前文件版本控制

而后在查看一下状态:app

git  status
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   manage.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .idea/
        app01/
        gitdemo/
        templates/

此刻,manage.py是已经被管理的文件,颜色从红色变成了绿色。分布式

四、对当前文件下的全部文件以及子目录进行版本控制

git  add  .

在查看,就是全部文件都被管理了:

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$  git add . warning: LF will be replaced by CRLF in .idea/gitdemo.iml.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in .idea/misc.xml.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in .idea/modules.xml.
The file will have its original line endings in your working directory.
warning: LF will be replaced by CRLF in .idea/workspace.xml.
The file will have its original line endings in your working directory.

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file: .idea/gitdemo.iml
        new file:   .idea/misc.xml
        new file:   .idea/modules.xml
        new file:   .idea/workspace.xml
        new file:   app01/__init__.py
        new file:   app01/admin.py
        new file:   app01/apps.py
        new file:   app01/migrations/__init__.py
        new file:   app01/models.py
        new file:   app01/tests.py
        new file:   app01/views.py
        new file:   gitdemo/__init__.py
        new file:   gitdemo/__pycache__/__init__.cpython-35.pyc
        new file:   gitdemo/__pycache__/settings.cpython-35.pyc
        new file:   gitdemo/settings.py
        new file:   gitdemo/urls.py
        new file:   gitdemo/wsgi.py
        new file:   manage.py
        new file:   templates/index.html

五、建立提交记录(版本)

git  commit -m "详细描述版本信息"
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git commit -m '建立第一个版 本'
[master (root-commit) 72d22fe] 建立第一个版本本
 19 files changed, 504 insertions(+)
 create mode 100644 .idea/gitdemo.iml
 create mode 100644 .idea/misc.xml
 create mode 100644 .idea/modules.xml
 create mode 100644 .idea/workspace.xml
 create mode 100644 app01/__init__.py
 create mode 100644 app01/admin.py
 create mode 100644 app01/apps.py
 create mode 100644 app01/migrations/__init__.py
 create mode 100644 app01/models.py
 create mode 100644 app01/tests.py
 create mode 100644 app01/views.py
 create mode 100644 gitdemo/__init__.py
 create mode 100644 gitdemo/__pycache__/__init__.cpython-35.pyc
 create mode 100644 gitdemo/__pycache__/settings.cpython-35.pyc
 create mode 100644 gitdemo/settings.py
 create mode 100644 gitdemo/urls.py
 create mode 100644 gitdemo/wsgi.py
 create mode 100644 manage.py
 create mode 100644 templates/index.html

若是在这一步报错了,就是没有写名字,和邮箱。按照所说的步骤来就好了。

这个时候咱们再查看:

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master
nothing to commit, working tree clean

已经为空,变成透明的了文件,实际上仍是存在的。

六、查看信息,提交的记录

git  reflog
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git reflog
72d22fe (HEAD -> master) HEAD@{0}: reset: moving to 72d22fe3836c39ae2a1e0e85e106           a41cc9b24898
c5cf29d HEAD@{1}: commit: 添加论文检查3功能
72d22fe (HEAD -> master) HEAD@{2}: commit (initial): 建立第一个版本本

七、回滚

git  reset --hard  (版本号)

 八、暂存,用于在开发过程当中临时须要修复bug或临时新功能的到来

stash用于将工做区发生变化的全部文件获取临时存储在“某个地方”,将工做区还原当前版本未操做前的状态;stash还能够将临时存储在“某个地方”的文件再次拿回到工做区。

git stash 做用:帮助咱们暂时存储已经开发的一些功能的代码,继续作其余事情。作完以后再回来继续开发。
git stash pop
特别的:执行 git stash pop 命令时,可能会遇到冲突,由于在紧急修复bug的代码和经过stash存储在“某个地方”的代码会有重合部分,因此执行 git stash pop 时候就会出现冲突,有冲突解决冲突便可。
stash相关经常使用命令:

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

九、与stash做用相同的是branch

分支学习:branch称为分支,默认仅有一个名为master的分支。通常开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。
git  branch dev                # 建立新分支,即:拷贝一份当前所在分支代码到新分支
git checkout dev               # 切换到dev分支

分支功能完成后,再合并。合并以前要回到master,在合并

git checkout master             # 切换回master分支 
git merge dev                   # 将dev分支内容合并到master分支

代码:

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch dev # 建立分支 拷贝一份当前所在分支代码到新支 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch # 查看一下分支
  dev
* master

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git checkout dev # 切换到dev分支
Switched to branch 'dev'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git add . # 将修改文件添加到版本库的暂存区 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git commit -m "论文修改3.1"    # 将暂存区的内容提交到当前所在分支,即:dev分支
[dev beb0313] 论文修改3.1
 1 file changed, 1 insertion(+)

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git status # 查看状态
On branch dev 
nothing to commit, working tree clean

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git checkout master  # 切换到master
Switched to branch 'master'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status                
On branch master
nothing to commit, working tree clean

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch picc 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git checkout picc
Switched to branch 'picc'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc)
$ git add . 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc)
$ git commit -m "修改论文3.1.1"
[picc 597a7e2] 修改论文3.1.1
 1 file changed, 1 insertion(+), 1 deletion(-)

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (picc)
$ git checkout master
Switched to branch 'master'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git merge picc # 合并
Updating c5cf29d..597a7e2
Fast-forward
 templates/index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git log
commit 597a7e216b13825f35a53932c7811fbbf7734187 (HEAD -> master, picc)
Author: unknown <1079264692@qq.com>
Date:   Wed Mar 13 11:27:14 2019 +0800

    修改论文3.1.1

commit c5cf29d6df4a152d82badeb414c89b2eb6711b28
Author: unknown <1079264692@qq.com>
Date:   Mon Mar 11 13:44:59 2019 +0800

    添加论文检查3功能

commit 72d22fe3836c39ae2a1e0e85e106a41cc9b24898
Author: unknown <1079264692@qq.com>
Date:   Mon Mar 11 13:35:18 2019 +0800

    建立第一个版本本

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git atatus
git: 'atatus' is not a git command. See 'git --help'.

The most similar command is
        status

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git status
On branch master
nothing to commit, working tree clean

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch -d picc # 删除这个分支
Deleted branch picc (was 597a7e2).

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch
  dev
* master

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git checkout dev
Switched to branch 'dev'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git status
On branch dev
nothing to commit, working tree clean

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git status
On branch dev
nothing to commit, working tree clean

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git status
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:   templates/index.html

no changes added to commit (use "git add" and/or "git commit -a")

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git add .

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git commit -m "论文暂时修改完"
[dev 1ac93af] 论文暂时修改完
 1 file changed, 1 insertion(+)

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git checkout master
Switched to branch 'master'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git merge dev
Auto-merging templates/index.html
CONFLICT (content): Merge conflict in templates/index.html
Automatic merge failed; fix conflicts and then commit the result.
branch相关经常使用命令:

git branch 分支名称             建立分支
git checkout 分支名称          切换分支
git branch -m 分支名称        建立并切换到指定分支
git branch                          查看全部分支
git branch -d 分支名称         删除分支
git merge 分支名称              将指定分支合并到当前分支

面试题:

若是代码出现bug,如何解决?

建立一个bug分支,而后进行bug处理,处理完毕后合并到master分支,而后删除bug分支。最后回到dev分支继续开发。

最后,咱们都写完功能后,若是是在家里边写完的,到公司之后若是没带电脑怎么办?这时候就有了GitHub托管平台。

GitHub介绍

GitHub,一个基于Git实现的代码托管的平台,能够将内容以及版本记录在远程也保存一份,这样就不用U盘咯(相似于云盘)。
PS: 相似GitHub的产品还有许多,如:GitLab、Bitbucket、码云等。

基于GitHub实现代码托管,须要一下步骤:

  • 注册GitHub
  • 建立仓库,建立完仓库后会有一个URL代指该仓库
  • git能够是用该URL进行向远程推送版本信息或获取版本信息

在家里,将开发完的功能提交到GitHub

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git remote add origin https://github.com/lllmy/gitdemo.git                 # 为地址起一个别名origin 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git push origin master # 将本地master分支内容以及版本信息推送到GitHub 
Enumerating objects: 42, done.
Counting objects: 100% (42/42), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (35/35), done.
Writing objects: 100% (42/42), 9.41 KiB | 566.00 KiB/s, done.
Total 42 (delta 10), reused 0 (delta 0)
remote: Resolving deltas: 100% (10/10), done.
To https://github.com/lllmy/gitdemo.git
 * [new branch]      master -> master

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git branch
  dev
* master

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (master)
$ git checkout dev
Switched to branch 'dev'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git push origin dev # 将本地dev分支内容以及版本信息推送到GitHub
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote:      https://github.com/lllmy/gitdemo/pull/new/dev
remote:
To https://github.com/lllmy/gitdemo.git
 * [new branch]      dev -> dev

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git pull origin dev
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/lllmy/gitdemo
 * branch            dev        -> FETCH_HEAD
   1ac93af..54efe99  dev        -> origin/dev
Updating 1ac93af..54efe99
Fast-forward
 templates/index.html | 1 +
 1 file changed, 1 insertion(+)

在公司,咱们在GitHub上把在家里写的功能代码给拉下来

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa
$ git clone https://github.com/lllmy/gitdemo.git # 将项目从GitHub中获取 
Cloning into 'gitdemo'... remote: Enumera ting objects: 42, done. remote: Counting objects: 100% (42/42), done. remote: Compressing objects: 100% (25/25), done. remote: Total 42 (delta 10), reused 42 (delta 10), pack-reused 0 Unpacking objects: 100% (42/42), done. 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa $ ls gitdemo/

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa $ cd gitdemo 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git branch  # 默认获取到得只有master分支 * master 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git branch dev 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (master) $ git checkout dev Switched to branch 'dev'

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git pull origin dev From https://github.com/lllmy/gitdemo * branch            dev        -> FETCH_HEAD Already up to date. 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git status On branch dev nothing to commit, working tree clean 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git status 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: templates/index.html no changes added to commit (use "git add" and/or "git commit -a") 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git add . 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git commit -m "会员功能1/3" [dev 54efe99] 会员功能1/3
 1 file changed, 1 insertion(+) 123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gggnaa/gitdemo (dev) $ git push origin dev Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 368 bytes | 184.00 KiB/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/lllmy/gitdemo.git 1ac93af..54efe99 dev -> dev
123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ ls
2.py  app01/  gitdemo/  manage.py*  templates/

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git fetch origin dev # 从GitHub仓库获取dev分支最新内容到版本库的分支
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 3), reused 6 (delta 3), pack-reused 0
Unpacking objects: 100% (6/6), done.
From https://github.com/lllmy/gitdemo
 * branch            dev        -> FETCH_HEAD
   d4cfd11..7f07a9e  dev        -> origin/dev

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ git merge origin/dev # 将版本库的分支内容合并到工做区
Updating d4cfd11..7f07a9e
Fast-forward
 1.py | 0
 3.py | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 1.py
 create mode 100644 3.py

123456@LAPTOP-M4E1QDHK MINGW64 /d/python/gitdemo (dev)
$ ls
1.py  2.py  3.py  app01/  gitdemo/  manage.py*  templates/
久而久之,将Git和GitHub结合使用作到避免电脑损坏形成数据丢失以及多地开发的问题,
上文执行过程当中执行 【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】,
而且在执行过程当中可能会出现冲突,缘由是因为本地代码和获取的最新代码有重合部分,那么就须要本身手动解决冲忽然后再继续开发。

面试题:

git  rebase的做用?

我在公司写代码忘记提交了,在家继续开发功能,在拉取代码后提交,用git fetch和gitmerge提交的时候会有一个分叉记录,咱们吧git merge换成git rebase会保持提交记录的整洁。

 

 以斜杠“/”开头表示目录;   以星号“*”通配多个字符;   以问号“?”通配单个字符   以方括号“[]”包含单个字符的匹配列表;   以叹号“!”表示不忽略(跟踪)匹配到的文件或目录; .gitignore
在git中若是想忽略掉某个文件,不让这个文件提交到版本库中,可使用修改 .gitignore 文件的方法。这个文件每一行保存了一个匹配的规则例如:

# 此为注释 – 将被 Git 忽略

            *.a       # 忽略全部 .a 结尾的文件
            !lib.a    # 但 lib.a 除外
            /TODO     # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
            build/    # 忽略 build/ 目录下的全部文件

            doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

    这样设置了之后 全部的 .pyc 文件都不会添加到版本库中去。

    另外 git 提供了一个全局的 .gitignore,你能够在你的用户目录下建立 ~/.gitignoreglobal 文件,以一样的规则来划定哪些文件是不须要版本控制的。

须要执行 git config --global core.excludesfile ~/.gitignoreglobal来使得它生效。

其余的一些过滤条件

    * ?:表明任意的一个字符
    * *:表明任意数目的字符
    * {!ab}:必须不是此类型
    * {ab,bb,cx}:表明ab,bb,cx中任一类型便可
    * [abc]:表明a,b,c中任一字符便可

    * [ ^abc]:表明必须不是a,b,c中任一字符

    因为git不会加入空目录,因此下面作法会致使tmp不会存在 tmp/*             //忽略tmp文件夹全部文件

    改下方法,在tmp下也加一个.gitignore,内容为
                        *
                        !.gitignore
    还有一种状况,就是已经commit了,再加入gitignore是无效的,因此须要删除下缓存
                        git rm -r --cached ignore_file

 

注意: .gitignore只能忽略那些原来没有被track的文件,若是某些文件已经被归入了版本管理中,则修改.gitignore是无效的。

    正确的作法是在每一个clone下来的仓库中手动设置不要检查特定文件的更改状况。
    git update-index --assume-unchanged PATH    在PATH处输入要忽略的文件。

    另外 git 还提供了另外一种 exclude 的方式来作一样的事情,不一样的是 .gitignore 这个文件自己会提交到版本库中去。用来保存的是公共的须要排除的文件。
而 .git
/info/exclude 这里设置的则是你本身本地须要排除的文件。 他不会影响到其余人。也不会提交到版本库中去。 .gitignore 还有个有意思的小功能, 一个空的 .gitignore 文件 能够看成是一个 placeholder 。当你须要为项目建立一个空的 log 目录时, 这就变的颇有用。
你能够建立一个 log 目录 在里面放置一个空的 .gitignore 文件。这样当你 clone 这个 repo 的时候 git 会自动的建立好一个空的 log 目录了。

 

git tag -a v1.0 -m '版本介绍'        本地建立Tag
    git show v1.0                       查看
    git tags -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

版本相关

 

先说一下相同点,两者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来作的,
它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合做开发项目的中心化云存储的场所。 GitHub做为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但若是要使用私有仓库,是须要付费的。 而GitLab解决了这个问题,你能够在上面建立私人的免费仓库。 GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有很多的特点: 容许免费设置仓库权限;容许用户选择分享一个project的部分代码;容许用户设置project的获取权限,进一步的提高安全性;
能够设置获取到团队总体的改进进度;经过innersourcing让不在权限范围内的人访问不到该资源。 从代码私有性方面来看,有时公司并不但愿员工获取到所有的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。

 链接:http://www.javashuo.com/article/p-uxaseany-bb.html

相关文章
相关标签/搜索