最近把几个自己写的小项目提交到github,因为很久没用了。还折腾了一会。今天就跟大家聊聊Git的使用,还有怎么搭建自己的Git服务器。不管你是刚入门的小白,还是想要自建代码仓库的朋友,这篇文章应该都能帮到你。
git(/ɡɪt/)是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,拉2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
说白了,Git就是一个版本控制系统。你可以把它想象成一个超级强大的"时光机器",能让你的代码回到任何一个历史版本。比如你今天写了100行代码,明天又改了50行,后天发现改错了想回到昨天的版本,Git就能帮你做到。
我记得刚开始用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服务器呢?主要是数据安全和访问控制。公司的核心代码肯定不能随便放到公网上,而且自建服务器可以更好地控制权限。
我用的是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的权限管理确实挺严格的,但是为了安全也是必要的。
纯命令行的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模型:
不过对于小团队,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服务器要注意安全问题:
我见过有公司因为Git服务器配置不当,被人入侵删除了所有代码。虽然有备份,但是恢复起来还是很麻烦。
Git确实是个强大的工具,从个人项目到企业级应用都能胜任。搭建自己的Git服务器虽然需要一些技术功底,但是对于数据安全和访问控制来说是很有必要的。
刚开始学Git的时候可能会觉得复杂,但是多用几次就熟悉了。记住几个基本命令:add、commit、push、pull,就能应付大部分场景了。高级功能可以慢慢学,不用一开始就想掌握所有东西。
最重要的是要养成好习惯:经常提交、写清楚提交信息、及时同步远程代码。这样即使出了问题,也能快速定位和解决。
现在回想起来,如果当年早点学会Git,就不会有那么多代码丢失的惨痛经历了。所以如果你还在用复制粘贴的方式管理代码,赶紧学学Git吧,真的能让你的开发效率提升一大截。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记