Extra04 - Git - 程序码版本控制

此篇为番外,未收入在本篇的原因是 Git 是个复杂但很基础的工具,因此大部分的人都已经有个初步的认识,但是以本篇的篇幅又不足以说明整个 Git 的操作,因此放入番外作为补充。

如果没有版本控制工具的帮助,在协作开发时会无法管理来自不同开发者的变动,不同开发者间的程序码可能互相覆盖,造成系统异常。在发布时,也会因为没有版本的依据而难以确保版本更新的项目,造成麻烦。

版本控制的工具 - Git

Git 是个分散式的程序码版本控制工具,存放程序码的地方称为 Repository , Repository 分为 Server 与 Client 两种, Server 是服务器上存放的程序码库,而 Client 则是各个使用者自己机器上的程序码库。使用者可以任意修改 Client 的程序码,并不需要理会服务器或是其他使用者,当想要上传至服务器的程序码库时,需要做一个合并的动作,确保程序码可以安全地更新至服务器中,如果有同时修改的部分, Git 会提示冲突,使用者需要解决冲突後才能上传。

Git 在不同的使用者的机器上可以是不同的程序码内容,所以使用者可以自由地变更,当要上传至服务器时, Git 会检视是否有冲突的问题,在修复後才能上传,来确保专案的正确性。另外 Git 的 tag 功能,让我们可以清楚地知道发布版本中的程序码状态,藉以管理各个版本的程序码。

安装 Git

使用 Homebrew 安装 Git :

brew install git

使用 Git

初始 Git Repository

要使用 Git 前,需要将特定的目录定为 Repository ,选好目录後,使用 git init 指令:

mkdir git-test
cd git-test
git init

Initialized empty Git repository in /git-test/.git/

检视 Repository 状态

使用 git status 可以观看目前程序码库的状态:

% git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

可以看到当前是在分支 master ,并且是还没 commit 的状态。

修改 Repository 的内容

现在在 git-test 目录中新增 README.md 档案:

% echo "# Hello Git" > README.md
% git status
# ...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        README.md
# ...

使用 git status 会发现 README.md 被归为未追踪的档案。

将档案加入暂存区

Git 的暂存区会存放待提交的档案,因此如果要将档案加入这次的提交前,需要先加入暂存区:

% git add README.md
% git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md

使用 git add README.mdREADME.md 加入暂存区中。

如果要将档案从暂存区移出的话,则需要下 git rm 的指令。

Commit (提交节点)

在档案被加入暂存区後,我们可以提交此次的修改至 Git 上:

% git commit -m 'add readme'
[master (root-commit) 31a3d69] add readme
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
% git log
commit 31a3d69544f7247b8c8fd5ba59b54dbe8a8d6209 (HEAD -> master)
Author: peterhpchen <[email protected]>
Date:   Tue Sep 7 21:39:38 2021 +0800

使用 git commit 提交修改,并使用 -m 加入提交讯息。

在提交完成後,使用 git log 观察节点。

Branch (分支)

在 Git 内,在同一个 Repository 下,可以创建复数个分支,每个分支都可以想成是个不同内容的代码库,要创建一个新的分支,需要由原有的分支复制出来。

现在我们使用 git branch dev 创建名为 dev 的分支:

% git branch dev
% git branch
  dev
* master

建立完分支 dev 後,可以使用 git branch 观看分支列表,可以看到除了原本的 master 外,已经多了一个 dev 的分支。

切换分支

建立分支後,可以使用 git checkout 切换分支:

% git checkout dev
Switched to branch 'dev'
% git status
On branch dev
nothing to commit, working tree clean

使用 git status 确认目前所在的分支。

远端 Repository

设定 ssh

在与远端 Repository 联系前,我们需要有个认证机制确保身份与权限,为此要建立 ssh :

% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/PeterChen/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/PeterChen/.ssh/id_rsa.
Your public key has been saved in /Users/PeterChen/.ssh/id_rsa.pub.
The key fingerprint is:

% cat /Users/PeterChen/.ssh/id_rsa.pub
ssh-rsa ... PeterChen@GM-MacBook-Pro

使用 ssh-keygen 建立一组 ssh 公私钥,名为 id_rsa ,後面有 .pub 结尾的为公钥,将其复制至远端的 ssh server 。

将远端 Repository 加入 Git

使用 git remote 加入远端 Repository :

% git remote add origin [email protected]:peterhpchen/git-test.git
% git remote -v
origin  [email protected]:peterhpchen/git-test.git (fetch)
origin  [email protected]:peterhpchen/git-test.git (push)

使用 git remote add 加入新的远端路径,第一个参数是这个远端路径的名称,第二个是远端路径。完成後可以使用 git remote -v 列出目前的远端路径。

将变更推至远端

要将变更推至远端,可以使用 git push

% git push origin dev
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 225 bytes | 225.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:peterhpchen/git-test.git
 * [new branch]      dev -> dev

git push 的第一个参数是远端路径名称,第二个是要推送的分支。

使用 git pull 可以拉取远端的程序码。

本文重点整理

  • 在现代的软件开发中, Git 已经是版本控制工具的首选,藉由 GitHub 之类的服务,我们不必自己架设 Git Server 就可以使用 Git 来管控程序码。
  • 许多的工具也都配合 Git 开发出一套部署发布的流程,为之後上线时的管控更为顺畅。

参考资料


<<:  乔叔带你上手 Elastic Stack - 探索与实践 Observability 系列 - 文章总览与心得

>>:  【Day 09】配接器 设计模式(Python)

[Day 15] Leetcode 138. Copy List with Random Pointer (C++)

前言 今天选择的是top 100 liked,并与linked list相关的题目:138. Cop...

DAY7:Kaggle-San Francisco Crime Classification(下)

资料视觉化 这边我们会用到seaborn来做一下简单的资料视觉化。 import seaborn ...

[Android Studio 30天自我挑战] CradView布局练习

这篇要透过CardView来制作一个简易的清单 首先要在Gradle Scripts/build g...

初探 AJAX 与 Fetch API

前言 根据维基百科,20世纪的90年代,服务器处理每一个浏览器请求都要重新载入页面,换句话说,每当网...

Day 32:来呼叫星战 Profile List 下一页吧(1/2)

在 Day 31 分享 RecyclerView 如何载入更多之後,先来帮大家回顾之前星战的 Pro...