学习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、配置说明
- 优先级:下面配置会覆盖上面配置。更多…、git config
路径文件 | 描述 |
---|---|
/etc/gitconfig |
包含系统上每一个用户及他们仓库的通用配置。 执行 git config 时带上 --system 选项,才能读写该文件,需要管理员或超级用户权限。
|
~/.gitconfig ~/.config/git/config |
只针对当前系统用户。 用 --global 选项来读写此文件,修改配置影响当前系统用户的所有仓库。
|
.git/config |
当前仓库的 Git 配置文件。 用 --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命令。
- VS Code 下载
- VS Code 中使用 git 的文档!
五、参考文档
- 学习Git和Github,从这里开始!
学习Git和Github,从这里开始相关推荐
- github 和git_学习编码时如何学习Git和GitHub
github 和git by Iago Rodrigues 通过Iago Rodrigues 学习编码时如何学习Git和GitHub (How you can learn Git and GitHub ...
- 学习git与github
好久就知道git/github了,只是不太理解和用不着,还有就是英文差.这也导致我很早就注册了github的账号,却没用过git. 最近却也无聊,在和丰哥聊时,他说要弄个博客,就顺便指导我弄了一下,在 ...
- Git和Github简单教程
网络上关于Git和GitHub的教程不少,但是这些教程有的命令太少不够用,有的命令太多,使得初期学习的时候需要额外花不少时间在一些当前用不到的命令上. 这篇文章主要的目标是用较少的时间学习Git和Gi ...
- Git和Github简单教程【转】
转自:https://www.cnblogs.com/schaepher/p/5561193.html#clone 原文链接:Git和Github简单教程 网络上关于Git和GitHub的教程不少,但 ...
- 对初学者友好的Git和Github使用指南之介绍和安装篇
本文首发在个人博客:ladyzero.cool,欢迎前往阅读,阅读体验更佳. 原文地址:对初学者友好的Git和Github使用指南之介绍和安装篇 前言 本文将初步介绍Github和Git是什么,以及介 ...
- 学习 Git 玩转 GitHub
原文地址:学习 Git 玩转 GitHub 博客地址:www.extlight.com 一.基本了解 1.1 什么是版本控制系统 版本控制系统是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修 ...
- Git和Github的学习
来源: 秦时明月NightTiger Git和Github的学习 作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不 ...
- Git学习总结(18)——让你成为Git和GitHub大神的20个技巧
Git不仅是编程世界最流行的分布式版本控制系统,而且你还可以用它查找,分享以及优化你的代码.接下来就来看看怎样让Git和GitHub更好地为你服务吧. 尽管现在网上有很多Git的初学者教程,而且Git ...
- Git和Github介绍,294页『Git与Github学习使用指南』分享
1 前言 相信大家写代码的时候,心里肯定想找一个别人写好的,可以直接上手的代码,再做相应的修改和改进.那哪里有这些代码呢? 答案自然是Github了,那GitHub又是啥? GitHub是世界上最大的 ...
最新文章
- ImportError: The plotly.plotly module is deprecated,please install the chart-studio
- 关于工作流引擎的设计讨论
- 过滤Java集合的最佳方法是什么?
- 链接时undefined reference to构造函数
- 未来,仅凭几个前端工程师,就能 hold 住一家企业吗?
- python冷知识_python冷知识
- 项目管理最佳实践方法_项目管理:控制项目进度最佳实践
- ubuntu安装好后常用软件安装和配置
- 没有qpress_MySQL 大数据备份方案之Percona XtraBackup
- mro列表_MRO模块操作指导书
- 中国水刀切割机(水刀切割机)行业市场供需与战略研究报告
- eclipse报错 : One or more constraints have not been satisfied.
- 《PHP基础教程》pdf
- 机房报表错误-没有分配到需要的内存
- 数据库系统概念第6版第三章答案
- 对比学习(Contrastive Learning) (1)
- 部署 - 前端部署https服务,并配置安全证书
- 童玲:蚂蚁金服区块链在真实业务场景的实践与突破
- Tomcat 与 JDK 版本对应
- fastadmin采集插件-免费fastadmin采集
热门文章
- 示例解析缓冲区溢出攻击的原理
- boost::thread编程实战(2)——获取线程id并转化为DWORD类型
- 夜间模式(黑夜模式)的简单实现
- Fresco前传(1):一句话搞定图片显示(同时还可以满足各种小需求哦)
- 那些鼓舞人心的大电影:
- 计算机图形学(1)-向量-坐标系
- 3.3 SRAM和DRAM
- 服务器上验证码无法显示的Bug
- 网络编程_UDP socket
- 网络游戏的服务器在哪个文件夹,手里有一份网络游戏的服务端(预言OL) 现在缺少GM命令,在服务端里也找不到command这个文件...