本文包括 git 常用命令、仓库搭建、使用方法、问题分析等。
常用命令速查表
如下整理了常用 git 操作命令,以作备查之用。
仓库配置
command | desc |
---|---|
git init --bare test.git |
创建空库 |
git config <--global or --system or --local> -l |
查看<当前用户/系统/当前库>配置信息 |
git config -e |
vi 修改配置信息 |
git config credential.helper store --file=my.txt |
将账户凭证存储到文件,默认文件为 ~/.git-credentials ,内容格式 https://user:pass@example.com |
git config credential.helper cache --timeout=300 |
缓存账户凭证 300 秒 |
git config credential.helper manager |
使用 Git-Credential-Manager 管理凭证,windows 里 控制面板\用户帐户\凭据管理器 。更多详情 |
git config --system --unset credential.helper |
清空缓存账户凭证 |
git config core.quotepath=false |
防止中文 bash 下文件名、问卷路径 显示异常 |
git clone git@xxx.git |
从远程主机克隆一个版本库 |
git clone ssh://git@xxx:10122/xxx.git |
从远程主机克隆一个版本库 |
git clone -b 分支名 ssh://git@xxx:10122/xxx.git |
从远程主机克隆一个指定分支到本地 |
git clone --depth=1 ssh://git@xxx:10122/xxx.git |
浅克隆(shallow clone) |
git remote --set-braches origin '*' |
获取远程库的所有分支 |
git remote -v |
查看 git 远程库地址 |
git remote show origin |
查看远程库对应关系 |
git remote add origin ssh://git@xxx:10122/xxx.git |
新增远程库 |
分支管理
command | desc |
---|---|
git branch |
查看本地分支 |
git branch -a |
查看本地+远程分支 |
git branch testing |
本地创建 testing 分支 |
git branch -d develop |
删除 develop 分支 |
git branch --track <branch> <remote-branch> |
新建一个本地分支并与指定远程分支建立追踪 |
git checkout develop |
切换到 develop 分支 |
git checkout <commit-id> <file> |
检出当前版本对应的 file 文件 |
git status |
查看本地仓库当前状态 |
提交推送
command | desc |
---|---|
git add <path> |
将工作文件修改提交到本地暂存区 |
git add -A(--all) |
statges All |
git add . |
stages new and modified,without deleted |
git add -u |
stages deleted and modified,without new |
git commit -m "here is infos." |
提交代码,有注释 |
git push -u origin develop |
推送本地库当前分支到 origin 远程仓库的 develop 远程分支 |
git push --force -u origin develop |
本地版本比远程版本低时,强制推送更新远程版本(比如本地先git reset –hard再强制更新远程版本) |
git push -u origin :develop |
删除 origin 远程仓库的 develop 远程分支 |
git push -u origin --delete develop |
同上 |
版本操作
command | desc |
---|---|
git rm <file> |
从版本库中删除一个文件 |
git reset <commit-id> (-–mixed ) |
把commit撤销,本地文件不受影响 |
git reset HEAD <file> |
把暂存区的修改撤销掉(unstage)重新放回工作区 |
git reset --hard HEAD |
彻底回退到某一个版本,本地源码也会变为上一个源码内容 |
git revert <commit-id> |
撤销指定的版本,本次撤销会被作为一次单独的commit进行保存 |
git push origin <分支名> --force |
彻底回退到某一个版本然后提交到远程库,删除对应的提交记录 |
git tag |
列出现有标签 |
git tag 20170428.v.1.2 |
添加一个轻量级标签 |
git tag -a v1.2 -m "this is v1.2" |
添加一个带附注的标签 |
git push orign 20170428.v.1.2 |
推送标签到远程仓库 |
git tag -d 20170428.v.1.2 |
删除一个标签 |
git push orign :refs/tags/20170428.v.1.2 |
删除远程仓库的标签 |
git merge testing |
把 testing 分支合并到当前分支,不会保留历史分支记录 |
git merge --no-ff testing |
把 testing 分支合并到当前分支,并保存之前的分支历史 推荐 |
git merge --abort |
取消合并 |
git rebase -i <commit-id> |
交互式地进行提交历史修改 |
git cherry-pick <commit-id> |
仅合并某一次提交的内容。配合 --continue 、--abort 使用 |
git show |
查看此标签信息 |
git pull |
同步更新最新代码到本地, 相当于 git fetch, git merge |
git pull --rebase |
相当于 git fetch, git rebase |
git log --graph |
查看分支合并图 |
git log --graph --pretty=oneline --abbrev-commit |
查看分支合并图 |
git blame --reverse a72873..6d0bda Add.java |
追溯代码两次提交间的变动记录 |
git rev-parse HEAD |
查看 HEAD 对应的 SHA-1 版本号 |
全局配置
一般是在用户 home 目录下,.gitconfig
文件。
[alias]
mm = merge --no-ff origin/master
s = status -sb
lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%ae>%Creset' --abbrev-commit
[user]
name = john
email = john@gmail.com
[core]
quotepath = false
[http]
sslVerify = false
postBuffer = 524288000
[init]
defaultBranch = master
[credential "https://xxx.git.com"]
provider = generic
- 推荐
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
使用规范
branch & flow 图示
阿里 AoneFlow
AoneFlow 只使用三种分支类型:master
分支、feature
分支、release
分支,以及三条基本规则。
- 规则一,开始工作前,从
master
创建feature
分支。
从代表最新已发布版本的 master
分支上创建一个通常以 feature/
前缀命名的特性分支,然后在这个分支上提交代码修改。也就是说,每个工作项(可以是一个人完成,或是多个人协作完成)对应一个特性分支,所有的修改都不允许直接提交到 master
分支。
- 规则二,通过合并
feature
分支,形成release
分支。
从 master
分支上拉出一条新分支,将所有本次要集成或发布的 feature
分支依次合并过去,从而得到 release
分支。release 分支通常以 release/
前缀命名。
- 规则三,发布到线上正式环境后,合并相应的
release
分支到master
分支,在master
分支上添加tag
,同时删除该release
分支关联的feature
分支。
为了避免在代码仓库里堆积大量历史上的 feature
分支,还应该清理掉已经上线部分 feature
分支。如果要回溯历史版本,只需在 master
分支上找到相应的版本的 tag
即可。
如果得修一个历史版本的Bug怎么办呢?那就老老实实地在 master 分支找到版本 tag 位置,然后从那个位置创建 Hotfix 分支并修改处理。
commit 规范
建议 commit 格式如下:
<type>(<scope>): <subject>
- type:说明 commit 的类别
- feat(feature)
- fix
- docs(documentation)
- style:格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:新增测试用例
- chore:构建过程或辅助工具的变动
- scope 说明影响范围
- view
- control
- dao
- 具体的业务层、范围
- subject 本次提交简短描述
git 仓库搭建
服务器端
- 安装相关组件
yum install bash-completion # 命令补齐
yum install git git-tools # 建议使用发行版自带的包管理工具安装最新版本 git
git --version
- 初始化 linux 账户
id git # 判断此用户是否存在
useradd git -b /home/git
passwd git
su git # 以 git 账户登录进行后续操作
cd /home/git
mkdir .ssh
touch .ssh/authorized_keys
# 确认权限
sudo chown -R git:git /home/git/.ssh/ # 确保 git 用户对版本库的权限
sudo chmod -R 700 /home/git/.ssh/
sudo chmod -R 600 /home/git/.ssh/authorized_keys
# 初始化 git 库
git init --bare test.git # 生成 test.git 文件夹,即版本库
- 文件权限设置
sudo chown -R git:git /home/git/.ssh/
sudo chmod -R 700 /home/git/.ssh/
sudo chmod -R 600 /home/git/.ssh/authorized_keys
- 修改 ssh 配置
sudo vim /etc/ssh/sshd_config
打开如下注释:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysCommand none
AuthorizedKeysCommandRunAs nobody
建议修改
/etc/passwd
文件禁用git
用户登录 shell.
/etc/rc.d/init.d/sshd restart
重启 sshd
服务。
- 导入客户端公钥
将客户端提供的公钥文件内容附加到 /home/git/.ssh/authorized_keys
文件中。
文件内容一行即为一个客户端公钥。
客户端
- 生成 RSA 证书
ssh-keygen -t rsa -b 4096 # 参考 `man ssh-keygen`
- 生成更安全的 ECDSA 证书
ssh-keygen -t ed25519 -b 4096
- 证书配置
sudo chmod 400 id_rsa # 保证证书权限正常
此处不再赘述服务器证书的生成过程。需要保证 id_rsa.pub
文件内容已存在于服务器的 authorized_keys
文件中。
- 证书密码操作
openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa_new # 生成无密码的私钥
ssh-keygen -p -f <file> # 修改私钥密码
- clone 到本地
git clone git@xxx.com:/home/git/test.git
git clone ssh://git@xxx.com:3721/home/git/test.git
-
在 clone 时提示输入密码
常见解决思路如下:
- server 端是否已配置证书公钥
- 确认 git 版本库的权限是否正常
- 确认客户端私钥是否有密码保护
常见问题
merge 冲突处理
git merge
合并时若有冲突回提示你 Unmerged paths
和 Untracked files
,并会提示类似格式的冲突文件列表:
/xxx/xx.properties~HEAD
/xxx/xx.properties~develop
解决方式如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< branch1
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> branch2
在执行了 git merge branch_name
之后,合并时有冲突的文件在打开后就出现类似的内容,其中可以看到 git
用 <<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
然后提交:git add xx.properties
,git commit -m "conflict fixed"
,这样冲突就解决了。
git log --graph --pretty=oneline --abbrev-commit
查看分支合并情况。
换行符问题
提交仓库时提示 warning: LF will be replaced by CRLF in xxx
环境描述:git 仓库位于 Linux 系统,开发时是在 windows 系统。
在 Windows 系统上,把 core.autocrlf
设置成 true
,则签出代码时,LF 会被转换成 CRLF,提交时自动地把 CRLF 转换成 LF:
git config --global core.autocrlf true # CRLF in your working directory and the repository has LF line endings.
git config --global core.autocrlf input # no output conversion is performed.
git config --global core.autocrlf false # If you’re a Windows programmer doing a Windows-only project
git-bash 修改
默认情况下, 安装好后的 git bash 会在标题和输入命令的时候显示 MINGW64
,而且命令和提示不在同一行。
可以修改 C:\Program Files\Git\etc\profile.d
文件进行自定义。