@搁浅被注册了8年前
作为一个不合格的 GitHub 搬运工,虽久闻 git 大名,然而却一直用的是 SVN 。趁着前阶段比较清闲,就把 git 摸了一遍,踩了不少坑,纯当记录。
然而 前几天(草稿时,已经有一段时间了)阿里云虚拟主机的数据库挂了,误以为是自己的,手残控制面板更换了操作系统,然后…. 然后就只能迁移网站了,还好旧空间数据保留7天。果然免费不靠谱… 事前事后官方都跟没事人一样。
闲话太多,进入正题 Git 简明教程。
Git客户端篇:
一. 安装git
1.安装
https://github.com/progit/progit/blob/master/zh/01-introduction/01-chapter1.markdown
2.本地账户生成公钥
本地 Git-Bash 执行:
ssh-keygen
连续回车即可,保存在本地用户目录 ~/.ssh/ 下,windows 在 c:/user/用户名/.ssh 下
其中 id_rsa 是私钥,id_rsa.pub 是公钥。每次执行 ssh-keygen 都会重新生成一组公私钥。如果你是要用于GitHub生成公钥,请执行:
ssh-keygen -t rsa -C "user@xx.com"
3.配置全局用户信息
git config --global user.name "username" git config --global user.email "user@xx.com"
(PS.通过 git config –list 命令可查看详细配置。)
配置自定义远程服务器映射:
在本地 Git-Bash 执行:
cat> ~/.ssh/config host gitserver (自己取个名字) hostname ServerIP (你的git服务器地址) port 22 (所使用的SSH端口号)
由于我的Git服务器使用的不是SSH的默认22端口,所以使用服务器映射非常方便,关于如何配置服务器见下半部分。
4.设置完成,可以初始化本地仓库或从服务器克隆
初始化本地仓库:
定位到要设置为本地仓库的目录,启动 Git-Bash 执行:
git init
或者从某服务器克隆:
git clone git@gitserver:/opt/git/project.git
二. git常用命令
git help <verb> 获取项目帮助 git config --list 查看配置信息 git rm filesName 删除文件 git mv filesName1 filesName2 重命名 git clone git@gitserver:/opt/git/project.git 从服务器仓库克隆 git remote add origin git@gitserver:/opt/git/project.git 把本地仓库关连到远程仓库 git pull 拉取远程数据并合并 git add filesName 跟踪文件至暂存区,指定. 添加所有文件 git commit -m "decoration" 提交到仓库并增加描述,加上 -a 参数,可不用重复添加至暂存区 git push origin master 提交 mastr 分支到远程 git status 查看文件状态 git diff filesName 查看差异,不指定文件名则查看全部 git log 查看提交历史,加上 --pretty=oneline 参数缩略查看 git log —stat 查看每次提交的简略的统计信息 git reflog 查看每一次命令 git branch -r 查看远程分支 git checkout -b dev (以当前分支为基础)创建本地 dev 分支 git checkout -b dev origin/dev 从远程分支映射并建立本地分支切换至新建分支 git branch --set-upstream-to=origin/dev dev 设置本地 dev 分支到远程 dev 分支的映射 git merge dev 合并 dev 分支到当前分支 git merge —abort 合并失败试取消合并 git push origin dev:dev 将本地 dev 分支推送到远端并建立远端 dev 分支 git push origin dev 将分支推送到远程 git branch -d dev 删除本地 dev 分支,-D 参数强制删除 git push origin -d dev 删除远程 dev 分支 git push origin :dev 删除远程 dev 分支 git branch -m dev newDev 重命名本地 dev 分支为 newDev,-M 参数强制重命名 git stash 储存工作现场 git stash list 查看现场 git stash pop 恢复现场并清除现场存储 git reset --hard HEAD^ 回退到上一个版本,上上个版本为 HEAD^^,或者 HEAD~2 git reset --hard 3628164 回到指定 MD5 版本,只需要前几位即可 git checkout — fileName 从版本库或者暂存区(如果在)还原文件 git tag 以字母顺序列出标签 git tag -l 'xxxxx' 查找特定标签 git tag -a v1.4 -m 'my version v1.4' 打 tag, -a 参数记录完整可校验对象 git tag v1.4 轻量标签,提交校验和存储到一个文件中,没有存储任何其他信息 git tag -d <tagname> 删除本地标签 git push origin <tagname> 推送指定标签到远端 git push --tags 推送所有标签到远端
服务器搭建篇:
下文仅介绍在 CentOS 下的配置。
一. 安装git
1.先安装依赖服务
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
2.安装最新版git ( 请从 https://github.com/git/git/releases 修改下面的版本号)
wget https://github.com/git/git/archive/v2.7.4.tar.gz tar -zxf v2.7.4.tar.gz cd git-2.7.4 make prefix=/usr/local all make prefix=/usr/local install
3.安装完成,检查版本
git --version
二. 配置git
1.在服务器创建一个 git 用户并为其创建一个 .ssh 目录
sudo adduser git su git cd /home chmod 0755 git cd ~ mkdir .ssh chmod 0700 .ssh cd .ssh touch authorized_keys chmod 0600 authorized_keys
2. 实现免密码访问
把本地用户公钥 id_rsa.pub(见客户端篇)加入 authorized_keys
在本地 Git-Bash 执行:
scp -P 22 ~/.ssh/id_rsa.pub root@gitserver:/home/git/.ssh
上面使用 scp 命令把本地公钥 id_rsa.pub 复制到你的服务器。其中:-P 参数指定服务器SSH端口,默认为22;~/.ssh/id_rsa.pub 为你的本地公钥路径;root 可以是你服务器上可远程登陆 SSH 的用户,需要输入用户密码,我们为了实现无密码访问必须要借助有密码的用户来实现;gitserver 为客户端篇 自定义远程服务器映射 里的 host 值;/home/git/.ssh 为你服务器上的目录。
复制完成后,在服务器上切换为git用户执行追加写入
su git cd ~/.ssh cat id_rsa.pub >> authorized_keys
特别注意,不要手动编辑 authorized_keys 文件,极其容易造成各种问题…
3. 指定git目录,新建裸仓并初始化
如果此时你正使用git用户,执行 exit 命令即可切换回root用户
使用 root 用户指定git目录,假设为 /opt/git/:
cd /opt mkdir git cd git
新建裸仓(project.git)并初始化:
mkdir project.git cd project.git git --bare init
更改用户所有权为 git用户:
cd ../ chown -R git:git project.git
配置完成,在本地克隆刚才新建的仓库,测试是否可以免密码操作:
git clone git@gitserver:/opt/git/project.git
三. 安全配置
出于安全考虑,第二步创建的git用户不允许登录shell,
which git-shell
复制获得的 git-shell 安装路径(例如 /usr/local/bin/git-shell),编辑配置:
vi /etc/passwd
找到最后的 git:x:1001:1001:,,,:/home/git:/bin/bash 将行末的内容修改为
git:x:1001:1001:,,,:/home/git:/usr/local/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell。
看不太懂..