学习Git和Github,从这里开始!

一、简介

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、配置说明
路径文件 描述
/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/za/b/za/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命令。


五、参考文档
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容