GitHub

GitHub是通过Git进行版本控制的软件源代码托管服务平台。目前世界上最大的代码存放网站和开源社区。GitHub采用Ruby on Rails和Erlang作为后端。2018年6月4日,美国科技公司微软宣布以75亿美元的股票收购GitHub。

简介

时间轴

  • 2007年10月1日,GitHub平台开始开发。
  • 2008年2月,GitHub公司成立,GitHub平台开始上线。
  • 2013年4月,GitHub用户数达到350万,代码库数量达到6百万个。
  • 2018年6月4日,美国科技公司微软宣布以75亿美元的股票收购GitHub。
  • 2019年1月7日,GitHub宣布免费用户也可以创建私有仓库,私有仓库数量不限但每个仓库最多指定三个合作者。
  • 2019年5月,GitHub更新了用户协议,表明GitHub的产品和服务适用于美国出口管制法律。
  • 2019年7月起,GitHub基于美国出口管理条例,开始对伊朗、叙利亚和克里米亚的私人repo和付费账户实施限制。
  • 2020年4月14日,GitHub宣布进一步开放核心功能,取消私有仓库合作者数量限制,并降低了收费账号费用。
  • 2021年8月13日,GitHub开始停止git操作时的用户名+密码验证方式,需要使用用户名+token或ssh方式。

用户

许多程序库、开发框架都采用GitHub作为为主版本控制平台,其中包括:

star大于10万星的项目:https://github.com/search?o=desc&q=stars%3A%3E100000&s=stars&type=Repositorie

功能

Github的主要功能:

  • 软件开发版本控制,代码托管。
  • 文档:包括自动生成的、采用类Markdown语言的Readme文件。
  • 问题追踪系统(同时可用于功能需求)
  • Wiki
  • GitHub Pages支持用户通过软件仓库创建静态网站或静态博客。
  • 任务列表
  • 甘特图
  • 可视化的地理位置分析。
  • 预览3D渲染文件。预览功能通过WebGL和Three.js实现。
  • 预览Adobe Photoshop的PSD文件,甚至可以比较同一文件的不同版本。


使用GitHub.com

在GitHub.com网站上,可以创建仓库,复刻仓库,查找开源项目等。访问GitHub官网免费注册一个账号,就可以使用。

创建仓库

要将项目放在 GitHub 上,您需要创建一个仓库来存放它。

  • 点击网页右上角+下拉菜单,选择 New repository(新建仓库)。
  • 在仓库名称(Repository name)下输入一个仓库名称。
  • (可选)在仓库说明(Description )添加仓库的说明。
  • 选择仓库的可见性:
    • 公共(public),共仓库将对互联网上的所有人开放。
    • 内部(internal),内部仓库可供企业帐户的成员访问。
    • 私有(private),私有仓库仅供您、您明确与之共享访问权限的人访问。

了解更多 >> GitHub.com 入门指南: 快速入门 - 创建仓库


复刻仓库

复刻(fork)仓库就是创建仓库的副本。 通过复刻仓库,您可以自由地尝试更改而不会影响原始项目。

资源搜索

了解更多 >> GitHub指南:hello world


使用GitHub客户端

GitHub客户端(GitHub desktop)是GitHub开发的一款开源软件。旨在方便初学者使用和提高团队生产效率,使用图形界面,减少git命令的使用,交互更轻松。


使用Git

安装git并配置

在ubuntu上安装git软件,然后配置git用户名和邮箱,设置为Github的用户名和邮箱。可以不配置,git会使用主机用户名和主机名自动生成,但提交到Github仓库时不会显示你为贡献者,还可能会显示其他人为贡献者:

#安装git
 sudo apt-get install git

#设置git信息,输入你Github的用户名和邮箱。
git config --global user.name yourname
git config --global user.email yourname@email.com
名称 描述
管理全局仓库信息 全局仓库信息是所有仓库的默认值,在未设置当个仓库信息时有效。
设置全局信息:git config --global 名称 值
删除全局仓库信息:git config --global --unset 名称

示例如:
# 设置git信息,如设置Github的用户名和邮箱
git config --global user.name yourname
git config --global user.email yourname@email.com

# 删除用户名
git config --global --unset  user.name
管理单个仓库信息 单个仓库设置的信息优先级高于覆盖全局的信息。设置存储在该目录的.git/config文件中。
设置单个仓库信息:进入git仓库目录,再git config 名称 值
删除单个仓库信息:进入git仓库目录,再git config --unset 名称

示例如:
# 设置某个仓库信息
cd /仓库/目录/地址
git config user.name yourname
git config user.email yourname@email.com
查看仓库信息 查看使用git config --list,在非git仓库目录只能查看全局设置信息,进入某个仓库目录会额外列出该目录设置信息。
git config --list

了解更多 >> GitHub 文档:开始使用 Git/设置用户名


https上传代码

首先在GitHub.com上创建一个仓库,然后复制好这个仓库的Https地址,如下面这个地址是用户名为yourname创建的Test仓库:

https://github.com/yourname/Test.git

接下来在本地操作:

# 进入要上传项目的文件夹,如mytest项目文件夹
cd mytest

# 通过git init命令把这个文件夹变成Git可管理的仓库
git init

# 可以通过git status查看状态
git status

# 使用git add <file>把需要包含的文件添加到本地仓库,如添加文件夹下全部文件:
git add .

# git commit提交到本地仓库版本库,可以使用-m参数版本的描述,如:
git commit -m "flask升级到2.2"

# 使用git remote add命令关联本地仓库和Github仓库,如:
git remote add origin https://github.com/yourname/Test.git

# 使用git push上传到Github仓库,由于新建的远程仓库是空的,所以要加上-u这个参数,如:
git push -u origin master

可能遇到的错误:[rejected] master -> master (non-fast-forward) 这是由于跟新前本地仓库和Github仓库就有不一样,需要先同步:

git pull origin master --allow-unrelated-histories

然后重复add和commit命令,再push上传到GitHub就行了。


同步下载

在github网页修改后,需要把修改同步到本地,可以使用git pull拉取线上内容。

# git pull origin master为默认分支,可以简写为git pull
git pull


可能遇到的错误:Your local changes to the following files would be overwritten by merge:Please commit your changes or stash them before you merge. 由于本地还有修改未提交,有两种解决方法:

1.需要保留本地修改的内容:

git stash  
git pull origin master  
git stash pop 

2.不需要保留,直接恢复到上一个commit id:

git reset --hard 
git pull origin master

配置SSH key

配置SSH key后可以上传代码,可以不用再输入账号密码。

# 本地生成公钥和私钥
# 会询问保存地址,按回车默认地址,即用户目录的.ssh目录
# 询问私钥密码,可以回车不加密,或输入密码
ssh-keygen -t ed25519 -C "github的邮箱@example.com"

# 公钥~/.ssh/id_ed25519.pub 内容复制到GitHub中
# 登录GitHub.com,点击右上照片》Settings(设置)》SSH 和 GPG 密钥》New SSH key
# 标题可以输入如"个人pc"。将公钥粘贴到 "Key"(密钥)字段。

ssh-agent -s
# 添加成功显示Identity added:...
# 未成功,执行命令ssh-agent bash,然后再试一次。
ssh-add ~/.ssh/id_ed25519
# 如果出现Permissions 0777 for '~/.ssh/id_ed25519' are too open.
chmod -R 400 ~/.ssh/id_ed25519

# 测试链接,如果公钥指纹一致,输入yes
# GitHub 的公钥指纹 https://docs.github.com/cn/github/authenticating-to-github/githubs-ssh-key-fingerprints
ssh -T git@github.com

了解更多 >> GitHub 文档: 使用 SSH 连接到 GitHub


ssh上传

首先在GitHub.com上创建一个仓库,

cd proj  # 进入项目目录
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:用户名/库名称.git
git push -u origin main

如果之前使用https方式上传,可以更改本地仓库远程地址,设置ssh方式:

git remote set-url origin git@github.com:用户名/库名称.git

忽略文件

  • 使用.gitignore设置单个项目的git忽略文件,直接在项目的根目录下创建一个.gitignore,git会根据你的设置自动忽略不想提交的文件。

如下.gitignore

# 井号开头表示注释行

# 忽略所有python编译文件夹
__pycache__/

# 忽略所有jupyter文件夹
.ipynb_checkpoints/

# 忽略所有以.db结尾文件
*.db


要忽略git仓库中已存在的文件,必须在先使用git rm删除该文件,再修改.gitignore添加忽略该文件。使用git add和commit命令,再push上传到GitHub就可以同步删除GitHub文件。

git rm --cached FILENAME
  • 使用全局.gitignore文件设置电脑上所有项目的git忽略文件
git config --global core.excludesfile ~/.gitignore_global

了解更多 >> GitHub帮助:忽略文件


进阶教程

从仓库中删除敏感数据

如果将敏感数据(例如密码或 SSH 密钥)提交到 Git 仓库,您可以将其从历史记录中删除。 要从仓库的历史记录中彻底删除不需要的文件,您可以使用 git filter-branch 命令或 BFG Repo-Cleaner 开源工具。

使用filter-branch

导航到仓库的工作目录

cd YOUR-REPOSITORY

运行以下命令,将 PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA 替换为您要删除的文件的路径,而不仅仅是其文件名。 这些参数将:

  • 强制 Git 处理但不检出每个分支和标记的完整历史记录
  • 删除指定的文件,以及因此生成的任何空提交
  • 覆盖现有的标记
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
  --prune-empty --tag-name-filter cat -- --all

注:如果含有敏感数据的文件曾经存在于任何其他路径中(因为它已被移动或重命名),则也必须在这些路径上运行此命令。

将含有敏感数据的文件添加到 .gitignore 防止下次意外提交它。

echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

仔细检查您是否已从仓库历史记录中删除所需的所有内容,并且所有分支均已检出。对仓库的状态感到满意后,强制推送本地更改以覆盖 GitHub 仓库,以及您已向上推送的所有分支:

git push origin --force --all

要从标记的发行版删除敏感文件,您还需要强制推送 Git 标记:

git push origin --force --tags

联系 GitHub 支持 或 GitHub 高级支持,请求他们删除 GitHub 上拉取请求中敏感数据的缓存视图和引用。

告知协作者变基而不是合并他们从旧的(污染的) 仓库历史记录创建的任何分支。 一次合并提交可能会重新引入您刚刚遇到清除问题的部分或全部污染的历史记录。


使用 BFG

BFG Repo-Cleaner 是一种由开源社区构建和维护的工具。 它提供一种更快、更简单的 git filter-branch 替代方法,用于删除不需要的数据。


有一些简单的技巧可避免提交您不想要提交的内容:

  • 使用如 GitHub Desktop 或 gitk 之类的可视程序提交更改。 可视程序通常可以更容易地查看每次提交时将添加、删除和修改具体哪些文件。
  • 避免在命令行中使用全部捕获命令 git add . 和 git commit -a — 使用 git add filename 和 git rm filename 逐个暂存文件。
  • 使用 git add --interactive 逐个查看和暂存每个文件中的更改。
  • 使用 git diff --cached 查看您为提交暂存的更改。 只要不使用 -a 标志,这就是 git commit 将产生的确切差异。

了解更多 >> GitHub帮助:从仓库中删除敏感数据


资源

官网

相关网站

书籍

《Pro Git》第二版(2014),作者为Github的联合创始人Scott,提供多语言在线阅读。