这是一篇关于我个人学习 GitHub 的笔记,主要是记录一些我认为比较重要的知识点,以及一些我认为比较好的学习资料。

学习书籍:GitHub 入门与实践(图灵程序设计丛书)

这本书的目录是这样的

第 1 章到第 3 章的内容主要提了 Github 和 git、git 的配置、创建仓库等等。因为我本人平时有用过 Git 工具,以及 GitHub,我就简略看了,这里不赘述了。

4. 通过实际操作来学习 Git

4.1 基本命令

  • git init

    初始化仓库
>> mkdir Demo
>> cd Demo
>> git init
  • git status 显示 Git 仓库的状态

这是一个十分常用的

命令

  • git add——向暂存区中添加文件
>> git add README.md
>> git status # 查看一下状态
  • git commit——保存仓库的历史记录
>> git commit -m "first commit"
  • git log——查看提交日志

git log 命令可以查看以往仓库中提交的日志。包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别

>> git log
>> git log --pretty=short #只显示提交信息的第一行
>> git log README.md #只显示指定目录、文件的日志
>> git log -p #显示文件的变动
>> git log -p README.md
  • git diff——查看更改前后的差别

git diff 命令可以查看工作树、暂存区、最新提交之间的差别。

>> git diff HEAD  查看工作树和最新提交的差别

4.2 分支操作

在进行多个并行作业时,我们会用到分支。在这类并行开发的过程

中,往往同时存在多个最新代码状态。如图 4.1 所示,从 master 分支创

建 feature-A 分支和 fix-B 分支后,每个分支中都拥有自己的最新代码。

master 分支是 Git 默认创建的分支,因此基本上所有开发都是以这个分

支为中心进行的。

  • git branch——显示分支一览表

git branch 命令可以将分支名列表显示,同时可以确认当前所在

分支。

 >> git branch
* master # 表示当前分支
  • git checkout -b——创建、切换分支
>> git checkout -b feature-A

上面命令等效于

>> git branch feature-A  ## 创建分支
>> git checkout feature-A ## 切换分支
>> git branch ## 查看分支
* feature-A
master

来实际操作一下

1.在.gitnore文件中添加一行Hello
2.git add .gitnore
3.git commit -m "add .gitnore"
4.git checkout master 查看发现master分支没有收到影响
  • git merge——合并分支

接下来,我们假设 feature-A 已经实现完毕,想要将它合并到主干分

支 master 中。首先切换到 master 分支。

然后合并 feature-A 分支。为了在历史记录中明确记录下本次分支合

并,我们需要创建合并提交。因此,在合并时加上 --no-ff参数。

>> git merge --no-ff feature-A

随后编辑器会启动,用于录入合并提交的信息。

默认信息中已经包含了是从 feature-A 分支合并过来的相关内容,所

以可不必做任何更改。将编辑器中显示的内容保存,关闭编辑器,然后就会看到下面的结果。

Merge made by the 'recursive' strategy.
README.md | 2 ++
1 file changed, 2 insertions(+)

这样一来,feature-A 分支的内容就合并到 master 分支中了。

  • git log --graph——以图表形式查看分支
>> git log --graph
* commit 7ce2a1df16d795a87760e2748d0d7dae206adab0 (HEAD -> master)
|\ Merge: 446d54b 88bc87e
| | Author: 陆广兴 <1175278814@qq.com>
| | Date: Wed May 31 14:27:39 2023 +0800
| |
| | Merge branch 'feature-A'
| |
| * commit 88bc87efaf578047fa182dfcb408e2e7252af912 (feature-A)
|/ Author: 陆广兴 <1175278814@qq.com>
| Date: Wed May 31 14:09:03 2023 +0800
|
| Add to Feature-A
|
* commit 446d54bca9d80b48d3bf3eaadb244388c6edb3c3
| Author: 陆广兴 <1175278814@qq.com>
| Date: Wed May 31 13:21:06 2023 +0800
|
| 2
|
* commit 9946a43ae4a21af20ddfe50705bf91d6222b22f9
| Author: 陆广兴 <1175278814@qq.com>
| Date: Wed May 31 13:16:48 2023 +0800
|
| 1
|
* commit aa17b8adc6266b3f97440bb19d012fb064dbfacb
Author: 陆广兴 <1175278814@qq.com>
Date: Wed May 31 13:12:00 2023 +0800 初始化仓库

4.3 更改提交的操作

  • git reset——回溯历史版本

我们先回溯到上一节 feature-A 分支创建之前,创建一个名为

fix-B 的特性分支。

要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态,需要用

到 git rest --hard命令。只要提供目标时间点的哈希值 A,就可以完全恢复至该时间点的状态。事不宜迟,让我们执行下面的命令。

>> git log ## 查看feature-A之前的Hash
输出结果略 >> git reset --hard 446d54bca9d80b48d3bf3eaadb244388c6edb3c3
HEAD is now at 446d54b 2

创建 fix-B 分支

>> git checkout -b fix-B
Switched to a new branch 'fix-B'

在.gitignore文件中做点修改 最后一行添加”Hello,fix-b"

然后提交

>> git add ./.gitignore
>> git commit -m "Edit by fix-B"
[fix-B 3d07191] Edit by fix-B
1 file changed, 3 insertions(+)

现在的状态如图 4.5 所示。接下来我们的目标是图 4.6 中所示的状

态,即主干分支合并 feature-A 分支的修改后,又合并了 fix-B 的修改。

推进至 feature-A 分支合并后的状态

首先恢复到 feature-A 分支合并后的状态。不妨称这一操作为“推进

历史”。

git log命令只能查看以当前状态为终点的历史日志。所以这里

要使用 git reflog命令,查看当前仓库的操作日志。在日志中找出

回溯历史之前的哈希值,通过 git reset --hard命令恢复到回溯历

史前的状态

首先执行 git reflog 命令,查看当前仓库执行过的操作的日志。

>> git reflog
3d07191 (HEAD -> fix-B) HEAD@{0}: commit: Edit by fix-B
446d54b (master) HEAD@{1}: checkout: moving from master to fix-B
446d54b (master) HEAD@{2}: reset: moving to 446d54bca9d80b48d3bf3eaadb244388c6edb3c3
7ce2a1d HEAD@{3}: merge feature-A: Merge made by the 'ort' strategy.
446d54b (master) HEAD@{4}: checkout: moving from feature-a to master
88bc87e (feature-A) HEAD@{5}: checkout: moving from master to feature-a
446d54b (master) HEAD@{6}: checkout: moving from feature-A to master
88bc87e (feature-A) HEAD@{7}: commit: Add to Feature-A
446d54b (master) HEAD@{8}: checkout: moving from master to feature-A
446d54b (master) HEAD@{9}: commit: 2
9946a43 HEAD@{10}: commit: 1
aa17b8a HEAD@{11}: commit (initial): 初始化仓库 >> git checkout master ##先切换回到master分支
>> git reset --hard 7ce2a1d ##回到合并feature-A的节点
HEAD is now at 7ce2a1d Merge branch 'feature-A'
>> git log --graph ##此时应该可以看到.gitignone文件又回到了合并feature-A状态的样子,即最后一行有“### Edit on Feature-A”
>> git merge --no-ff fix-B  ##合并fix-B
Auto-merging .gitignore
CONFLICT (content): Merge conflict in .gitignore
Automatic merge failed; fix conflicts and then commit the result.

从上面合并输出产生的信息可以看出,合并过程中产生冲突了

下面进行冲突消除

打开.gitignore文件可以发现,文件中变成了这样

<<<<<<< HEAD
- feature-A
=======
- fix-B
>>>>>>> fix-B

提交解决后的结果

>> git add ./.gitignore
>> git commit -m "Fix conflict"
[master f9951e5] Fix conflict
>> git log --graph ##以图形的方式查看分支历史
  • git commit --amend——修改提交信息

我们将上一条提交信息记为了 "Fix conflict",但它其实是 fix-B 分

支的合并,解决合并时发生的冲突只是过程之一,这样标记实在不妥。

于是,我们要修改这条提交信息。

>> git commit --amend -m "Merge branch 'fix-B'"
>> git log --graph ##
|\ Merge: 7ce2a1d 3d07191
| | Author: 陆广兴 <1175278814@qq.com>
| | Date: Wed May 31 15:19:49 2023 +0800
| |
| | Merge branch 'fix-B'
| |
| * commit 3d07191a73a4e66fe16cbba1e51709ba216ce6f4 (fix-B)
| | Author: 陆广兴 <1175278814@qq.com>

经过修改过后可以看到提交的信息变成了 Merge branch 'fix-B'

  • git rebase -i——压缩历史

在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,

不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一

个历史记录。这是个会经常用到的技巧,让我们来实际操作体会一下。

#创建 feature-C 分支
>> git checkout -b fix-C

作为 feature-C 的功能实现,我们在 README.md 文件中添加一行

文字,并且故意留下拼写错误,以便之后修正。

提交这部分内容。这个小小的变更就没必要先执行 git add命令

再执行 git commit命令了,我们用 git commit -am命令来一次

完成这两步操作。

>> git commit -am "Add fix-C"
[fix-C 801f93a] Add fix-C
1 file changed, 1 insertion(+), 1 deletion(-)

修正拼写错误

>> git commit -am "更正拼写"
| Author: 陆广兴 <1175278814@qq.com>
| Date: Wed May 31 15:48:44 2023 +0800
|
| 更正拼写
|
* commit 801f93a50af77c07d51bc5fd46783ee7ff617306
| Author: 陆广兴 <1175278814@qq.com>
| Date: Wed May 31 15:44:36 2023 +0800
|
| Add fix-C
|
>> git rebase -i HEAD~2
#用上述方式执行 git rebase命令,可以选定当前分支中包含
#HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中
#打开。

按照下图所示,将 6fba227 左侧的 pick 部分删除,改写为 fixup。

pick 7a34294 Add feature-C
fixup 6fba227 Fix typo

合并分支到master

>> git checkout master
>> git merge --no-ff fix-C
>> git log --graph

4.4 推送到远程仓库

  • 在GitHub上新建一个仓库,不需要勾选初始化仓库,避免生成README.md文件
  • git remote add——添加远程仓库
>> git remote add origin git@github........
  • git push——推送至远程仓库
>> git push -u origin master
##注意,这只会推送master分支,如果要推送其他分支,可以这样
>> git push -u origin branch-name

像这样执行 git push命令,当前分支的内容就会被推送给远程仓库

origin 的 master 分支。-u参数可以在推送的同时,将 origin 仓库的 master 分

支设置为本地仓库当前分支的 upstream(上游)。添加了这个参数,将来

运行 git pull命令从远程仓库获取内容时,本地仓库的这个分支就可

以直接从 origin 的 master 分支获取内容,省去了另外添加参数的麻烦。

4.5 从远程仓库获取

  • git clone——获取远程仓库

  • git branch -a

  • 获取远程的 feature-D 分支

>> git checkout -b feature-D origin/feature-D
Branch feature-D set up to track remote branch feature-D from origin.
Switched to a new branch 'feature-D'

图灵丛书——GitHub入门的更多相关文章

  1. github入门到上传本地项目【网上资源整合】

    [在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...

  2. github入门到上传本地项目

    GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好. GitHub可以免费使用,并且快速稳定.即使是付费帐户,每个月不超过10美刀的费用也非常便宜. ...

  3. 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)

    <Github入门与实践>作者: [日] 大塚弘记 译者:支鹏浩/刘斌   简介 本书从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作 ...

  4. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

  5. Github入门详情教程

    前言 之前我写了一篇文章<一篇文章了解Github和Git教程>还延伸了几篇阅读,对大部分小白很有用,那么我继续普及下Github页面及其概念. 定义 GitHub 是一个网站,一个面向开 ...

  6. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  7. 【github&&git】2、github入门到上传本地项目

    [在原文章的基础上,修改了描述的不够详细的地方,对内容进行了扩充,整合了网上的一些资料] [内容主要来自http://www.cnblogs.com/specter45/p/github.html#g ...

  8. <转>github入门到上传本地项目

    转自 http://www.cnblogs.com/specter45/p/github.html GitHub是基于git实现的代码托管.git是目前最好用的版本控制系统了,非常受欢迎,比之svn更 ...

  9. github 入门教程之 github 访问速度太慢怎么办

    github 是全世界最流行的开源项目托管平台,其代表的开源文化从根本上改变了软件开发的方式. 基本上所有的需求都能从 github 上或多或少找到现成的实现方案,再也不用重头开始造轮子而是自定义轮子 ...

  10. GitHub 入门 与 2023年2月18日10:29:02

    用 GitHub 有一段时间了,之前一直用来做 Hexo 的服务器,直到前阵子搞 GitHub Action 因为命令不熟,把 GitHub 上的源码强制拉到本地把本地的 Hexo 搞崩了,博客源码都 ...

随机推荐

  1. 浅谈Vue 2.x当中组件之间传值方式

    一.父子之间传值 1. 父传子 :props <!DOCTYPE html> <html lang="en"> <head> <meta ...

  2. MySQL相关知识点思维导图整理

    MySQL相关知识点思维导图整理 Xmind思维导图下载地址: 蓝奏云:https://shuihan.lanzoui.com/iXZw7frkn5a

  3. 【装饰器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    简介 装饰器模式(Decorator Pattern)是一种结构型设计模式.将对象放入到一个特殊封装的对象中,为这个对象绑定新的行为,具备新的能力,同时又不改变其原有结构. 如果你希望在无需修改代码的 ...

  4. python实现桌面截图功能

    PIL中的ImageGrab模块 import time import numpy as np from PIL import ImageGrab img = ImageGrab.grab(bbox= ...

  5. python之zipfile应用

    zipfile Python 中 zipfile 模块提供了对 zip 压缩文件的一系列操作. 1 f=zipfile.ZipFile("test.zip",mode=" ...

  6. [数据库]MYSQL之存储过程

    一 存储过程的特点 MySQL 5.0 版本开始支持存储过程 1.1 定义 存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象. 存储过程是为了 ...

  7. 四月二十日java基础知识

    1.不可被继承的成员与最终类:在默认情况下,所有的成员变量和成员方法都可以被覆盖,如果父类的成员不希望被子类的成员锁覆盖可以将它们声明为final.如果用final来修饰成员变量,则说明该成员变量是最 ...

  8. Java代理之jdk动态代理+应用场景实战

    本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明.之后将以两个最常见的应用场景为例,进行代码实操.这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用.比如在spri ...

  9. RFS[3]: No standby redo logfiles available for thread 1

    问题描述:备库恢复DG之后,mrp进程一直是wait_for_log,主库创建数据没有正常同步,只有在切换归档的时候备库才能同步主库数据 查看主库日志,主库RFS进程提示没有可用的standby re ...

  10. php正则表达式大全/php正则表达式使用方法整理集合

    匹配数字 "^\d+$" //非负整数(正整数 + 0) "[1][1-9][0-9]$" //正整数 "^((-\d+)|(0+))$" ...