这是一篇关于我个人学习 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. Linux理论知识

    Linux理论知识   理论知识 1.1文件名后缀 1 作用是说明和注释一个文件的性质. 2 与文件类型无关. 1.2常见的压缩文件后缀名 1.gz 2.bz2 3.xz 4.zip 5.tar 6. ...

  2. LeetCode刷题笔记 - 2022

    这篇博客集中整理在LeetCode的刷题记录,方便查阅 258. 各位相加 - 力扣(LeetCode) (leetcode-cn.com) 代码 class Solution { public: i ...

  3. go微服务框架kratos学习笔记二(kratos demo 结构)

    目录 api cmd configs dao di model server service 上篇文章go微服务框架kratos学习笔记一(kratos demo)跑了kratos demo 本章来看 ...

  4. 【算法总结】强化学习部分基础算法总结(Q-learning DQN PG AC DDPG TD3)

    总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图.贴了代码. 1. value-based 基于价值的算法 基于价值算法是通过对agent所属的environment的状态或者状态动作对进 ...

  5. 单元测试、文档测试、读写文件、StringIO和BytesIO

    1.单元测试就是为了测试程序执行的正确性 2.编写单元测试时,需要编写一个单元测试类,继承unittest TestCase类 3.单元测试最常用的断言是assert,断言期望抛出指定的异常 4.运行 ...

  6. 补五月五号java基础知识点

    1.容器类:容器类是java以类库的形式供有用户开发程序时可直接使用的各种数据结构.2.java容器框架中有两个名称分别为Collection和Set的接口,为防止名称的冲突,本书将Collectio ...

  7. Ubuntu2204部署容器引擎Containerd

    为什么使用containerd? 使用containerd的原因主要有两点吧,第一个是docker在k8s1.24以后不再支持,如果需要在k8s中继续使用docker作为容器引擎,我们需要额外部署cr ...

  8. DG:RFS[8]: No standby redo logfiles created for thread 2

    环境:两节点的RAC在线搭建DG,处理报错 现象:RFS[8]: No standby redo logfiles created for thread 2 ,thread2 没有建立redo Tue ...

  9. CommunityToolkit.Mvvm8.1 IOC依赖注入控制反转(5)

    本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址 ...

  10. 解决CKEditor中img标签自动添加style样式的问题-禁止自动设置width和height 帝国cms编辑器图片自动加宽高

    在使用CKEditor的过程中发现,每次上传或添加图片的时候,总会自动给img标签添加width和height的style内联样式.由于网站本身对图片有进行自适应处理(添加了自适应的CSS),所以im ...