Git
相关概念
Git 作为一款分布式版本控制系统,常被用来管理项目的版本更迭。
-
工作区:在你的计算机上能看到的目录。
-
暂存区:在 Git 的版本库中,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改,
git add .
之后存放的位置。 -
版本库:即本地仓库,是新建版本库时在工作区下生成的一个隐藏目录
.git
,通过ls -a
命令可以看到。git commit
之后存放的位置。 -
远程库:关联的远程仓库(github/gerrit)。
快速使用
安装并初始化
安装 git,配置基本信息,以及创建版本库
sudo apt-get install git
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git init
可以看到在当前目录下生成 .git 文件,以及名字邮箱配置成功
ls -a
git config user.name
git config user.email
添加修改文件到暂存区,并提交到版本库
git commit -am "<JIRA-num> module: short description" # 生成新节点
git commit --amend # 复用原有节点
在 title 和 change-ID 之间添加详细描述的 commit msg,如果需要描述的内容过多,在 JIRA 中说明
创建与合并分支
# 在 master 上 checkout
git checkout -b patch1
# 在 v5.0.x 上开发完成后,回到主分支合并当前分支
git checkout master
git merge patch1
git branch -d patch1
# 对于不需要合并的分支可以通过 git branch -D patch2 删除
始终保持 master 与远程 master 同步,每个 patch 在单独的分支上开发
查看提交历史
git log
# 查看最新提交的 log commit ID
git rev-parse --short HEAD
关联远程仓库
在 GitHub 上添加开发机上的公钥,这样可以免密 ssh push/pull/clone 代码

本地没有仓库,从远程 clone
# 推荐配置公钥使用
git clone git@github.com:your_github_name/your_hub.git
# 设置 http 许可,并通过 http 下载
git config --global http.sslVerify false
# 如果遇到 RPC failed, curl 18 transfer closed with outstanding read data remaining
# 增加 git 可允许传输的项目大小
git config --global http.postBuffer 1024288000
git clone http://github.com/your_github_name/your_hub.git
# 通过 https 下载,速度较慢
git clone https://github.com/your_github_name/your_hub.git
本地已有仓库,关联到远程仓库
git remote add <init_remote_name> git@github.com:your_github_name/your_hub.git
# 如果本地仓库非空
git pull <init_remote_name> master --allow-unrelated-histories
# 第一次推送 master 分支到远程需要加 -u 参数
git push -u <init_remote_name> master
通过以下命令查看配置
git remote -v
git remote remove <delete_remote_name>
比对版本
- 查看工作区和暂存区的代码版本区别:
git diff
- 查看工作区和版本库的代码版本区别:
git diff HEAD
- 查看工作区和远程库的代码版本区别:
git diff origin/master
- 查看版本库和远程库的代码版本区别:
git diff origin/master HEAD
回退版本
-
放弃工作区的修改:
git checkout .
-
放弃从工作区已经提交到版本库的修改:
git reset --hard HEAD^
-
放弃从工作区已经提交到远程库的修改:
git reset --hard <commitID>
-
git reset 的三种 mode 说明
- –mixed:仅 reset 暂存区,工作区还会有一份修改保留,这也是默认模式
- –hard:reset 暂存区和工作区,之前的修改不会有任何保留
- –soft:仅 reset 版本库,暂存区和工作区还会有一份修改保留
Gerrit 使用
把 Gerrit 看成一个带有更方便 review/comment 的 GitHub
# 远程仓库名必须是 gerrit
git remote add gerrit ssh://yiwu.cai@gerrit.smartx.com:29518/zbs
# 拉取远程分支版本
git checkout -b local-v4.0.x gerrit/v4.0.x
# 注意是在项目的主目录下提交
git commit --am "xxx"
# 确保 Change ID 前后一致在多次修改提交中都是一致的
git commit --amend
# 如果不指定,默认 push 到远程的 master 分支
git review v4.0.x
git review 实际上会 rebase 创建一个临时分支,当 git review 时跟远程有冲突
git review -t 5.x.x
# 这时提示有冲突,手动修改之后
git add .
git rebase --continue
git checkout -f dev_path
git commit --amend
git review
管理指定文件
在项目根目录下添加 .gitnore 文件,下面是一些.gitignore文件忽略的匹配规则:
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
下面给出一个 demo :
.ieda
.xml
out
gen
.gitignore 只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r –-cached . #把所有暂存区里的文件删了
git add .
git commit -m “refactor: update .gitignore”
小技巧
-
列出该文件每行的修改记录:
git blame filename
-
更新子模块:
git submodule update --init --recursive
常见场景
-
code reiew 期间开发其他 feature 时,先 checkout 到 master 并 git pull 远程最近的改动,在master 的基础上 checkout 出一个新分支。如果直接在上一个 dev branch 上 checkout 就会产生不必要的依赖关系,尽可能保证每一个 Change 的完整性以及独立性,且越小越好。
-
git stash 用以在当前 branch 修改了部分代码,没到 commit 的地步,这时要去看其他 branch 的代码情况,可以先 git stash 再 git checkout master,要回到 dev 时,git checkout dev、git stash pop。git stash 还有一个常见用法。如果发现在 1st dev branch 上修改的代码应该放在另一个 branch 上时,可以先 git stash,然后切换到 2nd dev branch 上 git stash pop,这时可能存在冲突,需要手动修改(有冲突的时候,stash里面还会暂存着改动)。并回到 1st dev branch 中通过 git checkout . 把还未 git add . 的代码删掉
-
push 代码到远程,发现相同部分代码已被他人更新,此时陷入合并中间状态,应对方法:
git merge --abort # 暂停 merge git reset --merge git pull # 解决冲突 git add . git commit --amend git push
-
git 合并远程多个 commit
# 合并这个commit之后的所有commit (不包括这个) git rebase -i <log-id> # 在窗口中修改,将除了第一个的 pick 保留,其他都改成 s,保存退出 # 这时 git log 发现本地的多个 commit 已经合并 # 强制 push 到远程,这样就能把远程的多个 commit 合并,这种情况适用于这个远程仓库就你一个人在维护 git push -f
CentOS 7 自编译 Git
CentOS 7 yum 中自带的 Git 版本过低,需要自行下载高版本 Git 源代码编译 Git
-
安装依赖、卸载旧版本
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc yum install gcc perl-ExtUtils-MakeMaker yum remove git
-
安装新版 git
cd /usr/local/src/ wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.23.0.tar.xz tar -xvf git-2.23.0.tar.xz rm -y git-2.23.0.tar.xz && cd git-2.23.0/ make prefix=/usr/local/git all make prefix=/usr/local/git install echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/profile source /etc/profile