目录

集中式和分布式版本控制系统的区别?

Git 入门

1.创建目录

2.初始化 Git

3.新建 README.md

4.提交到本地

5.绑定远程仓库

6.推送到 Gitee

7.克隆项目

8.分支管理

.git 与 .gitignore

使用Docker部署Git服务器 Gogs


Git 是一种分布式版本控制系统,用于管理软件项目的源代码,使用 Git 可以追踪代码的历史修改记录,方便团队协作、代码共享和代码重构。


集中式和分布式版本控制系统的区别?


集中式版本控制系统的版本库是集中存放在中央服务器的,因为干活的时候用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的代码推送给中央服务器,最大的毛病就是必须联网才能工作。

而分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库(也就是本地仓库),这样在工作的时候就不需要联网了,因为版本库(也就是本地仓库)就在自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。


Git 入门


我们一般在使用git去协同开发之前,需要建议一个自己的仓库(repository),用于存储代码和版本历史记录。

参考:Git教程 https://liaoxuefeng.com/books/git/introduction/index.html

​

上图是gitee创建仓库代码,流程如下:

1.创建目录

mkdir smart-dbsystem
cd smart-dbsystem

2.初始化 Git

我们需要在本地搭建一个本地仓库(也就是版本库),可以简单理解成一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
而搭建本地仓库很简单,只需要在电脑上运行 git init:

git init

瞬间 Git 就把仓库建好了,而且告诉这是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个 .git 的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把 Git 仓库给破坏了。

3.新建 README.md

touch README.md

4.提交到本地

在git有四块区域:

工作区(Working Directory)
        ↓ git add
暂存区(Stage / Index)
        ↓ git commit
本地仓库/版本库(Local Repository)
        ↓ git push          (把本地仓库 → 远程仓库)
远程仓库(Remote Repository)

我们写代码是在工作区(就是在电脑里能看到的目录),但 Git 不会直接把我们的乱涂乱改写进历史,那样历史会变成一锅乱炖,所以就需要有暂存区(保存在 .git/index)。而 git add 命令实际上就是把要提交的所有修改放到暂存区,然后执行 git commit 就可以一次性把暂存区的所有修改提交到分支:

git add <file>
git commit -m "描述信息"

同样可以使用 git add . 命令去将所有变更添加到暂存区。

git add . 

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

$ git status
On branch master
nothing to commit, working tree clean

如果需要撤销某个提交,可以使用 git revert 命令来创建一个新的提交,该提交将会抵消先前的提交效果。

git revert

可以使用 git log 查看从最近到最远的提交日志:

git log --pretty=oneline

如果想回退上一个版本需使用 git reset,--hard 会回退到上个版本的已提交状态,--soft 会回退到上个版本的未提交状态,--mixed 会回退到上个版本已添加但未提交的状态:(1094a 是 commit id 也就是版本号)

git reset --hard 1094a

这里 git reflog 可以用来记录每一次命令:

$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

但假设我们的流程如下:第一次修改 -> git add -> 第二次修改 -> git commit
当使用 git add,在工作区的第一次修改被放入暂存区准备提交,但是在工作区的第二次修改并没有放入暂存区,所以 git commit 只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
所以我们需要将第二次修改在提交一遍:第一次修改 -> git add -> 第二次修改 -> git add -> git commit
但是如果我们想丢弃工作区的修改,可以使用 git checkout(例如将 readme.txt 文件在工作区的修改全部撤销),让这个文件回到最近一次 git add 或 git commit 时的状态:

git checkout -- readme.txt

 如果我们发现修改只是添加到了暂存区,还没有提交,可以使用 git reset HEAD <file>:(git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区)

$ git reset HEAD readme.txt
Unstaged changes after reset:
M	readme.txt

要想从本地仓库中删除该文件,可以使用 git rm 命令在工作区与暂存区删掉文件,然后使用 git commit 提交到本地仓库:

$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 test.txt

5.绑定远程仓库

我们在本地创建了一个 Git 仓库后,又想在 Gitee 创建一个Git仓库,并且让这两个仓库进行远程同步,需要使用下面命令建立连接,意思是为当前本地 Git 仓库添加一个别名为 origin 的远程仓库地址:(如果之前已经添加过 origin,再次执行会报错)

git remote add origin https://gitee.com/eleven-lxs/smart-dbsystem.git

可以使用 git remote -v 查看现有远程仓库:

git remote -v 

6.推送到 Gitee

随后使用 git push 命令将本地仓库的代码推送到远程仓库:(推送本地 master 分支到 origin)

git push -u origin "master'

7.克隆项目

如果想要克隆项目,需使用 git clone 命令:

git clone https://gitee.com/eleven-lxs/smart-dbsystem.git

8.分支管理

根据上面讲到的版本回退,我们已经知道每次提交,Git 都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在 Git 里,这个分支叫主分支,即 master 分支。而 HEAD 分支严格来说不是指向提交,而是指向 master,所以 HEAD 指向的就是当前分支。

每次提交时,master 分支都会向前移动一步,这样随着我们不断提交,master 分支的线也越来越长。

当我们创建新的分支 dev:(加上 -b 参数表示创建并切换)

$ git checkout -b dev
Switched to a new branch 'dev'

可以用 git branch 命令查看当前分支:

$ git branch
* dev
  master

Git 就会新建了一个指针叫 dev,指向 master 相同的提交,再把 HEAD 指向 dev 就表示当前分支在 dev 上:

于是从现在开始,对工作区的修改和提交就是针对 dev 分支了,比如新提交一次后,dev 指针往前移动一步,而 master 指针不变:

$ git add readme.txt 
$ git commit -m "branch test"
[dev b17d20e] branch test
 1 file changed, 1 insertion(+)

那我们在 dev 分支开发完成后想将代码合并到 master 上,我们就需要直接让 master 指向 dev 的当前提交,就完成了合并。

首先切换到 master 分支:(这里使用 git switch 切换分支,加 -c 可创建并切换分支)

$ git switch master
Switched to branch 'master'

那么这时 HEAD 指向的就是 master :

之后我们使用 git merge 命令将 dev 分支代码合并到 master 分支:(该命令用于合并指定分支到当前分支)

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

合并完成后,就可以放心地删除 dev 分支了,使用 git branch -d 命令:

$ git branch -d dev
Deleted branch dev (was b17d20e).

干活分支策略:(确保 master 分支稳定且仅用来发布新版本,平时不能在上面干活,如果干活可在 dev 分支上)

而要查看代码的历史提交记录,可以使用 git log 命令来获取详细信息:

git log                  # 显示完整的历史记录
git log --oneline        # 简洁的一行摘要形式显示每个提交
git log -p <file>        # 显示特定文件的每次提交详细差异

如果想将Git存储库版本回退,请使用 git reset 命令:

git reset HEAD~1

下图展示了 git 命令的使用流程:

命令发生位置作用描述从哪里 → 到哪里使用时机
git add工作区 → 暂存区(Index)把修改加入暂存区,准备提交workspace → index当你修改了文件,想把它纳入下一次 commit
git commit暂存区 → 本地仓库(Repository)将暂存区内容形成一个新的版本快照index → local repo想记录一次可回滚的版本点时
git checkout本地仓库 → 工作区切换分支 / 切回某个版本 / 恢复文件local repo → workspace(同步到 index)想切分支、回退、查看旧版本内容时
git clone远程仓库 → 本地仓库(第一次使用)下载整个远程仓库,并自动建好工作区remote → local repo + workspace第一次下载某项目到本地时
git fetch远程仓库 → 本地仓库(不更新工作区)获取远程最新信息但不合并remote → local repo想先查看远程改动再决定是否合并
git pull远程仓库 → 本地仓库 → 工作区fetch + merge(自动更新工作区)remote → local repo → workspace想同步远程最新代码时
git push本地仓库 → 远程仓库把本地提交推到远程,让别人也能看到local repo → remote你 commit 之后,想上传到远程平台时

.git 与 .gitignore


.git 是 Git 仓库的核心目录,当运行 git init 或者 git clone 时,Git 就会自动创建目录,它的结构如下:

文件/目录作用
HEAD指向当前所在分支(如 ref: refs/heads/main)
config仓库级别的配置(如 remote 地址、用户信息等)
description仓库描述(通常用于 GitWeb)
index暂存区(Staging Area),记录哪些文件被 git add
objects/对象数据库,存储所有 blob(文件)、tree(目录结构)、commit(提交)、tag 等
refs/引用目录,包含分支(heads/)、标签(tags/)、远程跟踪分支(remotes/)
hooks/Git 钩子脚本(如 pre-commit、post-merge)
logs/分支和 HEAD 的变更历史(用于 git reflog)

而 .gitignore 是用于告诉 Git 哪些文件不要跟踪,它不会影响已经跟踪的文件(即已经 git add 过的文件),只对未跟踪的文件生效。

例如 IntelliJ IDEA 开发 Spring Boot 的 .gitignore:

.idea/
*.iws
*.iml
*.ipr
target/

build/

*.log
*.db
*.sqlite

.env
*.env
config/secrets.properties
config/application-local.yml
config/application-dev.yml

*.class

*.jar
*.war
*.ear

*~
*.bak
*.tmp

如果已经不小心把 application-local.yml 或 .idea/ 提交过,需要先用 git rm --cached 移除跟踪:

git rm -r --cached .idea
git rm --cached application-local.yml
git add .gitignore
git commit -m "fix: ignore IDE and local config files"

使用Docker部署Git服务器 Gogs


Gogs(Go Git Service)是一个轻量级、自托管的 Git 服务,用 Go 语言编写,功能类似于 GitHub、GitLab,但资源占用更少、部署更简单。它支持 Web 界面管理仓库、用户、组织、SSH/HTTP 克隆、Issue、Pull Request(合并请求)、Webhook 等核心功能,非常适合个人或小团队搭建私有 Git 服务器。

Gogs: A painless self-hosted Git servicehttps://gogs.io/getting-started/introduction

下面我们在 Linux 上使用 Docker 搭建 Gogs:

首先拉取镜像:

docker pull gogs/gogs:latest

之后创建并授权部署目录:

mkdir -p /data/gogs/{data,log}   &&  cd /data/gogs/
chown -R 1000:1000 /data/gogs

使用 docker 部署,可参考以下命令:(--restart 参数用于配置容器的自动重启策略,即当 Docker 守护进程启动或容器意外退出时(除手动停止外,其他情况都重启),是否以及如何自动重新启动该容器。)

docker run -d \
  --name gogs \
  --restart unless-stopped \
  --publish 3200:3000 \
  --publish 4200:22 \
  --volume /data/gogs/data:/data \
  --volume /data/gogs/log:/app/gogs/log \
  --volume /etc/localtime:/etc/localtime:ro \
  --user 1000:1000 \
  gogs/gogs:latest

参考:【Docker项目实战】使用Docker部署Git服务器Gogs - 知乎https://zhuanlan.zhihu.com/p/1957079311484948913

更多推荐