注意事项与声明

平台: Windows 10

作者: JamesNULLiu

邮箱: jamesnulliu@outlook.com

博客: https://www.cnblogs.com/jamesnulliu

学习笔记 转载请注明出处 欢迎留言

0. 前言

本系列文章是 git & github 的入门教程.

本系列文章优势:

  1. 零基础
  2. 深入浅出
  3. 知识点涵盖面广

本系列其他文章的链接

尽管如此, 想要真正学会 git & github 建议不要看任何教程, 直接看 git 的 官方文档.


1. 在 GitHub 新建 Remote repository

在完成GitHub 和 Git 的初始化和设置后, 我们先在 github 新建一个 远程资源库 (remote repository). 下图的两种方法皆可.

在新建储存库页面, 我们分条解释所有内容:

  • 先给 remote repository 取个名字 (我们这里就叫 test), Despcription 是可选的.
  • Public 指公开 repository, 任何人都能在 github 中搜索到, 也能通过网址打开; Private 指不公开, 只有你指定的用户能看见你的 repository.
  • README file 是指在你的 repository 中添加一个 "README.md" 文档, 这是介绍和解释项目的文档, 使用 markdown 语法编写 (这篇文章也是用 md 语法编写的). 一个规范的项目必须要有 "README.md". 我们这里先不添加.
  • .gitignore 是指在你的 repository 中添加一个 ".gitignore" 文档, 该文档指定了哪些文件应该被 git 忽略. 我们这里先不添加.
  • License 是指你整个项目的许可证. 许可证限制了他人如何使用你的项目; 如果没有许可证, 法律上任何人是不可以使用你的项目的.

    这里我使用了 Apache License 2.0, 粗略地说是任何人可以永久使用 (或部分使用) 我的源码, 但在例如申请专利时需要保留我的版权声明; 任何人可以在他的项目中修改我的源码, 但需要明确标识; 也可以在修改处添加自己的版权声明.

这里插一句, 在 Copy&Paste 别人的项目时我们是需要阅读他们的 License 的.

点击 Create Repository, 储存库创建成功.

2. 建立 git repository

现在你建立了 remote repository, 在 github 上进入这个 repository 看到如下图的界面, 点击 code 再点击那两个小方块 (复制 https URL 的意思).

这里我们希望把远程资源库 clone 到 project 这个文件夹内部, 因此一开始的 working dictionary 应该为 project 这个文件夹,

因此在 project 文件夹内部空白处右键, 在菜单栏运行 git bash here.

橙色的路径表示这里是现在的 working dictionary,

如果从 github 上 clone 一个叫 "test" 的项目下来, 那么 ~/Destop/project/ 内就会出现一个叫 "test" 的文件夹, 里面是项目内容.

为做到这点, 我们输入以下指令 ("<repo>" 整个替换成我们前面复制的 https 地址).

$ git clone <repo>

clone 成功后 ~/Destop/project/ 内出现 test 文件夹, 点击进入, 里面有一个 "LICENSE" 文件, 这是我们在 github 上建立 remote repositroy 时选择的 Apache License 2.0; 可以选择用记事本打开, 并修改里面的内容和署名.

要注意的是, 这里我们连接 remote repository 的方式是用该项目的 https URL, 如果想用 ssh 协议连接, 请参考 G&GH03 使用 SSH 协议.

另外, 如果需要, 我们可以先设置一下 git 的 http/https 代理.

输入以下命令 (按需更改):

$ git config --global http.proxy 127.0.0.1:7890
$ git config --global https.proxy 127.0.0.1:7890

如果想取消代理, 则输入以下命令:

$ git config --global --unset http.proxy
$ git config --global --unset https.proxy

3. 项目同步实例

3.1. 储存区概念

先粗略看一看下 git repository 的示意图 (下图中 repository 是指 git repository, 而非 github 中的 remote repository).

对 git 来说, 分三个区域: working dictionary, staging area, git repository.

working dictionary (工作文件夹) 就是用户能够执行更改操作的本地项目文件夹,

staging area (缓存区)git repository (git储存库) 是我们用 git 所操作的部分. 后文将详细介绍操作方式.

另一个要注意的点是: 在 github 上创建的是 "remote repository (远程文储存库)", 这和 git 所控制的三个区域是不同的; 在git 中, 默认用 origin 指向 remote repository.

3.2. 在 Remote Repository 创建文件

如图操作创建新文件. 需要注意的是, 在 github 上是不能删除 remote repository 中的文件的, 我们只能在本地利用 git 删除已经存在于 remote repository 中的文件.

我们创建一个名为 "README.md" 的文件, 在里面随便写点内容.

向下滚动鼠标滚轮, 选择把本文件 commit 到 main branch. 然后点击 "Commit new file" 即可.

3.3. [pull] 同步 Remote 的更改至 git repository

打开 test 文件夹, 在空白处右键, 打开 git bash, 这时橙色字体显示的 working dictionary 路径应该是以 xxx/test 结尾的.

刚才我们更改了 github 上 remote repository 中的内容 (添加了一个文件), 而目前 working dictionary (本地 test 文件夹内部) 以及 git repository 是未同步的状态.

在终端输入以下指令:

$ git pull

终端返回一堆内容表示 pull 完成, 此时再看 working dictionary (本地 test 文件夹内部) 出现了 "README.md", 用记事本打开, 内容与我们在 github 上写的相同.

在 git 执行 pull 操作时, remote repository 中更改的内容会被 pull 至本地, 并且 同时修改 working dictionary 中的内容并将修改记录在 git repository.

3.4. 在 git repository 创建文件

在 test 文件夹内新建两个空文件夹命名为 "source" 和 "bin", 然后在终端输入以下指令 (注意, 你的 working dictionary 应该仍保持在 test 而非其他文件夹).

$ touch sync_1.txt
$ touch source/sync_2.txt
$ touch source/sync_2.txt
$ touch source/doNotSync_1.donot
$ touch bin/doNotSync_2.donot
$ touch bin/doNotSync_3.donot.plz

通过查看文件夹发现, 上面这些指令在对应位置创建了对应文件. 后缀名是无关紧要的, 关键是这些新的文件确实被加入到了我们的 working dictionary (本地 test 文件夹内部) 中.

3.5. [push] 同步 Local 的更改至 Remote Repository

如果我们想要把 local 的更改 push 至 remote repository, 需要执行三个步骤,

首先利用 git addworking dictionary 的更改添加到 staging area,

再利用 git commitstaging area 的更改提交到 git repository,

最后用 git pushgit repository 的更改推送到 remote repository.

但我先做另一件事.

在终端输入以下指令.

$ git status

输出了很多语句, 其中 Untracked files 指的是:

存在于 working dictiona, 但未被追踪 (没有被 add 至 staging area 且不存在于 git repository) 的文件或者文件夹.

对于 untracked 的文件夹, git 不会显示其内部的文件 (比如此时终端应该只会显示 bin/, 不会显示 bin 中的文件).

我们把 README.md 用记事本打开, 随意更改一些内容, 然后保存;

再回到终端输入 git status, 发现相较原先多了一个 Changes not stages for commit,

这是因为 README.md 原本存在于 git repository, 它的状态是 tracked, 而它现在被更改了内容.

我们先做第一件事:

利用 git addworking dictionary (本地 test 文件夹内部) 的更改添加到 staging area.

$ git add README.md
$ git add sync_1.txt
$ git add source/sync_2.txt
$ git add bin

添加完后, 再利用 git status 查看状态, 发现只有 "source/doNotSync_1.donot" 没有被添加到 staging area.

这里需要注意一个问题是:

当 add 整个文件夹(比如 bin), 文件夹里的所有文件都会被 add 到 staging area;

但如果 add 文件夹中的某个文件 (比如 source/sync_2.txt), 文件夹会转入 tracked 状态, 于是 git status 会检查该文件夹内部所有文件的状态 (所以显示 "source/doNotSync_1.donot" untracked) .

再做第二件事:

输入以下命令 ( <message> 替换为你对这次更新的简要说明, 例如: "first initialization"):

$ git commit -m "<message>"

这一步是把 staging area 的更改 commit 至 git repository.

最后做第三件事:

输入以下命令 (注意, 这里是 mian 因为我们目前在 mian 分支上工作):

$ git push origin main

来到 github, 打开自己的 remote repository, 看见除了 "source/doNotSync_1.donot", 其他文件都已同步完成.

如果你希望查看 commit 记录, 可以用以下命令实现 (-2 表示上两次 commit 记录):

$ git log -2

你也可以用 --since --until 查看一段时间的 commit 记录, 例如:

$ git log --since=2020-1-1 --until=2.days
$ git log --after=1.week
$ git log --before=1.day.100.minutes

如果出现 log 太多, 最后终端可能会返回一个 END 导致你无法输入任何命令, 这时候在键盘上敲一下 'q' 即可.


参考:

Pro Git, 2nd Edition(2014), Scott Chacon

git日志过多最后显示end无法输入命令


推荐阅读:

G&GH03 使用 SSH 协议

G&GH04 git储存库连接至远程储存库

G&GH02 储存库创建/同步的更多相关文章

  1. Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题

    // 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for ...

  2. django 模块创建 同步数据表 使用方法

    1 配置数据库   100行左右 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 'NAME': 'student ...

  3. 使用SSIS创建同步数据库数据任务

    国外相关的文章:http://blog.dxuf.com/sql-tutorial/use-ssis-to-create-the-synchronization-database-data-task. ...

  4. [转]使用SSIS创建同步数据库数据任务

    本文转自:http://www.cnblogs.com/heqichang/archive/2012/09/19/2693214.html SSIS(SQL Server Integration Se ...

  5. angular2使用ng g component navbar创建组件报错

    Error: ELOOP: too many symbolic links encountered, stat 'C:\Users\inn\angulardemo\node_modules\@angu ...

  6. G&GH01 注册/安装/设置

    注意事项与声明 平台: Windows 10 作者: JamesNULLiu 邮箱: jamesnulliu@outlook.com 博客: https://www.cnblogs.com/james ...

  7. GCD使用dispatch_semaphore_t创建多线程网络同步请求

    一.简介: dispatch_semaphore_t:表示信号,生成信号的方法是 dispatch_semaphore_t semaphore= dispatch_semaphore_create(0 ...

  8. 【Android Developers Training】 95. 创建一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. Java中创建只读容器,同步容器

    我们通过Collections.unmodifiableX来得到只读容器,因为容器被设为只读的,所以必须填入有意义的数据之后才进行设置 import java.util.ArrayList; impo ...

随机推荐

  1. CF1042E Vasya and Magic Matrix 题解

    题目链接 思路分析 看到题目中 \(n,m \leq 1000\) ,故直接考虑 \(O(n^2)\) 级别做法. 我们先把所有的点按照 \(val\) 值从小到大排序,这样的话二维问题变成序列问题. ...

  2. 基于Python+Sqlite3实现最简单的CRUD

    一.基本描述 使用Python,熟悉sqlite3的基本操作(查插删改),以及基本数据类型.事务(ACID).     准备工作:在sqlite3的官网上下载预编译的sqlite文件(windows) ...

  3. JDBC:Statement问题

    1.Statement问题  2.解决办法:通过PreparedStatement代替  实践: package com.dgd.test; import java.io.FileInputStrea ...

  4. 使用 spring-security-oauth2 体验 OAuth 2.0 的四种授权模式

    目录 背景 相关代码 授权码模式 第一步 访问GET /oauth/authorize 第二步 访问POST /oauth/authorize 第三步 访问POST /oauth/token 简化模式 ...

  5. Markdown扩展语法

    目录 Markdown 语法补充 一.快速生成 HTML 表格代码 在线表格编辑器--TablesGenerator 二. 插入视频.音频或GIF 1. 视频 2. 音频 方法一 方法二 方法三 3. ...

  6. Spring Bean 标签解析

    上一篇文章讲到了标签在 parseDefaultElement 方法中进行解析,本篇文章将讲解这部分内容 bean 标签解析 查看 processBeanDefinition 方法,针对各个操作作具体 ...

  7. Solution -「营业」「CF567D」One-Dimensional Battle Ships

    题目大意 - 翻译   Alice 和 Bob喜欢在 \(1\times n\) 的表格中玩战舰游戏.游戏开始时,Alice 有 \(k\) 艘战舰,每艘战舰长度为 \(a\),她需要把这些战舰不重叠 ...

  8. 如何在CentOS上找出逐渐耗尽磁盘空间的目录和文件

    起因 随着系统运行,CentOS空间不断减少,对此非常焦虑,到底磁盘空间被哪些新增文件占用了呢? 分析过程,主要使用du命令,逐层找出消耗空间的目录 1.在根目录下检索一下文件的占用情况,执行du命令 ...

  9. 2022-07-10 第五小组 pan小堂 css学习笔记

    css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...

  10. 原型设计工具Axure RP9下载、汉化操作说明(赠授权码)

    Axure是产品经理.交互设计常用的一款原型设计工具,能实现比较复杂的交互效果.其实在功能上是十分齐全的,并且其交互的样式也比较多样,主要是通过动态面板.函数.中继器等几个模块就几乎可以实现任何常见的 ...