最近把几个自己写的小项目提交到github,因为很久没用了。还折腾了一会。今天就跟大家聊聊Git的使用,还有怎么搭建自己的Git服务器。不管你是刚入门的小白,还是想要自建代码仓库的朋友,这篇文章应该都能帮到你。

Git到底是个啥东西

git(/ɡɪt/)是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,拉2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

说白了,Git就是一个版本控制系统。你可以把它想象成一个超级强大的"时光机器",能让你的代码回到任何一个历史版本。比如你今天写了100行代码,明天又改了50行,后天发现改错了想回到昨天的版本,Git就能帮你做到。

我记得刚开始用Git的时候,总是搞不清楚工作区、暂存区、版本库这些概念。其实很简单:

  • 工作区就是你电脑上能看到的文件夹
  • 暂存区像是一个临时存放的地方,你用git add把文件放进去
  • 版本库就是最终存储的地方,用git commit提交进去

这就像你整理房间一样,先把要洗的衣服放到洗衣篮里(暂存区),然后一起扔进洗衣机(版本库)

Git 工作流程

有修改
无修改
开始
初始化仓库
git init/git clone
创建/切换分支
git branch/git checkout
编辑文件
在工作区修改代码
检查状态
git status
添加到暂存区
git add
提交到本地仓库
git commit
需要与他人协作?
拉取远程更新
git pull
有冲突?
解决冲突
推送到远程
git push
继续开发
其他常用操作
查看历史
git log
查看差异
git diff
合并分支
git merge
标记版本
git tag

基础操作,从这里开始

安装Git我就不说了,官网下载安装就行。装好之后第一件事是配置用户信息:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

然后就可以开始玩了。创建一个新的仓库:

mkdir my-project
cd my-project
git init

这时候你就有了一个空的Git仓库。接下来创建个文件试试:

echo "Hello Git" > readme.txt
git add readme.txt
git commit -m "第一次提交"

就这么简单,你的第一个版本就保存好了。

我刚开始的时候经常忘记add这一步,直接commit,然后Git就提醒我没有文件要提交。后来养成习惯了,每次改完代码都先git status看看状态,再决定要不要add。

分支操作,这个真的很重要

分支可能是Git最强大的功能了。想象一下,你在开发一个新功能,但是突然来了个紧急bug要修复。如果没有分支,你就得把新功能的代码先删掉或者注释掉,修完bug再恢复。有了分支就不一样了,你可以切换到另一个分支去修bug,修完再切回来继续开发新功能。

创建并切换到新分支:

git checkout -b feature-login

这相当于:

git branch feature-login
git checkout feature-login

在新分支上开发完成后,切回主分支合并:

git checkout main
git merge feature-login

不过现在更推荐用git switch命令,比checkout更清晰:

git switch -c feature-login  # 创建并切换
git switch main              # 切换分支

常见的分支规范如下:

MASTER分支(MASTER是主分支,是代码的核心)。

DEVELOP分支(DEVELOP最新开发成果的分支)。

RELEASE分支(为发布新产品设置的分支)。

HOTFIX分支(为了修复软件BUG缺陷的分支)。

FEATURE分支(为开发新功能设置的分支)。

远程仓库,团队协作必备

本地玩Git挺好,但是团队协作就需要远程仓库了。GitHub、GitLab这些都是现成的选择,但是有时候公司项目不方便放到公网上,就需要自己搭建Git服务器了。

先说说怎么用现有的远程仓库。假设你在GitHub上创建了一个仓库,本地关联的命令是:

git remote add origin https://github.com/username/repo.git
git push -u origin main

以后每次提交就可以直接:

git push

从远程仓库克隆项目:

git clone https://github.com/username/repo.git

团队协作的时候,记得经常pull最新代码:

git pull origin main

搭建自己的Git服务器

好了,重头戏来了。为什么要自己搭Git服务器呢?主要是数据安全和访问控制。公司的核心代码肯定不能随便放到公网上,而且自建服务器可以更好地控制权限。

我用的是CentOS 7,其他Linux发行版操作类似。

环境准备

#创建一个新仓库
[root@web1 project]# git init --bare /var/lib/git/web
初始化空的 Git 版本库于 /var/lib/git/web/
[root@web1 project]# ssh-keygen -f /root/.ssh/id_rsa -N ''
  #非交互式生成密钥
[root@web1 project]# ssh-copy-id 192.168.224.128 #将密码拷贝到目标服务器上
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.224.128's password: 

Number of key(s) added: 1

[root@web1 web]# git remote -v #查看服务器信息
origin	root@192.168.224.128:/var/lib/git/web (fetch)
origin	root@192.168.224.128:/var/lib/git/web (push)
#origin 是root@192.168.224.128:/var/lib/git/web (push)的别名

创建仓库

切换到git用户:

su git
cd /home/git

创建一个裸仓库(bare repository):

mkdir project.git
cd project.git
git init --bare

裸仓库就是没有工作区的仓库,专门用来接收push的代码。

测试连接

在客户端测试连接:

git clone git@your-server-ip:/home/git/project.git

如果能正常克隆,说明Git服务器搭建成功了。

我第一次搭建的时候在权限上踩了不少坑。SSH连接总是失败,后来发现是.ssh目录和authorized_keys文件的权限设置不对。Linux的权限管理确实挺严格的,但是为了安全也是必要的。

使用Gitea增强体验

纯命令行的Git服务器功能比较基础,如果想要Web界面、用户管理、权限控制这些功能,推荐使用Gitea。

Gitea是一个轻量级的Git服务,用Go语言开发,部署简单,功能强大。

下载Gitea:

wget -O gitea https://dl.gitea.io/gitea/1.17.3/gitea-1.17.3-linux-amd64
chmod +x gitea
mv gitea /usr/local/bin/

image-20250830102147464

创建gitea用户和目录:

useradd --system --shell /bin/bash --comment 'Git Version Control' --create-home --home-dir /home/gitea gitea
mkdir -p /var/lib/gitea/{custom,data,log}
chown -R gitea:gitea /var/lib/gitea/
chmod -R 750 /var/lib/gitea/

创建systemd服务文件,内容如下:

cat <<EOF>/etc/systemd/system/gitea.service
[Unit]
Description=Gitea
After=syslog.target
After=network.target

[Service]
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=gitea HOME=/home/gitea GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target
EOF

启动Gitea:

systemctl daemon-reload
systemctl enable gitea
systemctl start gitea

#如果出现报错,记得给对于文件夹权限
chown gitea:gitea /etc/gitea

然后访问http://your-server-ip:3000就可以看到Gitea的Web界面了,按照向导完成初始化配置。

image-20250830103623078

image-20250830104408533

实际使用中的一些技巧

忽略文件

项目中总有一些文件不需要版本控制,比如编译生成的文件、IDE配置文件、日志文件等。创建.gitignore文件:

# 编译文件
*.o
*.so
*.exe

# IDE文件
.vscode/
.idea/

# 日志文件
*.log

# 系统文件
.DS_Store
Thumbs.db

查看历史

git log --oneline --graph  # 图形化显示提交历史
git log --author="张三"     # 查看某人的提交
git show commit-id         # 查看某次提交的详细信息

撤销操作

git checkout -- filename   # 撤销工作区的修改
git reset HEAD filename    # 撤销暂存区的修改
git reset --hard HEAD^     # 回退到上一个版本

不过要小心使用reset --hard,这个操作会丢失数据。我有一次手抖执行了这个命令,好在有远程仓库备份,不然就哭了。

标签管理

发布版本的时候,给重要的提交打标签:

git tag v1.0.0
git tag -a v1.0.0 -m "发布1.0版本"
git push origin v1.0.0

团队协作的最佳实践

在团队中使用Git,有一些约定俗成的规范。

提交信息规范

好的提交信息应该简洁明了,说明这次提交做了什么:

feat: 添加用户登录功能
fix: 修复密码验证bug
docs: 更新API文档
style: 代码格式调整

我们团队用的是Angular的提交信息规范,虽然刚开始觉得麻烦,但是后来查找历史记录的时候就发现很有用。

分支策略

比较流行的是Git Flow模型:

  • main分支:稳定的生产版本
  • develop分支:开发分支
  • feature分支:新功能开发
  • release分支:发布准备
  • hotfix分支:紧急修复

不过对于小团队,GitHub Flow可能更简单:只有main分支和feature分支,通过Pull Request合并代码。

代码审查

所有代码合并到主分支前都应该经过审查。Gitea、GitLab这些平台都支持Pull Request/Merge Request功能,可以很方便地进行代码审查。

遇到问题怎么办

Git用久了总会遇到各种问题,分享几个常见的:

合并冲突

当多人修改同一个文件时,合并时可能出现冲突。Git会在文件中标记冲突的地方:

<<<<<<< HEAD
你的修改
=======
别人的修改
>>>>>>> branch-name
####=============================
[root@web1 project]# echo bbb > a.txt
[root@web1 project]# git add .
[root@web1 project]# git commit -m "bbb"
[master a722fd5] bbb
 1 file changed, 1 insertion(+)
[root@web1 project]# git merge hotfix 
自动合并 a.txt
冲突(内容):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。
[root@web1 project]# 
#人工vim 解决

手动解决冲突后,add并commit就行了。

误删文件

如果误删了文件,可以从Git中恢复:

git checkout HEAD -- filename

提交了错误的文件

如果刚提交就发现有问题,可以修改最后一次提交:

git add forgotten-file
git commit --amend

性能优化和维护

Git仓库用久了可能会变得很大,特别是有大文件的时候。定期清理很有必要:

git gc --aggressive  # 垃圾回收
git prune           # 清理无用对象

对于大文件,建议使用Git LFS(Large File Storage):

git lfs install
git lfs track "*.psd"
git add .gitattributes

我们公司的设计师经常往仓库里放几十MB的PSD文件,后来用了Git LFS,仓库大小明显减小了。

安全考虑

自建Git服务器要注意安全问题:

  1. 定期更新Git版本,修复安全漏洞
  2. 使用SSH密钥而不是密码认证
  3. 配置防火墙,只开放必要的端口
  4. 定期备份仓库数据
  5. 设置合适的用户权限

我见过有公司因为Git服务器配置不当,被人入侵删除了所有代码。虽然有备份,但是恢复起来还是很麻烦。

写在最后

Git确实是个强大的工具,从个人项目到企业级应用都能胜任。搭建自己的Git服务器虽然需要一些技术功底,但是对于数据安全和访问控制来说是很有必要的。

刚开始学Git的时候可能会觉得复杂,但是多用几次就熟悉了。记住几个基本命令:add、commit、push、pull,就能应付大部分场景了。高级功能可以慢慢学,不用一开始就想掌握所有东西。

最重要的是要养成好习惯:经常提交、写清楚提交信息、及时同步远程代码。这样即使出了问题,也能快速定位和解决。

现在回想起来,如果当年早点学会Git,就不会有那么多代码丢失的惨痛经历了。所以如果你还在用复制粘贴的方式管理代码,赶紧学学Git吧,真的能让你的开发效率提升一大截。


如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐