Git手记
本地使用篇
工作区:前git状态
暂存区:add后的状态,列入git管理内容
仓库区:commit后的状态,被git归档
远程仓库:push后的状态,作为远程备份存在
配置
设置用户信息,这会作为提交代码时的信息git config --global user.name [名字]
git config --global user.email xxx@xxx
不带global,只影响当前仓库,带global,影响全局默认配置。
消除路径转义(解决乱码)git config --global core.quotepath false
设置默认主版本号名git config --global init.defaultbranch 版本号名
pull时默认使用rebase模式git config --global pull.rebase true
切换分支时,自动进行rebase(旧分支除外)git config --global branch.autosetuprebase always
以下配置内容,需要保证全局变量中可以找到对应的程序
设置文本编辑器git config --global core.editor xxx
设置差异分析工具git config --global merge.tool vimdiff
Gnome用Meld,Qt用Kompare/Kdiff3
自动修改换行符实现跨平台兼容git config --global core.autocrlf true|input
设置默认push模式git config --global push.default matching|simple
matching 推送所有有对应的远程分支的本地分支
simple 只推送当前分支
设置忽略文件git config --global core.excludesfile /path-to-file
缓存/永久保存/不缓存push账号密码
缓存账号密码,–timeout指定过期时间,默认900秒也就是15分钟git config --global credential.helper cache [--timeout 900]
以文件形式长期保存账号密码,–file指定保存路径,默认~/.git-credentials
或%userprofile%/.git-credentials
git config --global credential.helper store [--file /path-to-file]
不缓存账号密码git config --unset credential.helper
查看配置信息git config --list
直接修改配置git config --global -e
也可以去查看~/.gitconfig
或%userprofile%/.gitconfig
解决中文乱码:在配置文件中加入以下内容
1 | [gui] |
初始操作
创建仓库git init [--bare]
选项:–bare 裸仓库,即不创建.git文件夹
添加文件git add
剔除文件git rm
移动文件git mv
提交文件git commit -m "信息" [-a]
-a 无视文件修改状态,也就是说修改了的文件不需要再次add直接上传
查看commit日志git log
查看操作日志git reflog
以列表形式显示文件更新记录git blame 文件名
查看仓库信息git status
查看暂存区文件列表git ls-files
比较暂存区与工作区的文件差异git diff
比较暂存区和最后一次提交的文件差异git diff --cached
复原操作
HEAD表示当前版本,HEAD^
,HEAD~1
表示上一个版本,以此类推
将暂存区复位到指定commit前的状态,不包括add, rm,不修改工作区文件,n=1时相当于撤销最后一次commitgit reset HEAD~n --soft
将暂存区复位到指定commit前的状态,包括add, rm,但不修改工作区文件git reset HEAD~n [--mixed]
彻底重置当前状态,还原add过的工作区文件到选定的commit状态git reset --hard HEAD~n
撤销工作区文件修改,恢复到暂存区状态git checkout 文件名
和reset --hard HEAD 文件名
类似,但是不会修改当前分支,而是会作为新的commit提交
暂停当前工作git stash
恢复之前一次工作git stash pop
标签操作
标签,给当前状态的HEAD起个正式的版本号或名字git tag -a "标签名" [-m "信息"]
上传指定版本,标签必须单独push,push代码时不会影响标签git push 仓库名 标签名
显示所有的标签,必须push上游后才能显示git tag
删除本地标签,这不会影响远程标签git tag -d "标签名"
删除远程标签,这不会影响本地标签git push 仓库名 --delete 标签名
分支操作
查看所有分支git branch [--show-current]
创建一个分支git branch "分支名"
创建一个和之前分支无关的全新分支git checkout --orphan 分支名
切换当前分支git checkout [-b] 分支名
带-b选项时,若不存在则先创建分支
删除已合并分支git branch -d 分支名
强制删除分支git branch -D 分支名
删除前请先退出分支
重命名分支git branch -m [旧分支名] 新分支名
合并分支,将分支2合并到分支1,中途有冲突需要手动处理git merge [分支名1] 分支名2 [--ff-only] [--no-ff] [--squash] [-m "合并信息"]
缺省分支1为当前分支
fast-forward是指在没有冲突的条件下直接省略commit进行合并--ff-only
表示仅当符合fast-forward条件时才merge--no-ff
表示完全不使用fast-forward--squash
表示把分支的commit历史压缩到一次
打开处理工具解决merge冲突git mergetool
分支变基,将分支1完全转换为分支2,中途有冲突需要手动处理git rebase [分支名1] 分支名2
缺省分支1为当前分支
原则
下游分支更新上游分支内容的时候使用rebase
上游分支合并下游分支内容的时候使用merge
冲突
出现冲突时,会提示发生冲突的文件,需要手动编辑对应文件进行处理
远程操作
以下链接均用长链接
显示远程仓库服务器git remote -v
添加一个远程仓库git remote add 仓库名 ssh://git@remote-server:port/path-to-project
克隆一个远程仓库git clone ssh://git@remote-server:port/path-to-project
远程仓库若没有特别设置,仓库名默认为origin
重设远程仓库git remote set-url 仓库名 ssh://git@remote-server:port/path-to-project
上传内容到远程git push [--set-upstream|-u] 仓库名 [分支名:]远程分支名
git push [-f] # 已设置默认上游
设置上游联系(一键push)git branch --set-upstream-to 仓库名/远程分支名
取消上游联系git branch --unset-branch
显示远程仓库名git remote show
显示远程仓库分支状况git ls-remote
显示远程仓库详细情况git remote show 仓库名
获取远程仓库更新git fetch 仓库名 远程分支名:本地分支名
git fetch [--all] # 已设置默认上游
拉取远程仓库内容(并自动合并本地更改)git pull 仓库名 远程分支名:本地分支名
git pull # 已设置默认上游
相当于先fetch
再merge
建议使用这一条命令更新不同分支的内容
拉取远程仓库内容(并自动变基本地分支,不会产生merge点)git pull --rebase 仓库名 远程分支名:本地分支名
git pull --rebase # 已设置默认上游
相当于先fetch
再rebase
建议使用这一条命令更新当前分支的内容
列出所有远程分支git branch -r
列出分支映射信息git branch -vv
删除远程分支git push --delete 仓库名 远程分支名
杂项
ignore文件
在工作区创建.gitignore
文件并配置,可以设置Git排除某些文件。该文件遵从通配符而不是正则表达式。
创建后执行git config core.excludesfile /path-to-file
git check-ignore -v file
可以检测文件是否被排除
“loose object”错误
先删除出错的object文件夹,然后git fsck --full
,最后查看git reflog
。
“Auto packing the repository for optimum performance”
Git会定期将对象打包为二进制文件以节省空间并提高传输效率。
用户可以执行git gc
命令以手动进行这一行为。
服务器搭建篇
需求对比分析:
裸Git:直接使用Git创建仓库,依赖项最少,但功能最少,也最不直观,只支持SSH协议。
Github:使用最广泛的平台,免费提供基本服务,但是,代码托管服务不免费。每月 7 美金可以购买 5 个私有仓库,支持SSH和HTTP。
Gitea:轻量级的Git托管服务器,完全开源免费,支持SSH和HTTP。
Gitlab:提供完整的Git服务和CI/CD服务,有企业版和社区版两种,社区版可以免费离线使用,支持SSH和HTTP。
搭建流程
Git
- 安装Git
apt install git[-core][-all]
yum install git[-core][-all]
- 安全起见,创建一个独立的git组和用户
groupadd git
useradd git -m -g git -s /usr/bin/git-shell
passwd git
- 可选,创建ssh密钥,实现免密push
在本地主机执行ssh-keygen -t rsa
,然后将id_rsa.pub
文件内容传入/home/git/.ssh/authorized_keys
- 创建一个工作目录,在目录中初始化仓库
mkdir /srv/work.git
按照标准目录位置git init --bare
- 在本地仓库新建一个git工作目录,将目录所有权交给git用户,然后初始化仓库
chown git:git -R /srv/work.git
必须保证目录所有权是git用户!!!否则会出现unpack错误!!!git init
- 添加文件到仓库中,每次添加都要这么做
git add ./...
修改文件后要确认,输入git commit -m "信息内容" -a
- 添加远程服务器
git remote add [仓库名] ssh://git@remote-server:port/path-to-project
注:port即为ssh端口号 - 推送更改
git push [仓库名] [分支名]
也可以先设置分支的上游关联git branch --set-upstream-to "仓库名"/"远程分支名"
然后就可以使用git push
一键push了 - 附录
要提交修改,先git commit -m "信息内容" -a
再git push 仓库名 master
要克隆项目,只需git clone ssh://git@remote-server:port/path-to-project
方便起见,可以先在服务器创建仓库,然后本地clone空仓库,这样会自动设置上游。
Gitea
一个轻量级的Git托管服务器,是Gogs的一个Fork,目的是通过社区提供更多功能,没有自带CI/CD功能,但是可以通过插件实现。
和Gogs大量重合,可以无缝迁移。
本机搭建
安装Git和SQLite(也可以用MySQL和PostgreSQL)apt install git[-core][-all] sqlite3
yum install git[-core][-all] sqlite
安全起见,创建一个独立的git组和用户groupadd git
useradd git -m -g git -s /usr/bin/git-shell
passwd git
安装
在gitea | Gitea或go-gitea/gitea下载最新版二进制程序
程序默认没有执行权限,chmod a+x gitea
赋予执行权限
然后移动至标准目录mv gitea /usr/local/bin/
创建目录
创建配置文件目录,并修改权限mkdir /etc/gitea
chown -R git:git /etc/gitea
创建资料文件目录,并修改权限mkdir /var/lib/gitea
mkdir /var/lib/gitea/custom
mkdir /var/lib/gitea/data
chown -R git:git /var/lib/gitea
创建日志文件目录mkdir /var/log/gitea
chown -R git:git /var/log/gitea
可选:禁止一般用户对日志文件目录的读权限chmod -R o-wrx /var/log/gitea
配置服务
创建/etc/systemd/system/gitea.service
,一个模板如下:
1 | [Unit] |
之后,使用systemctl enable --now gitea.service
启动服务
Gitea初始化安装
如图所示
注意,域名应设置为与本机直接绑定的域名,如果没有请设为缺省值localhost
如果设置了反向代理,URL应设置为协议://实际访问域名或IP:实际访问端口/
![[gitea.png]]
基本配置到这里就结束了,以下为一些按需进行的自定义配置
离线模式
如果你想禁用一切外部CDN,仅使用本地主机,请修改/etc/gitea/app.ini
,在[server]
段修改以下内容:
1 | [server] |
设置SSH
如果你对SSH进行了反向代理,或者不想使用SSH,请修改/etc/gitea/app.ini
,在[server]
段修改以下内容:
1 | [server] |
添加SSH公钥
进入头像->设置->SSH/GPG密钥->增加密钥
,将公钥文件*.pub
的内容拷贝进下方内容栏,设置名称后保存。
重新设置数据库
修改/etc/gitea/app.ini
,在[database]
段修改以下内容
1 | [database] |
设置HTTPS
修改/etc/gitea/app.ini
,在[server]
段添加以下内容
1 | [server] |
如果你使用ACME,还要在[server]
段添加以下内容:
1 | [server] |
然后,在[session]
段添加以下内容
1 | [session] |
设置注册
修改/etc/gitea/app.ini
,在[service]
段修改以下内容
1 | [service] |
设置仓库
修改/etc/gitea/app.ini
,在[repository]
段添加以下内容
1 | ROOT = /path # 设置存放git项目的根目录 |
设置头像
修改/etc/gitea/app.ini
,在[picture]
段添加以下内容
1 | DISABLE_GRAVATAR = true # 完全禁用在线头像,只使用本地头像 |
设置附件
修改/etc/gitea/app.ini
,在[attachment]
段添加以下内容
1 | [attachment] |
设置日志
修改/etc/gitea/app.ini
,在[log]
段添加以下内容
1 | ROOT_PATH = /var/log/gitea # 日志文件的保存目录 |
在[database]
段修改以下内容
1 | [database] |
设置定时任务
修改/etc/gitea/app.ini
,在[cron]
段添加以下内容
1 | [cron] |
重新设置LFS
修改/etc/gitea/app.ini
,在[server]
段修改以下内容
1 | [server] |
在[lfs]
段添加以下内容
1 | [lfs] |
Nginx反向代理
创建Nginx site文件,写入以下内容:
1 | server { |
邮件通知
修改/etc/gitea/app.ini
,在[mailer]
段添加以下内容
1 | [mailer] |
然后,可以在[service]
段修改以下内容
1 | [service] |
配置fail2ban
创建日志过滤配置文件/etc/fail2ban/filter.d/gitea.conf
,写入以下内容:
1 | [Definition] |
创建监狱服务配置文件/etc/fail2ban/jail.d/gitea.conf
,写入以下内容:
1 | [gitea] |
重新安装
修改/etc/gitea/app.ini
,在[security]
段修改以下内容
1 | [security] |
重启服务后,会重新出现安装页面
Gitlab
Gitlab有友好的网页控制台和图形化操作功能,官方提供了企业版(付费)和社区版(免费),搭建可以使用本机安装或Docker。
本机搭建
- 首先去gitlab - Repositories
下载对应的软件包。 - 安装后修改/etc/gitlab/gitlab.rb,本地配置把external_url改为
IP:port
或URL:port
,设置Gitlab接收请求的IP或域名。内置的Nginx服务器默认监听0.0.0.0:80,修改nginx['listen_addresses']
和nginx['listen_port']
可以改变。如果不使用内置的Nginx,可以修改web_server['external_users']
设置外部服务器用户。设置nginx['redirect_http_to_https']
以确保HTTP访问重定向至HTTPS - 如果有防火墙,注意配置对应端口开放
- 执行
gitlab-ctl reconfigure
应用配置 - 启动Gitlab
gitlab-ctl start
- 初次启动需要等待较长时间,期间显示502为正常现象
Docker搭建
- 拉取Gitlab的CE版镜像
docker pull gitlab/gitlab-ce
- 运行以下命令启动Gitlab容器
1
2
3
4
5
6
7
8docker run --detach \
-p 辅助端口:443 主要端口:80 辅助端口:22 \
--name gitlab \
--restart always \
--volume /var/opt/gitlab/config:/etc/gitlab \
--volume /var/opt/gitlab/logs:/var/log/gitlab \
--volume /var/opt/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest - 如果有防火墙,需要配置相应的端口开放
- 访问本机IP+端口
SVN
使用SVNAdmin 2.0。
Docker搭建
- 拉取镜像
docker pull witersencom/svnadmin
- 启动临时容器
docker run -d --name temp --privileged witersencom/svnadmin:2.4.3 /usr/sbin/init
- 拷贝配置文件
1
2
3
4cd /home/
docker cp svnadmintemp:/home/svnadmin ./
docker cp svnadmintemp:/etc/httpd/conf.d ./svnadmin/
docker cp svnadmintemp:/etc/sasl2 ./svnadmin/ - 删除临时容器
docker rm -f temp
- 正式启动容器
1
2
3
4
5
6
7docker run -d -p 80:80 -p 3690:3690 \
-v /home/svnadmin/:/home/svnadmin/ \
-v /home/svnadmin/conf.d/:/etc/httpd/conf.d/ \
-v /home/svnadmin/sasl2/:/etc/sasl2/ \
--privileged \
--name svnadmin \
witersencom/svnadmin - 进行文件授权
1
2docker exec -it svnadmin bash
chown -R apache:apache /home/svnadmin