图灵丛书——GitHub入门

发布时间 2023-05-31 19:02:27作者: 为搞钱而写代码

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

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

这本书的目录是这样的
img

第 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 默认创建的分支,因此基本上所有开发都是以这个分
支为中心进行的。

img

img

  • 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'