git相关整理

2017-05-05 tool

本文包括 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 图示

git merge --no-ff

git branch mode

阿里 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 pathsUntracked 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.propertiesgit 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 文件进行自定义。

Search

    Post Directory