今天给大家聊一聊git这个玩意
一、为什么会出现git?
Git由Linus Torvalds于2005年创造的,其设计目的是为了管理Linux内核开发。在那时,使用其他版本控制系统面临一些挑战,因此Linus决定开发一种更高效、更灵活的版本控制系统,这就是Git。
Git的主要目标是解决旧有版本控制系统(如CVS和Subversion)的一些缺点,比如中央服务器的单点故障、分支和合并操作效率低下等。Git引入了分布式版本控制的概念,每个开发者都拥有完整的代码仓库的副本,可以离线工作,不需要依赖中央服务器。
二、git是什么?
Git是一种版本控制系统,它用于跟踪和管理软件开发项目中的代码变化。它能够记录文件的修改历史,让开发团队可以协同工作,保持代码的完整性和可追溯性。Git可以在不同的开发者之间有效地协调工作,允许多人同时修改同一份代码,最后将这些修改合并到一起。
懂得人自然可以明白这是什么意思,但是没了解过的人,会觉得这种介绍有点抽象,所以我打算用一种类比的方式去介绍git
假设你正在写一本小说,并且希望有一种方法可以让你轻松地管理小说的各个版本、并与其他人共同创作。这时候git就可以起到作用了
想象一下,你存放小说的地方就是代码库,里面有很多不同的章节(代码文件),git就是你的助手,它可以清楚的记忆每次你修改的内容,并且可以随时回溯你的任意一次修改
每次你写新的内容或修改现有的内容时,它都会帮你记录下来。它不仅知道你添加了哪些内容,还知道你删除了什么,以及你对内容做了哪些修改。
当你觉得写得不满意,想要回到之前的某个版本时,它可以带你回到那个时间点,让你重新阅读和修改。如果你对修改后的版本感到满意,git会把它保存下来。
它还可以实现多个作家联合创作,每个人都会有自己的副本,在自己的电脑上创作,每个人完成自己那部分创作后,只需要将每个人的结果合并,就是一个完整的作品啦
看完,大家应该就对git有一个基础的认识了
接下来我们会进行实操,但是在进行实操之前先带大家熟悉分支这个概念
三、分支
我来用其他的类比说明git中分支的概念。
你可以把git中的分支想象成一棵树的不同枝干。每个枝干都是从一个根部开始,然后向不同的方向生长。每个枝干都有一个名字,比如master、develop、feature等等。每个枝干都可以独立存在,也可以和其他枝干进行比较和合并。
master枝干就是你最终要展示的树,它是最稳定和完整的枝干。你创建树木项目的时候,就自动创建了一个master枝干。你可以在master枝干上进行修剪和添加,也可以从master枝干上创建其他枝干。
develop枝干就是你正在培养的树,它是最新的苗木。你可以从master枝干上创建一个develop枝干,然后在develop枝干上进行修剪和添加。你可以在develop枝干上尝试不同的形状和风格,也可以从develop枝干上创建其他枝干。
feature枝干就是你为了实现某个功能或主题而创建的树,它是最具体和细致的枝干。你可以从develop枝干上创建一个feature枝干,然后在feature枝干上进行修剪和添加。你可以在feature枝干上专注于某个方面或细节,也可以把feature枝干合并到其他枝干上。
release枝干就是你为了发布某个阶段或里程碑而创建的树,它是最接近完成的枝干。你可以从develop或feature枝干上创建一个release枝干,然后在release枝干上进行修剪和添加。你可以在release枝干上进行最后的检查和修正,也可以把release枝干合并到master或其他枝干上。
切换分支就相当于切换到不同的树木枝干,查看或修改它们的状态。比如,如果你想从develop切换到master,就相当于把正在培养的苗木放下,去看看已经成长的树。
合并分支就相当于把不同的树木枝干的状态合并到一起,形成一个新的状态。比如,如果你想把develop合并到master,就相当于把苗木中的修改应用到已经成长的树中,并且记录下这次合并。
删除分支就相当于删除不再需要的树木枝干,释放空间和资源。比如,如果你想删除develop,就相当于把苗木扔掉,只保留已经成长的树。
相信大家对分支已经有个基本概念了, 接下来我们进入实操
四、git实操
要使用git,首先你需要在你的电脑上安装git。你可以去官网下载符合你的电脑版本的git Git - Downloads (git-scm.com) ,然后按照提示安装。
安装完成后,你可以打开命令行工具(Windows下是cmd或PowerShell,Mac下是Terminal),输入git --version
来检查是否安装成功。如果看到类似这样的输出,说明安装成功了:
css
$ git --version
git version 2.34.1
接下来,你需要配置一下你的用户名和邮箱,这样git才能知道每次提交是由谁做的。你可以用git config
命令来设置,比如:
arduino
$ git config --global user.name "your name"
$ git config --global user.email "your email"
这里的--global
选项表示这是全局的配置,适用于所有的仓库。如果你想针对某个仓库设置不同的用户名和邮箱,可以去掉这个选项。
现在,你已经准备好使用git了。假设你已经有了一个小说项目的文件夹(比如叫novel),你想用git来管理它。你可以进入这个文件夹,然后用git init
命令来初始化一个新的git仓库:
shell
$ cd novel
$ git init
Initialized empty Git repository in /Users/yourname/novel/.git/
这样,你就在novel文件夹下创建了一个隐藏的.git
文件夹,里面存放了git管理的所有信息。注意,这个时候还没有把你的小说文件添加到git中,只是创建了一个空的仓库。
要把文件添加到git中,你需要用git add
命令来指定哪些文件或目录。比如,如果你想添加所有的文件,可以用.
来表示当前目录:
csharp
$ git add .
如果你只想添加某个文件或目录,可以用它们的名字来表示,比如:
csharp
$ git add chapter1.txt
$ git add images/
添加完文件后,你需要用git commit
命令来提交它们到本地仓库,并且写一条提交信息来说明这次修改了什么。比如:
sql
$ git commit -m "first commit"
[master (root-commit) 9a7b3f2] first commit
3 files changed, 100 insertions(+)
create mode 100644 chapter1.txt
create mode 100644 chapter2.txt
create mode 100644 images/cover.jpg
这样,你就完成了第一次提交,把你的小说文件保存到了本地仓库中。如果你想查看提交历史,可以用git log
命令:
sql
$ git log
commit 9a7b3f2c6d4f8c0e9a8a0e5d8f6c0c5b9f4c0b4b (HEAD -> master)
Author: your name <your email>
Date: Mon Dec 20 10:00:00 2021 +0800
first commit
如果你想查看当前仓库的状态,可以用git status
命令:
vbnet
$ git status
On branch master
nothing to commit, working tree clean
这里显示当前在master分支(现在是main)上,没有需要提交的修改,工作区是干净的。分支是git的一个重要概念,它可以让你在不影响主线的情况下,尝试不同的修改。比如,你想给小说加一些新的情节,但不确定是否合适,你可以创建一个新的分支,在上面进行修改,如果满意了,再把它合并到主线上。如果不满意,可以直接删除这个分支,不会对主线造成任何影响。
要创建一个新的分支,你可以用git branch
命令,并给它一个名字,比如:
arduino
$ git branch new-plot
这样,你就创建了一个叫new-plot的分支,但是还没有切换到它上面。要切换分支,你可以用git switch
命令:
arduino
$ git switch new-plot
Switched to branch 'new-plot'
现在,你就在new-plot分支上了,你可以对小说进行任意的修改,比如添加一个新的章节:
sql
$ echo "This is a new chapter." > chapter3.txt
$ git add chapter3.txt
$ git commit -m "add a new chapter"
[new-plot 5a8b4f3] add a new chapter
1 file changed, 1 insertion(+)
create mode 100644 chapter3.txt
这样,你就在new-plot分支上提交了一个新的章节。如果你想看看这个分支和master分支有什么不同,你可以用git diff
命令:
csharp
$ git diff master..new-plot
diff --git a/chapter3.txt b/chapter3.txt
new file mode 100644
index 0000000..f9c2a7c
--- /dev/null
+++ b/chapter3.txt
@@ -0,0 +1 @@
+This is a new chapter.
这里显示了两个分支之间的差异,可以看到new-plot分支多了一个chapter3.txt文件。
如果你对这个新的情节感到满意,想要把它合并到master分支上,你可以先切换回master分支:
arduino
$ git switch master
Switched to branch 'master'
然后用git merge
命令来合并new-plot分支:
sql
$ git merge new-plot
Updating 9a7b3f2..5a8b4f3
Fast-forward
chapter3.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 chapter3.txt
这样,master分支就包含了new-plot分支的所有修改。如果你不再需要new-plot分支了,你可以用git branch -d
命令来删除它:
arduino
$ git branch -d new-plot
Deleted branch new-plot (was 5a8b4f3).
好了,现在你已经入门git了捏,更详细的教程推荐去看Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)