一、简介
Git 是一个免费开源分布式版本控制系统,由于其占用空间小、性能快,优于其他SCM工具(SVN、CVS等),主要用于代码版本管理。
GitHub 是基于 Git 的免费版本控制仓库(开源项目集中地),任何人都可以上传或下载平台上的开源项目,全球有6500万的开发者在使用。
二、Git
1、Git 整体结构
2、版本对象
Git 通过 commit 对象来保存每一次提交的版本内容,其中 tree对象指向所有代码文件的快照。多版本之间通过 parent 对象进行链接。
3、文件状态
Git 管理的文件,有4个状态:
- Untracked:没有加到 Git仓库 进行版本管理;
- Unmodified:提交Git仓库后没有被修改;
- Modified:提交Git仓库后被修改;
- Staged:本地暂存区,等待被提交到Git仓库。
4、安装
- MacOS 使用软件包管理器Homebrew 安装git。更多...
# 1、终端下,执行下面命令,安装 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 2、安装git
brew install git
# 3、安装完成,首先设置全局名称和邮箱(修改下面邮箱和用户名)
git config --global user.name ×××
git config --global user.email ×××@×××
- Linux/Unix :Debian/Ubuntu、Fedora 上用命令安装git。更多...
# Debian/Ubuntu
apt-get install git
# up to Fedora 21
yum install git
# Fedora 22 and later
dnf install git
# 安装完成,首先设置全局名称和邮箱(修改下面邮箱和用户名)
git config --global user.name ×××
git config --global user.email ×××@×××
- Windows :用 exe 安装包安装 git。下载
5、配置说明
- 优先级:下面配置会覆盖上面配置。更多...、git config
路径文件 | 描述 |
---|---|
/etc/gitconfig | 包含系统上每一个用户及他们仓库的通用配置。 <br />执行 git config 时带上 --system 选项,才能读写该文件,需要管理员或超级用户权限。 |
~/.gitconfig<br />~/.config/git/config | 只针对当前系统用户。 <br />用 --global 选项来读写此文件,修改配置影响当前系统用户的所有仓库。 |
.git/config | 当前仓库的 Git 配置文件。<br />用 --local 选项来读写此文件(在仓库目录中,无需此选项)。 |
- 查看配置的命令
# 查看所有git配置,可能会有重复,因为来自不同配置文件(/etc/gitconfig 和 ~/.gitconfig),后面显示的配置信息会覆盖前面
$ git config --list
# 查看所有git配置,以及对应的配置文件
$ git config --list --show-origin
# 查看单个配置信息
git config user.name
# 查询所有可用配置信息
git help config
6、.gitignore
有些文件不需要 git 进行版本管理,譬如编译生成的 cache 文件等,可以使用 .gitignore
对其进行忽略。
glob模式 | 简化版的正则匹配 |
---|---|
* | 匹配零个或多个任意字符; |
? | 只匹配一个任意字符; |
[abc] | 匹配任何一个列在方括号中的字符 ; |
[0-9] | 表示匹配所有 0 到 9 的数字; |
** | 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。 |
序号 | 描述 |
---|---|
1、 | 空行或者 # 开头的行 都会被忽略; |
2、 | 匹配模式可以以(/ )开头防止递归; |
3、 | 匹配模式可以以(/ )结尾指定目录; |
4、 | 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(! )取反; |
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
7、origin 与 master
远程仓库名字 origin 与分支名字 master 一样,在 Git 中并没有任何特别的含义
- master : 是运行
git init
时,默认的起始分支名字; - origin : 是运行
git clone
时,默认的远程仓库名字, 如果运行git clone -o booyah
,那么远程分支名字将会是booyah/master
。
8、HEAD
HEAD是一个符号引用,指向当前分支。
$ cat .git/HEAD
ref: refs/heads/master
HEAD~{n} :表示以 HEAD 为起点,向后回溯n个版本;
HEAD^n :表示上个版本的第几个提交的版本(当前版本可能由多个版本合并得到);
如下版本提交记录(提交顺序从上到下、从左到右),A的上个版本是 B 和 C。更多...
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
9、常用操作
怎么使用 Git 的命令进行文件版本管理?详情,看这里!
三、GitHub
1、下载代码方式
GitHub 有三种方式下载代码:
- HTTPS:使用登录 github 的用户名和密码,即可clone 项目。
- SSH:通过上传 SSH key 到 GitHub 后台,这样无需密码即可 clone 项目。
- GitHub CLI:平台提供管理仓库的终端工具,还可以使用 Github 提供的一些额外功能。
2、免密下载代码
配置ssh key,可以免密下载Github代码,既方便又安全,需要使用到 ssh-keygen 工具。
# 1、打开 Terminal(终端),查看已有密钥(.pub后缀的文件名)
$ ls -al ~/.ssh
# 2、如果没有就创建一个
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 3、复制下面输出到剪切板(下面两个适用mac系统)
$ cat ~/.ssh/id_rsa.pub
$ pbcopy < ~/.ssh/id_rsa.pub
$ cat ~/.ssh/id_rsa.pub | pbcopy
# 4、登录github官网,按照这个路径新建 SSH key
Settings --> SSH and GPG keys --> New SSH key
1、填写名字(随意填写,保证下次看到能明白是哪里的key);
2、粘贴剪切板内容到key的输入框中;
3、保存。
# 5、Terminal(终端)检查是否可以成功连接
$ ssh -T git@github.com
# 6、Github随便找个项目,测试下载,看看是否成功
$ git clone git@github.com:shipwright-io/build.git
3、桌面工具
如果觉得在终端输入命令太麻烦,可以使用 Github 提供的桌面应用工具 GitHub Desktop 。
4、Pull Requset
为开源项目贡献代码的流程:
# 1、登录Github,找到项目,单击 Fork 按钮来获得项目副本
# 2、下载项目副本到本地
git clonet git@github.com:***/test.git
# 3、新建分支
cd test
git checkout -b branch1
# 4、修改代码
# 5、提交代码到本地仓库
git commit -a -m '修改代码'
# 6、推送本地仓库到远程仓库(项目副本)
git push origin branch1
# 7、登录 Github,提示项目有新分支,并创建 pull request 发送给源项目
# 8、源项目作者可以看到这个 pull request,由他决定是关闭还是合并
5、Pull Requset(冲突)
如果源项目比副本多很多提交版本,在副本上提交的分支会无法提交 pull request,这样来解决:
# 1、下载源项目最新代码
git remote add upstream git@github.com:***/orgin.git
git fetch upstream
# 2、合并最新代码到自己分支
git merge upstream/master
# 3、有可能会产生冲突,修复冲突并使得功能完好
# 4、推送分支代码到远程仓库(项目副本)
git push origin branch1
# 5、登录Github,并发送 pull request 给源项目
6、Fork项目
fork项目是不会随着源项目自动更新的,需要手动更新
# 1、切换到fork项目的分支master
git checkout master
# 2、拉取源项目代码并合并到当前分支
git pull https://github.com/progit/progit2.git
# 3、推送更新后的代码到fork项目
$ git push origin master (3)
# 上面每次更新都需要输入源项目地址,太麻烦,如下方式简化
# 1、添加源项目地址到本地
git remote add progit https://github.com/progit/progit2.git
# 2、把master分支的拉取代码的地址设置为源项目地址
git branch --set-upstream-to=progit/master master
# 3、将默认推送仓库设置为 origin
git config --local remote.pushDefault origin
# 4、之后更新代码方式
git checkout master
git pull
git push
四、VS Code
推荐使用 VS Code 来编辑代码,支持所有编程语言,只需要安装插件即可,git也是内置的,只需要鼠标点击即可完成git操作,无需输入复杂的git命令。