Git Tutorial

Git Tutorial

Git 是一个开源的分布式版本控制系统

Linux 平台上安装

Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。
Debian/Ubuntu Git 安装命令为:

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
$ apt-get install git
$ git --version
git version 2.32.0.windows.1

Windows 平台上安装

安装包下载地址:https://gitforwindows.org/
国内的镜像:https://npm.taobao.org/mirrors/git-for-windows/
下载 Git-2.32.0-64-bit.exe 安装文件并运行。
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端),另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到"Git"->“Git Bash”,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。

Git 配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

$ git config
usage: git config [<options>]

Config file location
    --global              use global config file
    --system            use system config file
    --local                use repository config file
......

这些变量可以存放在以下三个不同的地方:

  • • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。–system
  • • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。–global
  • • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件)。

每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Users\Administrator。
此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。

显示当前的 git 配置信息:

$ git config --list

编辑 git 配置文件:

$ git config -e    # 针对当前仓库 

或者:

$ git config -e --global   # 针对系统上所有仓库

用户信息

配置个人的用户名称和电子邮件地址:

$ git config --global user.name "yake1965"
$ git config --global user.email "765103879@qq.com"

$ git config user.name
yake1965
$ git config user.email
765103879@qq.com

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。

文本编辑器

设置 Git 默认使用的文本编辑器, 一般可能会是 Vi 或者 Vim。可以重新设置:

$ git config --global core.editor emacs

1、vim 工作模式

  1. 命令模式:接受、执行 vim 操作命令的模式,打开文件后的默认模式;
  2. 编辑模式:对打开的文件内容进行 增、删、改 操作的模式。

在编辑模式下按下 ESC 键,回退到命令模式;在命令模式下按 i,进入编辑模式。

2、创建文件

  • touch 文件名 # 创建文件。
  • touch 文件夹名 # 创建文件夹
  • vim 文件路径(或文件名),如果文件存在则打开现有文件,如果文件不存在则新建文件。
  • cat 文件名 # 查看文件内容

3、保存文件

  • 在命令模式下键入"ZZ"或者":wq"保存修改并且退出 vim。
  • 如果只想保存文件,则键入":w"。

4、放弃所有文件修改

  • 在命令模式下键入":q!"回车后放弃修改并退出 vim。
  • 放弃所有文件修改,在命令模式下键入":e!",回车后回到命令模式。

差异分析工具

还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:

$ git config --global merge.tool vimdiff

Git 可以理解 kdiff3,tkdiff,meld,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和 opendiff 等合并工具的输出信息。
当然,你也可以指定使用自己开发的工具,具体怎么做可以参阅第七章。

查看配置信息

要检查已有的配置信息,可以使用 git config --list 命令:

$ git config --list
user.email=765103879@qq.com
user.name=yake1965
......

有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig 和 ~/.gitconfig),不过最终 Git 实际采用的是最后一个。
这些配置我们也可以在 ~/.gitconfig 或 /etc/gitconfig 看到,如下所示:

vim ~/.gitconfig 

显示内容如下所示:

[user]
	user.email=765103879@qq.com
	user.name=yake1965

也可以直接查阅某个环境变量的设定,只要把特定的名字跟在后面即可,像这样:

$ git config user.name
yake1965

Git 工作流程

一般工作流程如下:

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

基本概念

我们先来理解下 Git 工作区、暂存区和版本库概念:
• 工作区:就是你在电脑里能看到的目录。
• 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
• 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
在这里插入图片描述

• 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
• 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
• 图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
• 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
• 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
• 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
• 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
• 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
• 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

Git 创建仓库

你可以使用一个已经存在的目录作为Git仓库。


git init # 在当前目录生成一个 .git 目录。
git init newrepo # 使用我们指定目录作为Git仓库。 

初始化后,会在目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:

$ git add *.c
$ git add README
$ git commit -m ‘初始化项目版本’
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。


git clone <repo> # 从现有 Git 仓库中拷贝项目。
git clone <repo> <directory> # 克隆到指定的目录

参数说明:
• repo:Git 仓库。
• directory:本地目录。
比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:

$ git clone git://github.com/schacon/grit.git
$ git clone https://github.com/XKYDIE/site.git

执行该命令后,会在当前目录下创建一个名为 grit 的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:

$ git clone git://github.com/schacon/grit.git mygrit

Git 基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
在这里插入图片描述

说明:
• workspace:工作区
• staging area:暂存区/缓存区
• local repository:或本地仓库
• remote repository:远程仓库
一个简单的操作步骤:

$ git init    
$ git add .    
$ git commit  

• git init - 初始化仓库。
• git add . - 添加文件到暂存区。
• git commit - 将暂存区内容添加到仓库中。

命令说明
git init初始化仓库
git clone拷贝一份远程仓库,也就是下载一个项目。
git add添加文件到仓库
git status查看仓库当前的状态,显示有变更的文件。
git diff比较文件的不同,即暂存区和工作区的差异。
git commit提交暂存区到本地仓库。
git reset回退版本。
git rm删除工作区文件。
git mv移动或重命名工作区文件。
git log查看历史提交记录
git blame 以列表形式查看指定文件的历史修改记录
git remote远程仓库操作
git fetch从远程获取代码库
git pull下载远程代码并合并
git push上传远程代码并合并

Git 分支管理
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。
创建分支命令:

git branch (branchname)

切换分支命令:

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
合并分支命令:

git merge 

你可以多次合并到统一分支, 也可以选择在合并之后直接删除被并入的分支。
开始前我们先创建一个测试目录:

$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository...
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (root-commit) 3b58100] 第一次版本提交
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

Git 分支管理
列出分支
列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支。

$ git branch
* master

此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。
当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。
如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch testing
$ git branch
* master
  testing

现在我们可以看到,有了一个新分支 testing。
当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。
接下来我们将演示如何切换分支,我们用 git checkout (branch) 切换到我们要修改的分支。

$ ls

README
$ echo ‘runoob.com’ > test.txt
$ git add .
$ git commit -m ‘add test.txt’
[master 3e92c19] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
$ ls
README test.txt
$ git checkout testing
Switched to branch ‘testing’
$ ls
README
当我们切换到 testing 分支的时候,我们添加的新文件 test.txt 被移除了。切换回 master 分支的时候,它们有重新出现了。
$ git checkout master
Switched to branch ‘master’
$ ls
README test.txt
我们也可以使用 git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。
$ git checkout -b newtest
Switched to a new branch ‘newtest’
$ git rm test.txt
rm ‘test.txt’
$ ls
README
$ touch runoob.php
$ git add .
$ git commit -am ‘removed test.txt、add runoob.php’
[newtest c1501a2] removed test.txt、add runoob.php
2 files changed, 1 deletion(-)
create mode 100644 runoob.php
delete mode 100644 test.txt
$ ls
README runoob.php
$ git checkout master
Switched to branch ‘master’
$ ls
README test.txt
如你所见,我们创建了一个分支,在该分支的上移除了一些文件 test.txt,并添加了 runoob.php 文件,然后切换回我们的主分支,删除的 test.txt 文件又回来了,且新增加的 runoob.php 不存在主分支中。
使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。
删除分支
删除分支命令:
git branch -d (branchname)
例如我们要删除 testing 分支:
$ git branch

  • master
    testing
    $ git branch -d testing
    Deleted branch testing (was 85fc7e7).
    $ git branch
  • master
    分支合并
    一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:
    git merge
    $ git branch
  • master
    newtest
    $ ls
    README test.txt
    $ git merge newtest
    Updating 3e92c19…c1501a2
    Fast-forward
    runoob.php | 0
    test.txt | 1 -
    2 files changed, 1 deletion(-)
    create mode 100644 runoob.php
    delete mode 100644 test.txt
    $ ls
    README runoob.php
    以上实例中我们将 newtest 分支合并到主分支去,test.txt 文件被删除。
    合并完后就可以删除分支:
    $ git branch -d newtest
    Deleted branch newtest (was c1501a2).
    删除后, 就只剩下 master 分支了:
    $ git branch
  • master
    合并冲突
    合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
    $ git branch
  • master
    $ cat runoob.php
    首先,我们创建一个叫做 change_site 的分支,切换过去,我们将 runoob.php 内容改为:
<?php echo 'runoob'; ?>

创建 change_site 分支:
$ git checkout -b change_site
Switched to a new branch ‘change_site’
$ vim runoob.php
$ head -3 runoob.php

<?php echo 'runoob'; ?>

$ git commit -am ‘changed the runoob.php’
[change_site 7774248] changed the runoob.php
1 file changed, 3 insertions(+)
将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的(空文件,没有代码),我们再次修改 runoob.php 文件。
$ git checkout master
Switched to branch ‘master’
$ cat runoob.php
$ vim runoob.php # 修改内容如下
$ cat runoob.php

<?php echo 1; ?>

$ git diff
diff --git a/runoob.php b/runoob.php
index e69de29…ac60739 100644
— a/runoob.php
+++ b/runoob.php
@@ -0,0 +1,3 @@
+<?php
+echo 1;
+?>
$ git commit -am ‘修改代码’
[master c68142b] 修改代码
1 file changed, 3 insertions(+)
现在这些改变已经记录到我的 “master” 分支了。接下来我们将 “change_site” 分支合并过来。
$ git merge change_site
Auto-merging runoob.php
CONFLICT (content): Merge conflict in runoob.php
Automatic merge failed; fix conflicts and then commit the result.

$ cat runoob.php # 代开文件,看到冲突内容

<?php
<<<<<<< HEAD
echo 1;

echo ‘runoob’;

change_site
?>
我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。
$ vim runoob.php
$ cat runoob.php

<?php echo 1; echo 'runoob'; ?>

$ git diff
diff --cc runoob.php
index ac60739,b63d7d7…0000000
— a/runoob.php
+++ b/runoob.php
@@@ -1,3 -1,3 +1,4 @@@

<?php +echo 1; + echo 'runoob'; ?>

在 Git 中,我们可以用 git add 要告诉 Git 文件冲突已经解决
$ git status -s
UU runoob.php
$ git add runoob.php
$ git status -s
M runoob.php
$ git commit
[master 88afe0e] Merge branch ‘change_site’
现在我们成功解决了合并中的冲突,并提交了结果。
Git 查看提交历史
Git 提交历史一般常用两个命令:
• git log - 查看历史提交记录。
• git blame - 以列表形式查看指定文件的历史修改记录。
git log
在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。
针对我们前一章节的操作,使用 git log 命令列出历史提交记录如下:
$ git log
commit d5e9fc2c811e0ca2b2d28506ef7dc14171a207d9 (HEAD -> master)
Merge: c68142b 7774248
Author: runoob test@runoob.com
Date: Fri May 3 15:55:58 2019 +0800

Merge branch 'change_site'

commit c68142b562c260c3071754623b08e2657b4c6d5b
Author: runoob test@runoob.com
Date: Fri May 3 15:52:12 2019 +0800

修改代码

commit 777424832e714cf65d3be79b50a4717aea51ab69 (change_site)
Author: runoob test@runoob.com
Date: Fri May 3 15:49:26 2019 +0800

changed the runoob.php

commit c1501a244676ff55e7cccac1ecac0e18cbf6cb00
Author: runoob test@runoob.com
Date: Fri May 3 15:35:32 2019 +0800
我们可以用 --oneline 选项来查看历史记录的简洁的版本。
$ git log --oneline
$ git log --oneline
d5e9fc2 (HEAD -> master) Merge branch ‘change_site’
c68142b 修改代码
7774248 (change_site) changed the runoob.php
c1501a2 removed test.txt、add runoob.php
3e92c19 add test.txt
3b58100 第一次版本提交
这告诉我们的是,此项目的开发历史。
我们还可以用 --graph 选项,查看历史中什么时候出现了分支、合并。以下为相同的命令,开启了拓扑图选项:

  • d5e9fc2 (HEAD -> master) Merge branch ‘change_site’
    |\
    | * 7774248 (change_site) changed the runoob.php
  • | c68142b 修改代码
    |/
  • c1501a2 removed test.txt、add runoob.php
  • 3e92c19 add test.txt
  • 3b58100 第一次版本提交
    现在我们可以更清楚明了地看到何时工作分叉、又何时归并。
    你也可以用 --reverse 参数来逆向显示所有日志。
    $ git log --reverse --oneline
    3b58100 第一次版本提交
    3e92c19 add test.txt
    c1501a2 removed test.txt、add runoob.php
    7774248 (change_site) changed the runoob.php
    c68142b 修改代码
    d5e9fc2 (HEAD -> master) Merge branch ‘change_site’
    如果只想查找指定用户的提交日志可以使用命令:git log --author , 例如,比方说我们要找 Git 源码中 Linus 提交的部分:
    $ git log --author=Linus --oneline -5
    81b50f3 Move ‘builtin-*’ into a ‘builtin/’ subdirectory
    3bb7256 make “index-pack” a built-in
    377d027 make “git pack-redundant” a built-in
    b532581 make “git unpack-file” a built-in
    112dd51 make “mktag” a built-in
    如果你要指定日期,可以执行几个选项:–since 和 --before,但是你也可以用 --until 和 --after。
    例如,如果我要看 Git 项目中三周前且在四月十八日之后的所有提交,我可以执行这个(我还用了 --no-merges 选项以隐藏合并提交):
    $ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
    5469e2d Git 1.7.1-rc2
    d43427d Documentation/remote-helpers: Fix typos and improve language
    272a36b Fixup: Second argument may be any arbitrary string
    b6c8d2d Documentation/remote-helpers: Add invocation section
    5ce4f4e Documentation/urls: Rewrite to accomodate transport::address
    00b84e9 Documentation/remote-helpers: Rewrite description
    03aa87e Documentation: Describe other situations where -z affects git diff
    77bc694 rebase-interactive: silence warning when no commits rewritten
    636db2c t3301: add tests to use --format="%N"
    更多 git log 命令可查看:http://git-scm.com/docs/git-log
    git blame
    如果要查看指定文件的修改记录可以使用 git blame 命令,格式如下:
    git blame
    git blame 命令是以列表形式显示修改记录,如下实例:
    $ git blame README
    ^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # Runoob Git 测试
    db9315b0 (runoob 2020-08-25 16:00:23 +0800 2) # 菜鸟教程
    Git 标签
    如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
    比如说,我们想为我们的 runoob 项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)“v1.0"的标签。
    -a 选项意为"创建一个带注解的标签”。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 我推荐一直创建带注解的标签。
    $ git tag -a v1.0
    当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
    现在,注意当我们执行 git log --decorate 时,我们可以看到我们的标签了:
  • d5e9fc2 (HEAD -> master) Merge branch ‘change_site’
    |\
    | * 7774248 (change_site) changed the runoob.php
  • | c68142b 修改代码
    |/
  • c1501a2 removed test.txt、add runoob.php
  • 3e92c19 add test.txt
  • 3b58100 第一次版本提交
    如果我们忘了给某个提交打标签,又将它发布了,我们可以给它追加标签。
    例如,假设我们发布了提交 85fc7e7(上面实例最后一行),但是那时候忘了给它打标签。 我们现在也可以:
    $ git tag -a v0.9 85fc7e7
    $ git log --oneline --decorate --graph
  • d5e9fc2 (HEAD -> master) Merge branch ‘change_site’
    |\
    | * 7774248 (change_site) changed the runoob.php
  • | c68142b 修改代码
    |/
  • c1501a2 removed test.txt、add runoob.php
  • 3e92c19 add test.txt
  • 3b58100 (tag: v0.9) 第一次版本提交
    如果我们要查看所有标签可以使用以下命令:
    $ git tag
    v0.9
    v1.0
    指定标签信息命令:
    git tag -a -m “runoob.com标签”
    PGP签名标签命令:
    git tag -s -m “runoob.com标签”

Git 远程仓库(Github)
Git 并不像 SVN 那样有个中心服务器。
目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。
本例使用了 Github 作为远程仓库,你可以先阅读我们的 Github 简明教程。


添加远程库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:
git remote add [shortname] [url]
本例以 Github 为例作为远程仓库,如果你没有 Github 可以在官网 https://github.com/注册。
由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:
使用以下命令生成 SSH Key:
$ ssh-keygen -t rsa -C “youremail@example.com”
后面的 your_email@youremail.com 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。
成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key。
$ ssh-keygen -t rsa -C “429240967@qq.com”
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
Your identification has been saved in /Users/tianqixin/.ssh/id_rsa.
Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI 429240967@qq.com
The key’s randomart image is:
±–[RSA 3072]----+
|E*+.+=oo |
|%Oo+oo=o. . |
|%
.o.o. |
|OO. o o |
|+o+ S |
|. |
| |
| |
| |
±—[SHA256]-----+
回到 github 上,进入 Account => Settings(账户配置)。

左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。

添加成功后界面如下所示

为了验证是否成功,输入以下命令:
$ ssh -T git@github.com
The authenticity of host ‘github.com (52.74.223.119)’ can’t be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes # 输入 yes
Warning: Permanently added ‘github.com,52.74.223.119’ (RSA) to the list of known hosts.
Hi tianqixin! You’ve successfully authenticated, but GitHub does not provide shell access. # 成功信息
以下命令说明我们已成功连上 Github。
之后登录后点击" New repository " 如下图所示:

之后在在Repository name 填入 runoob-git-test(远程仓库名) ,其他保持默认设置,点击"Create repository"按钮,就成功地创建了一个新的Git仓库:

创建成功后,显示如下信息:
git
以上信息告诉我们可以从这个仓库克隆出新的仓库,也可以把本地仓库的内容推送到GitHub仓库。
现在,我们根据 GitHub 的提示,在本地的仓库下运行命令:
$ mkdir runoob-git-test # 创建测试目录
$ cd runoob-git-test/ # 进入测试目录
$ echo “# 菜鸟教程 Git 测试” >> README.md # 创建 README.md 文件并写入内容
$ ls # 查看目录下的文件
README
$ git init # 初始化
$ git add README.md # 添加文件
$ git commit -m “添加 README.md 文件” # 提交并备注信息
[master (root-commit) 0205aab] 添加 README.md 文件
1 file changed, 1 insertion(+) create mode 100644 README.md

提交到 Github

$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master
以下命令请根据你在Github成功创建新仓库的地方复制,而不是根据我提供的命令,因为我们的Github用户名不一样,仓库名也不一样。
接下来我们返回 Github 创建的仓库,就可以看到文件已上传到 Github上:


查看当前的远程库
要查看当前配置有哪些远程仓库,可以用命令:
git remote
实例
$ git remote
origin
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)
执行时加上 -v 参数,你还可以看到每个别名的实际链接地址。


提取远程仓库
Git 有两个命令用来提取远程仓库的更新。
1、从远程仓库下载新分支与数据:
git fetch
该命令执行完后需要执行 git merge 远程分支到你所在的分支。
2、从远端仓库提取数据并尝试合并到当前分支:
git merge
该命令就是在执行 git fetch 之后紧接着执行 git merge 远程分支到你所在的任意分支。
假设你配置好了一个远程仓库,并且你想要提取更新的数据,你可以首先执行 git fetch [alias] 告诉 Git 去获取它有你没有的数据,然后你可以执行 git merge [alias]/[branch] 以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。
接下来我们在 Github 上点击" README.md" 并在线修改它:

然后我们在本地更新修改。
$ git fetch origin
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:tianqixin/runoob-git-test
0205aab…febd8ed master -> origin/master
以上信息"0205aab…febd8ed master -> origin/master" 说明 master 分支已被更新,我们可以使用以下命令将更新同步到本地:
$ git merge origin/master
Updating 0205aab…febd8ed
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
查看 README.md 文件内容:
$ cat README.md

菜鸟教程 Git 测试

第一次修改内容


推送到远程仓库
推送你的新分支与数据到某个远端仓库命令:
git push [alias] [branch]
以上命令将你的 [branch] 分支推送成为 [alias] 远程仓库上的 [branch] 分支,实例如下。
$ touch runoob-test.txt # 添加文件
$ git add runoob-test.txt
$ git commit -m “添加到远程”
master 69e702d] 添加到远程
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 runoob-test.txt

$ git push origin master # 推送到 Github
重新回到我们的 Github 仓库,可以看到文件已经提交上来了:


删除远程仓库
删除远程仓库你可以使用命令:
git remote rm [别名]
实例
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)

添加仓库 origin2

$ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git

$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)
origin2 git@github.com:tianqixin/runoob-git-test.git (fetch)
origin2 git@github.com:tianqixin/runoob-git-test.git (push)

删除仓库 origin2

$ git remote rm origin2
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)

Git Gitee
大家都知道国内访问 Github 速度比较慢,很影响我们的使用。
如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务——Gitee(gitee.com)。
Gitee 提供免费的 Git 仓库,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee 还提供了项目管理、代码托管、文档管理的服务,5 人以下小团队免费。
接下来我们学习一下如何使用 Gitee。
由于我们的本地 Git 仓库和 Gitee 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息。
1、我们先在 Gitee 上注册账号并登录后,然后上传自己的 SSH 公钥。
我们在 Git Github 章节已经生成了自己的 SSH 公钥,所以我们只需要将用户主目录下的 ~/.ssh/id_rsa.pub 文件的内容粘贴 Gitee 上。
选择右上角用户头像 -> 设置,然后选择 “SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的 .ssh/id_rsa.pub 文件的内容粘贴进去:

成功添加后如下图所示:

接下来我们创建一个项目。
点击右上角的 + 号,新建仓库:

然后添加仓库信息:

创建成功后看到如下信息:

接下来我们看下连接信息:

项目名称最好与本地库保持一致。
然后,我们在本地库上使用命令 git remote add 把它和 Gitee 的远程库关联:
git remote add origin git@gitee.com:imnoob/runoob-test.git
之后,就可以正常地用 git push 和 git pull 推送了!
如果在使用命令 git remote add 时报错:
git remote add origin git@gitee.com:imnoob/runoob-test.git
fatal: remote origin already exists.
这说明本地库已经关联了一个名叫 origin 的远程库,此时,可以先用 git remote -v 查看远程库信息:
git remote -v
origin git@github.com:tianqixin/runoob.git (fetch)
origin git@github.com:tianqixin/runoob.git (push)
可以看到,本地库已经关联了 origin 的远程库,并且,该远程库指向 GitHub。
我们可以删除已有的 GitHub 远程库:
git remote rm origin
再关联 Gitee 的远程库(注意路径中需要填写正确的用户名):
git remote add origin git@gitee.com:imnoob/runoob-test.git
此时,我们再查看远程库信息:
git remote -v
origin git@gitee.com:imnoob/runoob-test.git (fetch)
origin git@gitee.com:imnoob/runoob-test.git (push)
现在可以看到,origin 已经被关联到 Gitee 的远程库了。
通过 git push 命令就可以把本地库推送到 Gitee 上。
有的小伙伴又要问了,一个本地库能不能既关联 GitHub,又关联 Gitee 呢?
答案是肯定的,因为 git 本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库。
使用多个远程库时,我们要注意,git 给远程库起的默认名称是 origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。
仍然以 runoob-test 本地库为例,我们先删除已关联的名为 origin 的远程库:
git remote rm origin
然后,先关联 GitHub 的远程库:
git remote add github git@github.com:tianqixin/runoob-git-test.git
注意,远程库的名称叫 github,不叫 origin 了。
接着,再关联 Gitee 的远程库:
git remote add gitee git@gitee.com:imnoob/runoob-test.git
同样注意,远程库的名称叫 gitee,不叫 origin。
现在,我们用 git remote -v 查看远程库信息,可以看到两个远程库:
git remote -v
gitee git@gitee.com:imnoob/runoob-test.git (fetch)
gitee git@gitee.com:imnoob/runoob-test.git (push)
github git@github.com:tianqixin/runoob.git (fetch)
github git@github.com:tianqixin/runoob.git (push)
如果要推送到 GitHub,使用命令:
git push github master
如果要推送到 Gitee,使用命令:
git push gitee master
这样一来,我们的本地库就可以同时与多个远程库互相同步:

Git 服务器搭建
上一章节中我们远程仓库使用了 Github,Github 公开的项目是免费的,2019 年开始 Github 私有存储库也可以无限制使用。
这当然我们也可以自己搭建一台 Git 服务器作为私有仓库使用。
接下来我们将以 Centos 为例搭建 Git 服务器。
1、安装Git
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
$ yum install git
接下来我们 创建一个git用户组和用户,用来运行git服务:
$ groupadd git
$ useradd git -g git
2、创建证书登录
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
如果没有该文件创建它:
$ cd /home/git/
$ mkdir .ssh
$ chmod 755 .ssh
$ touch .ssh/authorized_keys
$ chmod 644 .ssh/authorized_keys
3、初始化Git仓库
首先我们选定一个目录作为Git仓库,假定是/home/gitrepo/runoob.git,在/home/gitrepo目录下输入命令:
$ cd /home
$ mkdir gitrepo
$ chown git:git gitrepo/
$ cd gitrepo

$ git init --bare runoob.git
Initialized empty Git repository in /home/gitrepo/runoob.git/
以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:
$ chown -R git:git runoob.git
4、克隆仓库
$ git clone git@192.168.45.4:/home/gitrepo/runoob.git
Cloning into ‘runoob’…
warning: You appear to have cloned an empty repository.
Checking connectivity… done.
192.168.45.4 为 Git 所在服务器 ip ,你需要将其修改为你自己的 Git 服务 ip。
这样我们的 Git 服务器安装就完成。

入门
1、建立或使用一个目录作为仓库(repository) 即:Git仓库根目录
git init [指定目录]
添加文件
git add filename
提交版本
提交到仓库。
git commit -m “Adding files”
如果您不使用-m,会出现编辑器来让你写自己的注释信息。
当我们修改了很多文件,而不想每一个都add,想commit自动来提交本地修改,我们可以使用-a标识。
git commit -a -m “Changed some files”
git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。
千万注意,-a不会造成新文件被提交,只能修改。
发布版本
我们先从服务器克隆一个库并上传。
git clone ssh://github.com/yake1965/gitdemo.git
Please make sure you have the correct access rights
and the repository exists.

$ git clone ssh://github.com/yake1965/gitdemo.git
Cloning into ‘gitdemo’…
Warning: Permanently added the RSA host key for IP address ‘52.74.223.119’ to the list of known hosts.
Administrator@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

git clone https://github.com/yake1965/gitdemo.git
Cloning into ‘gitdemo’…
remote: Enumerating objects: 116, done. …
git clone git@github.com:yake1965/gitdemo.git
fatal: destination path ‘gitdemo’ already exists and is not an empty directory.
已经克隆,删除之后,再运行成功。
现在我们修改之后可以进行推送到服务器。
git push ssh://example.com/~/www/project.git
取回更新
如果您已经按上面的进行push,下面命令表示,当前分支自动与唯一一个追踪分支进行合并。
git pull
从非默认位置更新到指定的url。
git pull http://git.example.com/project.git
已经超过了五分钟?
删除
如何你想从资源库中删除文件,我们使用rm。
git rm file
分支与合并
分支在本地完成,速度快。要创建一个新的分支,我们使用branch命令。
git branch test
branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。
git checkout test
第一个分支,或主分支,被称为"master"。
git checkout master
对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。
git checkout master
git merge test
如果您想删除分支,我们使用-d标识。
git branch -d test
相关文章
• Github 简明教程:http://www.runoob.com/w3cnote/git-guide.html
Github 简明教程
分类 编程技术
如果你是一枚Coder,但是你不知道Github,那么我觉的你就不是一个菜鸟级别的Coder,因为你压根不是真正Coder,你只是一个Code搬运工。
但是你如果已经在读这篇文章了,我觉的你已经知道Github了。
正是Github,让社会化编程成为现实。
什么是 Github?
github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开。
Github 由Chris Wanstrath, PJ Hyett 与Tom Preston-Werner三位开发者在2008年4月创办。迄今拥有59名全职员工,主要提供基于git的版本托管服务。
目前看来,GitHub这场冒险已经胜出。根据来自维基百科关于GitHub的描述,我们可以形象地看出GitHub的增长速度:

今天,GitHub已是:
• 一个拥有143万开发者的社区。其中不乏Linux发明者Torvalds这样的顶级黑客,以及Rails创始人DHH这样的年轻极客。
• 这个星球上最流行的开源托管服务。目前已托管431万git项目,不仅越来越多知名开源项目迁入GitHub,比如Ruby on Rails、jQuery、Ruby、Erlang/OTP;近三年流行的开源库往往在GitHub首发,例如:BootStrap、Node.js、CoffeScript等。
• alexa全球排名414的网站。
注册账户以及创建仓库
要想使用github第一步当然是注册github账号了, github官网地址:https://github.com/。 之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称后Create,之后会出现一些仓库的配置信息,这也是一个git的简单教程。
Github 安装
• 下载 git OSX 版
• 下载 git Windows 版
• 下载 git Linux 版
配置Git
首先在本地创建ssh key;
$ ssh-keygen -t rsa -C “your_email@youremail.com”
后面的your_email@youremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开id_rsa.pub,复制里面的key。
回到github上,进入 Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title随便填,粘贴在你电脑上生成的key。

为了验证是否成功,在git bash下输入:
$ ssh -T git@github.com
如果是第一次的会提示是否continue,输入yes就会看到:You’ve successfully authenticated, but GitHub does not provide shell access 。这就表示已成功连上github。
接下来我们要做的就是把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。
$ git config --global user.name “your name”
$ git config --global user.email “your_email@youremail.com”
进入要上传的仓库,右键git bash,添加远程地址:
$ git remote add origin git@github.com:yourName/yourRepo.git
后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库,加完之后进入.git,打开config,这里会多出一个remote “origin"内容,这就是刚才添加的远程地址,也可以直接修改config来配置远程地址。
<h3创建新仓库< h3=”">
创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库。
检出仓库
执行如下命令以创建一个本地仓库的克隆版本:
git clone /path/to/repository
如果是远端服务器上的仓库,你的命令会是这个样子:
git clone username@host:/path/to/repository
工作流
你的本地仓库由 git 维护的三棵"树"组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。
你可以提出更改(把它们添加到暂存区),使用如下命令:
git add
git add *
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
git commit -m “代码提交信息”
现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。

推送改动
你的改动现在已经在本地仓库的 HEAD 中了。执行如下命令以将这些改动提交到远端仓库:
git push origin master
可以把 master 换成你想要推送的任何分支。

如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin
如此你就能够将你的改动推送到所添加的服务器上去了。
分支
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是"默认的"分支。在其他分支上进行开发,完成后再将它们合并到主分支上。

创建一个叫做"feature_x"的分支,并切换过去:
git checkout -b feature_x
切换回主分支:
git checkout master
再把新建的分支删掉:
git branch -d feature_x
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
git push origin
更新与合并
要更新你的本地仓库至最新改动,执行:
git pull
以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:
git merge
在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功:
git add
在合并改动之前,你可以使用如下命令预览差异:
git diff <source_branch> <target_branch>
标签
为软件发布创建标签是推荐的。这个概念早已存在,在 SVN 中也有。你可以执行如下命令创建一个叫做 1.0.0 的标签:
git tag 1.0.0 1b2e1d63ff
1b2e1d63ff 是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:
git log
你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。
替换本地改动
假如你操作失误(当然,这最好永远不要发生),你可以使用如下命令替换掉本地改动:
git checkout –
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master
实用小贴士
内建的图形化 git:
gitk
彩色的 git 输出:
git config color.ui true
显示历史记录时,每个提交的信息只显示一行:
git config format.pretty oneline
交互式添加文件到暂存区:
git add -i
链接与资源
图形化客户端
• GitX (L) (OSX, 开源软件)
• Tower (OSX)
• Source Tree (OSX, 免费)
• GitHub for Mac (OSX, 免费)
• GitBox (OSX, App Store)
指南和手册
• Git 社区参考书
• 专业 Git
• 像 git 那样思考
• GitHub 帮助
• 图解 Git
相关文章
• Github 简明指南:http://rogerdudler.github.io/git-guide/index.zh.html
• 如何高效利用GitHub:http://www.yangzhiping.com/tech/github.html
</h3创建新仓库<>
如何高效利用GitHub
正是Github,让社会化编程成为现实。本文尝试谈谈GitHub的文化、技巧与影响。
• Q1:GitHub是什么
• Q2:GitHub风格
• Q3: 在GitHub,如何跟牛人学习
• Q4: 享受纯粹的写作与演讲
• Q5: 代码帮你找工作
• Q6: GitHub还在影响一些什么
• Q7: 除了GitHub,还可以选择什么?
Q1:GitHub是什么
A1:一家公司

位于旧金山,由Chris Wanstrath, PJ Hyett 与Tom Preston-Werner三位开发者在2008年4月创办。迄今拥有59名全职员工,主要提供基于git的版本托管服务。
在此之前,它是由Tom与Chris 在本地程序员聚会中,开始的一个用于托管git的项目。正如每个伟大的传奇都开始于一场冒险,Tom在这篇文章我如何辞掉微软30万年薪邀约,创办GitHub中谈到:
当我老去,回顾一生,我想说,“哇,那是一场冒险“;而不是,“哇,我真的很安稳。“
另一位创始人Chris也详细描述了GitHub初创的前因后果,他说道:
Do whatever you want.
于是,在2008年4月10号这一天,GitHub正式成立。
目前看来,GitHub这场冒险已经胜出。根据来自维基百科关于GitHub的描述,我们可以形象地看出GitHub的增长速度:

今天,GitHub已是:
• 一个拥有143万开发者的社区。其中不乏Linux发明者Torvalds这样的顶级黑客,以及Rails创始人DHH这样的年轻极客。
• 这个星球上最流行的开源托管服务。目前已托管431万git项目,不仅越来越多知名开源项目迁入GitHub,比如Ruby on Rails、jQuery、Ruby、Erlang/OTP;近三年流行的开源库往往在GitHub首发,例如:BootStrap、Node.js、CoffeScript等。
• alexa全球排名414的网站。
Q2:GitHub风格
A2: GitHub只是GitHub
强调敏捷开发与快速原型,而又的确成功的创业团队,常具备一个重要气质:有自己的文化风格。如GitHub,又如37signals。通过他们的快速开发,向用户证明了团队在技术上的能力,并且时常有惊喜。同时,通过强调特立独行的文化,将对半衰期过短的产品族群的信任转为对GitHub团队的信任。
Gravatars的创始人(对,就是互联网最流行的头像托管系统)、Jekyll(对,它就是我近几年用的博客系统)作者、GitHub创始人,现任CTO Tom在GitHub第一年学到的10大教训、创业学校演讲中谈到GitHub文化的方方面面。我尝试将这种风格总结为以下要点:
• 专注创作,高创意
• 运营良好与较高的内外满意度
• 高利润,较低的融资额或零融资
创业公司多半死在钱上,就让我们先从钱谈起:
高利润,较低的融资额或者零融资
类似于GitHub这样的公司,拿到风险投资很难吗?恰恰相反,创始人PJ Hyett 在Hacker News的一篇评论中提到,自从GitHub创办以来,已与几十个VC沟通过。但是,直到今天,GitHub的融资额还是为零,并引以为豪。让我们看看GitHub官网的自我介绍:

运营良好与较高的内外满意度
在Quora上有人问道,GitHub是否寻找被收购?,还是PJ Hyett ,他的回答是:No。
GitHub从一开始就运营良好,员工拥有较高满意度,看看这些不太一样的做法:
• 每一位GitHub公司的新员工,官方博客将发表文章欢迎。
• 在GitHub内部,没有经理,需求内容与优先级由项目组自行决策。
• 选择自己的工作时间、工作地点。
• 员工来自开源社区。
• 能开源的尽可能开源。
富有激情、创意的员工使得GitHub得到了社区的广泛认同,从而拥有极高的客户满意度,并从创业一开始就盈利。一份早期的调查表明,GitHub很快成为Git托管首选。
专注创作,高创意
GitHub59名全职员工仅有29名员工在本地工作!不仅仅是工作地点的安排富有创意,GitHub员工Holman, 详细介绍了GitHub的工作方式:
• 时间并不能说明什么
• 异步工作方式
• 创造力很重要
Q3:在GitHub,如何跟牛人学习
A3:在学习区刻意练习
追随牛人,与他们一起修行
修行之道:
关注大师的言行,
跟随大师的举动,
和大师一并修行,
领会大师的意境,
成为真正的大师。
正如这首禅诗所言,与其在墙内仰望牛人,不如直接在GitHub:
• watch、fork牛人们
• 对他们的项目提交pull request
• 主动给牛人们的项目写wiki或提交测试用例,或者问题
• 还可以帮他们翻译中文
GitHub本身建构在git之上,git成为勾搭大师们的必要工具,以下读物成为首选:
• git大白话入门,木有高深内容
• 为什么git胜过X…
如果希望进一步深入,可以阅读已有中文翻译版的材料:
• progit:GitHub公司传道士schacon所作,已翻译成多国语言,当然,有中文版。
• Git Magic:已有志愿者翻译中文版。
同样,如果希望了解更多GitHub自身的知识,GitHub官方文档值得推荐:
• The GitHub Hep
牛人在哪里?
• GitHub上的代码库本身:尤其是:Explore、热门关注信息库两个栏目
• GitHub官方推荐:GitHub自身的官方博客与GitHub员工们的个人博客推荐的项目与开发者
• 各类社交媒体上提到的的GitHub库:尤其是Hacker News上提到的GitHub库。
关于学习的心理学研究,常常会谈到一个术语:元认知、元学习、元知识。是的,关于认知的认知、关于学习的学习、关于知识的知识,你对这些信息的偏好与熟练掌握,会让你在学习一门新东西时更加轻车熟路。对一手信息进行回溯,比如作者、创始人、最初文献出处,总是会让你更容易理解知识。
在学习区刻意练习:借助GitStats进行项目统计
在如何学习一门新的编程语言?——在学习区刻意练习中,我已谈过:
学习编程最好的方式是在学习区刻意练习。
如何进行自我监督?
借助于GitStats,我们能很好地统计自己的每个项目的工作量,从而看到工作进展。
用法如下,
#复制GitStats项目到本地
cd ~/dev
git clone git://github.com/trybeee/GitStats.git
python ~/dev/gitstats/git-stats /youproject public
以下为生成结果示范:
每周代码提交次数:

每天代码提交行数:

如果Fork别人的项目或者多人合作项目,最好每人都拥有一个独立分支,然后由项目维护人合并。如何建立自己的分支?

分支的创建和合并

git branch yourbranch

git checkout yourbranch 切换到yourbranch

开发yourbranch分支,然后开发之后与master分支合并

git checkout master

git merge yourbranch

git branch -d yourbranch 合并完后删除本地分支

如何将牛人的远程分支更新到自己的本地分支?

查看当前项目下远程

git remote

增加新的分支链接,例如

git remote add niuren giturl…

获取牛人的远程更新

git fetch niuren

将牛人的远程更新合并到本地分支

git merge niuren/master
生产力小技巧
codeshelver:给git库做标签
观察的项目如果多了,怎么管理?用codeshelver,安装扩展之后,可以对GitHub项目做标签。
gollum:利用git与github做wiki
gollum是一个基于git的轻型wiki系统。
GitHubwatcher: 监测重点项目
GitHubwatcher适用于通知不频繁的情景。
GitHub官方资源
GitHub官方列出了一些有用的脚本与书签。
社区驱动的安装与配置文件
GitHub中各类配置文件层出不穷,一些常用的:
• osh-my-zsh:将终端从bash改为zsh之后,可考虑安装社区驱动的zsh配置文件,含有多个插件。可参考旧文zsh与oh-my-zsh
• gitignore:GitHub官方出品
• yourchili:服务器各类安装shell,比如安装nginx等。
Q4: 享受纯粹的写作与演讲
A4:回归创作的初始
写作
早在2008年,就有技术图书作者通过Git来写作,以下是示范:
• Node.js初学者教材,中文版在这里。
• backbone基础
• Sinatra教程
你能想到的技术前沿话题,大多能在GitHub找到相应的培训材料或者开源图书。
个人写作照样适用。在前文理想的写作环境:Git+GitHub+Markdown+Jekyll,我已经格外赞美过这些美好事物了。
暖色调的灯光,足够宽度的工作台,听着清脆的键盘声音,基于Git、GitHub、Markdown与Jekyll来写作,不担心写废与排版,只关注最纯粹的写作,是一种享受。我有时候会想,如果Git、Github、Markdown、Jekyll,再加上Yaml、Json的作者,让这些作者们重新来设计今天互联网基础架构偏文本的部分,会诞生一些什么?
个人博客
借助于Jekyllbootstrap,可以在Github上快速搭建一个基于jekyll的博客系统。
除了这个简单易行的办法之外,还存在一些其他方法,例如:
• Jekyll:参考告别wordpress,拥抱jekyll
• Octopress:参考Ruby开源项目介绍(1):octopress——像黑客一样写博客
• GitHub Pages:参考GitHub Pages
演讲
借助于GitHub,可以享受更纯粹、更酷的演讲。GitHub 2011年收购Ordered List之后,从此可以通过speakerdeck更好的分享ppt文档。
我们还可以:
• 使用GitHub著名传教士、Progit作者Scott Chacon开发的showoff
• 来自开源社区的其他演讲库impress.js
Q5: 代码帮你找工作
A5:GitHub简历很诚实
NumEricR(非GitHub工作人员)基于GitHub Pages功能做了一个简历生成器,使用极其简单,登陆网站GitHub简历生成器,填入你的GitHub网站用户名即可。
fredwu是Ruby中文社区活跃份子,他的开源项目angel_nest,一个天使投资与创业者对接的网站,适合Ruby初学者升级为Ruby中级开发者时学习,也在Hacker News上被热烈讨论过,让我们来看看他的简历:
http://resume.GitHub.com/?fredwu
正是因为GitHub上的代码无法造假,也容易通过你关注的项目来了解知识面的宽度与深度。现在越来越多知名公司活跃在GitHub,发布开源库并招募各类人才,例如:Facebook、Twitter、Yahoo …
开始有了第三方网站提供基于GitHub的人才招聘服务,例如:
• GitHire:通过它,可以找出你所在地区的程序员。
• Gitalytics.com:通过它,能评估某位程序员在GitHub、LinkedIn、StackOverflow、hackernews等多个网站的影响力。
Q6: GitHub还在影响一些什么
A6:让计算机增强人类智慧
很多年前,在某个名声显赫的学府中,两位先后拿过图灵奖的牛人有一段对话:
• 牛人A:我们要给机器赋予智慧,让他们有自我意识!
• 牛人B:你要给机器做那么多好事?那你打算给人类做点什么呢?
这段对话来自《失控》。牛人A是明斯基,他最喜欢将人类看做有血肉的机器,他的框架理论成为认知心理学、人工智能入门基础。牛人B则是恩格尔巴特。当明斯基1961年发表他著名的文章人工智能走向时,恩格尔巴特还籍籍无名。直到次年,恩格尔巴特发表宏文:人类智力的增强:一种概念框架。提出不同于明斯基的另一条增强人类智力的道路:不要尝试发明自动打字的机器,而是尝试发明鼠标,并且他真的发明鼠标成功了!
从近些年的发展来看,仍然是明斯基占上风,但是,三十年河东,三十年河西,明斯基的人工智能方向又有多少年没有大突破了?相反,来自恩格尔巴特的群件、集体智慧等思想,逐步成为步入Web2.0时代之后的共识。无关对错,可以说,恩格尔巴特为增强人类智力,提供了可行的框架。与其去发明聪明的、昂贵的、功能一体化的智能机器人,还不如发明类似于鼠标这样笨笨的、廉价的、功能单一的人类智慧服务单件。明斯基的机器人很容易陷入死胡同,没有上升到哲学的高度。现在慢慢又回到恩格尔巴特这个方向来了。比如现在IBM开始宣传的认知计算。
从git与GitHub设计与解决的问题本质来看,明显加速了代码生产流程,促进了卓越智力产品的诞生。这就是一种典型的web2.0对智力生产流程的改良与人类智慧的增强。同样,某种意义上,小说写作网站也起到类似作用。但是,学术界尤其是社会科学类的智力产品生产似乎还停留在一个古老阶段。在开源领域,好想法层出不穷,极客影响极客,最终产生的是酷玩意。这些酷玩意抛弃浮华,直奔问题本质。那么,有没有科学界的GitHub??
类似问题层出不穷,以下为其他领域产品不完全名单。
学术研究
• 除了较早的arXiv、PLoS之外,较有气象的可以推荐mendeley、开放期刊目录
数据
• buzzdata:数据分享更容易
科学计算
• opani:雏形中,支持R、Python等多种。
教育
• OpenStudy:一个社会性学习网络,通过互助来更好地学习,主题涉及到计算机、数学、写作等。
• openhatch: 通过练习、任务等帮助新手更好地进入开源社区
Q7:除了GitHub,还可以选择什么?
A7:nil
因为进化的需要,多数裸猿存在选择强迫症:哪种程序语言更好?哪个web开发框架更好?当然,最令宅男技术男们羡慕的问题是,高白瘦御姐还是青春小萝莉好?😄
除了GitHub之外,
• 中国山寨品是不是更好?(为什么不写他们名字,你懂的,山寨品总是善于争论谁是第一个山寨的,各自的排名先后:D)
• 免费的BitBucket是不是更适合Python程序员?
• 作为一名折腾族,我不自己搭建一个gitlabhq,是不是对不起自己?
我们可以理解,正是因为无数条分岔路口,让人类不再受制于某种基因、特定疾病、独裁家族,从而拥有无限的可能。但是,这种选择强迫症与远古时代可怜的信息量相比较,
• 今天这个大数据时代,它还会有助于人类作为族群的整体进化与作为个体的幸福吗?
• 今天一位一线城市30岁大学毕业生经历的选择与孔子整个一生经历的选择,纯论数量,谁多谁少?
生命如此短暂,为什么总要将青春浪费在不断的选择之中呢?罚你,回头阅读心理学家施瓦茨(Barry Schwartz)的TED演讲:选择之困惑——为何多即是少,1百遍啊1百遍。请记住施瓦茨的演讲要点:
• 更多的选择不代表更多的自由;
• 更多的选择导致决策的延迟和降低的满意感;
• 快乐之秘诀,在于降低自己的期望值。
相关参考
• 理想的写作环境:Git+GitHub+Markdown+Jekyll
• 如何提高创作型任务的效率?
• Ruby开源项目介绍(1):Octopress——像黑客一样写博客
• Git与GitHub入门资料
• 告别WordPress,拥抱Jekyll
Git可视化极简易教程 — Git GUI使用方法
分类 编程技术
前言
之前一直想一篇这样的东西,因为最初接触时,我也认真看了廖雪峰的教程,但是似乎我觉得讲得有点多,而且还是会给我带来很多多余且重复的操作负担,所以我希望能压缩一下它在我工作中的成本,但是搜索了一下并没有找到满意的教程,新的一年自己梳理一下自己的经验。
可能男生们大神比较多,觉得Git是如此简单,便已觉得命令行操作就是SO EASY,甚至或许有看不起可视化这样面对低端用户的心理,好的,那您就当我是水货可以右上角了。
我一直觉得类似GIT这样的东西,他对于我而言只是个不完全必须的工具,我并不想成为使用他的专家,类似的东西,今天有GIT,明天可能有GAT,或者GAY?所以快速地掌握它我需要的重要日常操作,最好是10分钟,那就好了,如果你有类似的想法,好吧,那不要废话了,咱们赶紧开始。
(全文限windows系统。)
何为GIT?
安装GIT,大致了解下GIT是做某子的。
权限校验
首先,您的数据保存在远端服务器一份,服务器需要对您的身份识别。一段RSA加密字符串。
启动GUI,菜单-帮助,【Step1-创建密钥】Generate SSH KEY

【Step2-添加密钥】去你的代码托管服务器,你的账号设置中,添加它。
比如在Github中的地址,title随意,比如你可以用Home,company等作为标识来区别。

Gitlab中的演示

账号保存
如果不做设置的话,每次提交的时候,都会询问你填写密码。于是我们先来把这个设置好。
【Step3.1-添加环境变量】
我的电脑 - 属性 - 高级系统设置 - 环境变量 - 新建变量
变量名HOME,变量值%USERPROFILE%

【Step3.2-创建账号文件】
开始 - 运行 中打开%Home%,即windows的管理员账号文件夹。
新建一个名为"_netrc"的文件,填写你要保存的服务器地址及账号密码,保存。

操作流程
如果你用过SVN的话就会大致了解操作流程,如果没有也没关系。
初始化(Git init)
顾名思义,就是新建一个项目,跟你用PS新建一张画布一样。在你新建好的文件夹中右键创建即可,若点击Git bash则以此目录作为当前目录进入命令行状态。

添加(Git add)
添加并不是提交代码到远程Git库,Git也并不会你修改了代码它自动帮你保存你修改的每一个过程。你修改了很多文件,但未必所有的修改,最终打算提交上去,那么哪些是你打算提交的,你可以添加进来待会提交,叫做缓存改动。很简单,比如本地电脑上我有整个项目完整的东东,甚至包含了账号密码的一些文件,但是我只是ADD除账号密码之外的文件,并不缓存账号密码文件的改动。不被ADD它就不会参与后续的操作。通常我都会直接全部缓存,它会自动寻找所有有改动的文件,而不需要提交的文件放在忽略的文件夹中。(关于忽略下面我们就会说到)

忽略(.gitignore)
但实际上大部分我们的文件都是一起提交的,并不会逐一去甄选,又或者类似PSD这样的大源文件以及并不作为产品最终展示的过渡文件,我们可以统一放在临时文件夹中,并忽略此文件夹。

提交(Git commit)
提交则代表此前被添加ADD的文件已确认被提交到Git库了。需要注意的是,如果你改变代码的缩进(尽管没有修改内容),默认状态下会被识别为整个代码全部变更。提交的时候是要求必须要写备注的。

上传(Git push)
顾名思义,上传则是上至远端服务器了,小伙伴们可以看到咱们的渣渣代码了(好羞涩。

获取远程代码(Git remote/fetch)
比如你在公司做好的东东,今夜难眠十分亢奋,回家准备继续搬砖,那咱们就在家里的电脑上,同上进行好各种安装配置账号,先把公司做好的东东嫩下来(不过公司是内网不可以,但是假如是Github上是可以的)。又或者和小伙伴一起开发个啥,你也要先fetch他的下来。至于怎么操作,下面上图。现在你只要知道,大大们下齿全露刷牙表情对你口口念念的fetch是个啥子~
来,跟我念,fetch~~(我怕你们脑补不出来……)
先来设置与远程地址的关联,Git remote:

填写SSH地址与项目名。下面有3个选项:
第一个:立刻获取最新改动(所以如果是本地克隆远程一个项目,也可以这样操作)。
第二个:本地新建的项目,初始化远程仓库并发布过去。
第三个:什么也不做。
在项目的进行过程中,获取仓库的最新改动Git fetch

选择从远程仓库哪个分支中获取更新,如果没有则只有主支。
提示成功则改动的已经被存放到临时区了,你一会还需要进行合并操作,如果没有任何改动,则列表中是空的,比如:

合并(Git merge)
请注意啦,不管你本地有没有代码,fetch之后呢,是都要merge的,也就是说,fetch下来后,大大的代码还在一个小黑屋里,我们需要把它装到自己兜里。
选择合并 - 本地合并,然后选择本地的分支(如果你没有创建分支,则只有1个主支master)

冲突处理(Conflict)
合并的过程中可能会出现一些红色的文件与一堆叹号,这时候慌慌张张的点啥它都不管用,不用担心,不是程序坏了,只是有冲突的文件,例如A童鞋写了width:1180px,你写了width:auto。那到底用你们谁的呢。
在GUI界面正文区,正文区右键可以选择,Use local version(使用本地版本)或Use remote version(使用远程版本),到底用你的还是小伙伴的?或者你也可以自己再整合。

其他还有分支和一些高级功能,如果需要了解可以自己再摸索摸索,以上的操作已经可以满足简单的开发需求了。
总结
1.先进行安装,密钥添加,账号等一次性操作。
2.操作流程:

是不是觉得so easy了呢,赶紧have a try!
来源:http://www.cnblogs.com/iruxu/p/gitgui.html
互联网组织的未来:剖析GitHub员工的任性之源
分类 编程技术

如果有这么家任性的公司,没有所谓"经理人"这一层,人都在做自己喜欢的事情,并且创造价值,而其他的事情,就顺其自然让他发生。这里能节省多少官僚主义带来的浪费?这样的公司得跑得有多快?得有多少无谓的冲突消解于无形?能形成多惊人的创新文化啊?
GitHub就是一家尝试无线趋近这种理想主义的公司!程序猿(媛)们应该都知道GitHub,GitHub是一个开发员的协作平台,截至2014年统计,有超过340万用户,而且正在迅速商业化。
GitHub是一家建立在开源软件上的私营的盈利公司,但是整个运作过程中,他们都在实践开源协作的精神——整个公司都倡导志愿工作。还是不明白到底怎么玩的?且听我给你解释。
开放式工作分配
大多数公司工作都是这么安排的:公司高层想到一个项目,于是经过立项,财务预算,及人员调配之后,自顶向下把项目分配到各个团队和业务单元。在GitHub可没这样,他们的人采用"开放式工作分配"的方式——人自行解决自己项目分配的问题,他们把自己分配到自己想做的项目上去,用不着任何正是的申请或者管理层干预。
您得吐槽了,GitHub才多少人啊?就175个员工,当然玩的转这种方式了。不过您瞧瞧Valve软,他们有400员工,而公司毛收入达100亿美元,Valve的组织形式跟GitHub非常接近。这总可以说明点什么事吧。
为什么要说公司的结构?
古时候刀耕火种的人们就在思考,用自己过剩的产能能做点啥第二第三产业?比如,打猎之余,种点庄稼,缝点衣服啥的拿到集上去卖。有人做过研究了,那些过剩的产能中,最有可能造成影响的,是人脑子里面那些过剩的创造力!
于是Google著名的20%的时间可以做点业余项目。有个叫克莱·舍基的人,写了一本书,书名叫《认知盈余-网络时代的创造与繁荣》,他有个观点,闲暇时间给人机会创造有价值的东西。
直观上,这简直是胡说,就把人放到那里,从头到尾做他自己想做的事情,然后他就自然而然创造价值了?您心里估计在犯嘀咕,要是把那谁谁谁放到这里,她估计得7*24小时逛淘宝。
不过,事实证明,这样的工作条件,对于那些有创造力的人确实有诱惑。比如说,有个叫Chrissie Brodigan的UX研究员,她有套测试方法叫Deprivation测试,以前是做火狐的用户体验评估的,就决定加入GitHub了。
GitHub的员工反馈,说他们被开放式工作分配这种方式吸引,主要还是因为它没有什么边界——这些人喜欢自由选择跟自己气场相投的人一起做一些很酷的东西。他们甚至可以一起设计自己的可编程办公室。
创新的四大难题
有人得说了,这玩意真费事,搞这么乱干嘛,我才懒得管那些呢,公司告诉我做啥,我给他保质保量做好不就行了?
我们得说,这个论点在有些行业当然是行得通的,比如前些年,在广东,浙江一带,有很多制衣厂,对于一个有资深制衣行业背景的人而言,如果你有明确的目标,比如目标人群,衣服的款型,销往哪个区域,这些能确定之后,他就能告诉你需要投多少钱,建多大规模的流水线,招什么样的技工,甚至每个环节的技工该做什么。
不幸的是,今天,公司如果需要存活相当长一段时间的话,就需要面对未知的创新:如何创新?如何让这样的创新可以反复发生?传统公司会建立一个独立的"创新部",这里的人负责创新,而其他的人更像在制衣厂工作。GitHub则不一样,他们把全公司都设立在一种以创新为核心的工作模式上的。这么做,是考虑到了让一批人能够持续不断成功创新的四大难题:
• 管理注意力:一般组织的设计,主要目的是基于已有的成功,一方面坐享其成,另一方面保护既有成功,而不会专注于开拓新点子。
• 步调一致:一般创新点往往来源于个人或者小团体,而执行往往要倾尽全公司之力去做。而由于种种原因(比如政治,社会因素),让剩下一大群人都买账很难。
• 让人共同工作:当新产品和服务开始结果了,人、想法、交易都会快速增长,于是要招更多的人。这样一方面人就更容易掺和进来做事,同时也更容易导致一些人只见树木不见森林,对愿景和当前的情况没有整体把握。
• 僵化的管理:有些创新着实是需要组织结构和管理方式能够从根本上改变的,而大多数公司的基础结构没这么灵活——这直接导致了组织结构难以跟创新保持同步。
GitHub的结构到底是怎么样的?
沟通!沟通!沟通正是开放式工作分配的核心要素。换句话说,GItHub公司的结构就像是一张分布式的信息传递网络,网络上传递的是公司的目标,以及公司如何工作,当然也包括它应该要做些什么。
创新公司的策略是不断调整的,而对于某一时期这些调整增量,让所有人的认知保持同步至关重要,否则有些微小的调整很难到达某些单元或者团队,当有些团队没有做出相应的调整,而最终累积到一定的时候,不同团队之间的就形成了鸿沟般的认知差距。你得说了,这没什么啊,我看到的公司都是这样的。举个例子,上个世纪80年代的时候,乔布斯带着一帮人,做成了比较成功的Macintosh,另一支团队则哼哧哼哧鼓捣出来Apple III,Apple III大家都懂的。
良好的沟通,也可以帮助团队发现一些新的,或者相关的商机。举个例子,在这张网络里面,如果有一个新项目很酷,在网络里面传导到公司的高层了,高管们就可以利用这些信息修正航向,而修正的结果同时又通过网络传到各个单元,让他们明白,"某某项目"现在开始帮助实现公司的商业了。
这怎么玩得起来?

  1. 让人自己选择自己感兴趣的事情
    GitHub首先得弄清楚,自己作为一家公司,到底什么是最重要的,并把这些体现在公司的策略上。然后每个团队都应该做类似的事情,“这是公司的策略,这是我们的产品,那对我们团队,什么最重要?”,销售,技术支持,运维等团队都做了这样的事情,他们把自己团队的目标和公司战略目标做了匹配。而前面说到的信息网络,让这种组织形式更加高效。
    团队找到了工作重点,个人也要找自己的兴趣点,探索自己的兴趣跟这些策略的契合点,并把自己分配到那些能贡献的重要的事情上面去。所以,对个人来说,只要是对公司重要的事情,自己又有强烈的兴趣,就可以决定去做了。如果运转得好,所有人都在重要的事情上工作,不需要有人一层一层分配。这就是所谓的开放式工作分配方式(Open Allocation Approach)。

举个GitHub的例子,有段时间3D打印机很火,有个叫Mike Skalnik的在公司买了台3D打印机之后就开始感兴趣了,他慢慢的从原来的项目里面抽出经历来鼓捣3D打印机。一开始的时候,天知道3D打印机跟一个开源项目代码协作平台有什么关系?而Mike渐渐鼓捣明白3D打印机了,后来他发现,可以用协作的方式跟其他人共同维护3D打印的模型文件,而这正好又跟GitHub的方向完全吻合的。
Mike后来就抽出越来越多的时间去尝试3D打印,到后来他成了3D打印项目的带头人。
2. 让更接近问题的人有决策权
GitHub尝试把决策权移交给更加接近真实问题的人,在GitHub的项目中,每个项目都有一个主要负责人。
你得说了,当然,我们团队每个团队也有个产品负责人啊。问题是,如何产生这样的人和这样的团队呢?一般公司,都有一个中高层经理,他把自己手底下的人分成小的团队,让他们每个团队负责一个区域,而每个区域,又有一个直线经理负责人员的调配,于是这个直线经理指派了一个人,说:“你,就你了,作为产品负责人负责这个产品”。于是产品负责人像一个牵线玩偶一样负责这一摊产品。这里有个巨大的问题,在于位于顶端的话事人,他得要预测一个比较成功的愿景,来告诉大家产品或者公司的方向。
在开放式工作调配的方式中,前面这个过程基本上可以说是反过来的。GitHub认为,最接近待解决的问题的人应该是对问题最了解的人,他们很大可能性是最知道如何解决这类问题的。GitHub让这类人有这样的决策权。
3. 招那些喜欢这种方式的人
我知道,还是有质疑的说,这不就是一片混乱吗?如何避免有人每天只逛淘宝?我们再回到前面说的,如果要有人花时间和精力去监控这些事情,或者搞办公室政治,那就说明要么是组织,要么是个人出问题了。
很重要的一点是选合适的人,把他们引入团队。何谓合适的人?这些人应该本性就是积极主动,对技术和自己的事业一腔热情的人。这些成年人做的事情最终必将给给公司带来收益。当然肯定是有前提的,一般没有人说,“好,我有热情,今天我花一天时间给同事们烤面包吃。”(逢年过节可能有例外),每个人都深信,自己做的事情一定会在某种程度上给推进公司往前走。
题外话
世界真的是平的吗?
有一段时间业界都在纠结,要把自己的组织打造成一个平的组织结构,其实大可不必纠结于多平才算是平,而是要把组织里面的各个点连成网,让信息能够自由流动。
开源精神
开源精神是说,一个人发现别人做的有个东西很酷,然后就给他们发了个消息,告诉他们,自己对这事有兴趣,希望能够贡献自己的力量,接下来项目的热就告诉这位热心的观众什么东西比较重要,后者再决定自己如何贡献。GitHub的工作模式也是这样的,也就是前面说的开放式工作分配。
关于透明
有人做组织转型的时候很纠结透明这件事情,而GitHub在倡导透明的同时,也留给团队和个人一些个人空间,如果团队希望暂时保留目前正在做的事情,到适当时机再公开,这样的决定也会被尊重的。
GitHub这种方式有局限性吗?
有!

  1. 公司还是要付钱做一些重要,但是无趣的事情,比如升职奖金之类的。2
  2. 高管很难招聘。一般公司招一个CEO,会相应的给CEO很大的授权,但是在一个网状组织里面,CEO很难直接下命令让其他人只是执行命令。CEO应该是对行业有深远的思考,至少在公司里面,他得证明自己是一个思想家。
  3. 要炒人很难。一般要被炒的肯定是那种很恶劣的打酱油的,而在这样的开放式工作分配模式里面,要证明一个人是在打酱油也要花很多时间。不过相比传统的分配工作模式,还是有优势的,传统工作模式会产生更多打酱油的人。
    开放任务分配能在你的公司和组织里面运转吗?
    不妨试试看。
    来源:http://innolauncher.com/github/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值