从零开始玩转Git:搭建自己的代码仓库,告别代码丢失的噩梦!

从零开始玩转Git:搭建自己的代码仓库,告别代码丢失的噩梦!

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

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

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

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

• 工作区就是你电脑上能看到的文件夹• 暂存区像是一个临时存放的地方,你用git add把文件放进去• 版本库就是最终存储的地方,用git commit提交进去这就像你整理房间一样,先把要洗的衣服放到洗衣篮里(暂存区),然后一起扔进洗衣机(版本库)

Git 工作流程代码语言:javascript复制有修改是是否否无修改开始初始化仓库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我就不说了,官网下载安装就行。装好之后第一件事是配置用户信息:

代码语言:javascript复制git config --global user.name "你的名字"

git config --global user.email "你的邮箱"然后就可以开始玩了。创建一个新的仓库:

代码语言:javascript复制mkdir my-project

cd my-project

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

代码语言:javascript复制echo "Hello Git" > readme.txt

git add readme.txt

git commit -m "第一次提交"就这么简单,你的第一个版本就保存好了。

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

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

创建并切换到新分支:

代码语言:javascript复制git checkout -b feature-login这相当于:

代码语言:javascript复制git branch feature-login

git checkout feature-login在新分支上开发完成后,切回主分支合并:

代码语言:javascript复制git checkout main

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

代码语言:javascript复制git switch -c feature-login # 创建并切换

git switch main # 切换分支常见的分支规范如下:MASTER分支(MASTER是主分支,是代码的核心)。

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

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

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

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

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

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

代码语言:javascript复制git remote add origin https://github.com/username/repo.git

git push -u origin main以后每次提交就可以直接:

代码语言:javascript复制git push从远程仓库克隆项目:

代码语言:javascript复制git clone https://github.com/username/repo.git团队协作的时候,记得经常pull最新代码:

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

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

环境准备代码语言:javascript复制#创建一个新仓库

[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用户:

代码语言:javascript复制su git

cd /home/git创建一个裸仓库(bare repository):

代码语言:javascript复制mkdir project.git

cd project.git

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

测试连接在客户端测试连接:

代码语言:javascript复制git clone git@your-server-ip:/home/git/project.git如果能正常克隆,说明Git服务器搭建成功了。

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

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

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

下载Gitea:

代码语言:javascript复制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-20250830102147464image-20250830102147464

创建gitea用户和目录:

代码语言:javascript复制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服务文件,内容如下:

代码语言:javascript复制cat </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:

代码语言:javascript复制systemctl daemon-reload

systemctl enable gitea

systemctl start gitea

#如果出现报错,记得给对于文件夹权限

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

image-20250830103623078image-20250830103623078

image-20250830104408533image-20250830104408533

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

代码语言:javascript复制# 编译文件

*.o

*.so

*.exe

# IDE文件

.vscode/

.idea/

# 日志文件

*.log

# 系统文件

.DS_Store

Thumbs.db查看历史代码语言:javascript复制git log --oneline --graph # 图形化显示提交历史

git log --author="张三" # 查看某人的提交

git show commit-id # 查看某次提交的详细信息撤销操作代码语言:javascript复制git checkout -- filename # 撤销工作区的修改

git reset HEAD filename # 撤销暂存区的修改

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

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

代码语言:javascript复制git tag v1.0.0

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

git push origin v1.0.0团队协作的最佳实践在团队中使用Git,有一些约定俗成的规范。

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

代码语言:javascript复制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会在文件中标记冲突的地方:

代码语言:javascript复制<<<<<<< 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中恢复:

代码语言:javascript复制git checkout HEAD -- filename提交了错误的文件如果刚提交就发现有问题,可以修改最后一次提交:

代码语言:javascript复制git add forgotten-file

git commit --amend性能优化和维护Git仓库用久了可能会变得很大,特别是有大文件的时候。定期清理很有必要:

代码语言:javascript复制git gc --aggressive # 垃圾回收

git prune # 清理无用对象对于大文件,建议使用Git LFS(Large File Storage):

代码语言:javascript复制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吧,真的能让你的开发效率提升一大截。

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

公众号:运维躬行录

个人博客:躬行笔记

相关推荐

呼吸37度护肤品怎么样 呼吸37度(sum:37)套装有哪些系列
为什么选择八百客CRM?十大优势解析助力企业高效管理
哥倫比亞國家足球隊
彩票365官网下载安装

哥倫比亞國家足球隊

📅 10-09 👁️ 5150