Xiaoshier Blog

工作中 git 的使用

工作使用 git 和 gerrit, 记录一下操作, 为以后再次使用提供便利.

Gerrit详情

Gerrit,一种开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的代码,决定是否能够提交,退回或是继续修改。它使用版本控制系统,Git作为底层。

  1. 注册 添加邮件以及 ssh (需要git生成 ssh-dss)
    生成 ssh

    1
    2
    3
    $ ssh-keygen -t dsa //生成 ssh
    $ cat ~/.ssh/id_dsa.pub //获得 ssh, 将该 ssh 粘贴至 gerrit 中
    $ vi ~/.ssh/known_hosts //将 gerrit 中的该值, 粘贴至该文件中

    img12
    img13

  2. 获取代码库

    登录Gerrit后在Projects => List, 选择相应工程your_project,进入该工程的General界面。
    选中“clone with commit-msg hook”和“SSH”:
    由管理员提供这个 clone 地址
    git clone 克隆至 master, 创建一个 dev 分支, 通过下面的两个命令, 创建分支

    1
    2
    $ git clone url //clone 远程代码
    $ git checkout -b dev //创建分支并切换至 dev 分支
  3. git本地设置
    本地的 git 用户名登录和邮箱需要和 gerrit 的一致, 不然在 push 时会出现问题.
    git 有全局配置文件, 本地配置文件, 可以在项目下修改本地配置文件

    配置本地用户名和邮箱

    1
    2
    3
    $ git config -l  查看 git 配置文件
    $ git config user.name "name" 修改本地用户名
    $ git config user.email "XXX@XXX.com" 修改本地邮箱
  4. 设置默认 push
    当执行push命令时,需要将代码我们需要push到refs/for/dev 那条线上
    编辑本地 git config 文件

    1
    $ vim .git/config

    在 [remote “origin”] 中添加这一行添加如下内容

    1
    push = +refs/heads/*:refs/for/*

    也可以通过如下方法设置( 使用该命令报错了, 所以我是手动添加的):

    1
    $ git config origin.remote.push refs/heads/*:refs/for/*

    这样,push代码时,可以直接使用git push origin branch名称将代码提交到gerrit

    1
    $ git push origin dev  //push 代码

    如果不设置,需要使用如下方式来提交到远程dev分支

    1
    $ git push origin HEAD:refs/for/dev
  5. 提交代码后添加审核人员以及提交后的状态
    img16
    img17
    img18

  6. 在获取代码前, 保证本地代码与远程的版本一致
    在工作中, 在版本不一致时, 导致了无法入库的问题. 现在仔细想一下, 版本不一致就提交, 会造成提交的混乱, 版本号的混乱, 当然不允许如此操作.
    在版本号不一致时, 提交了, 解决步骤:

    1. 要取消提交
    2. 将本地版本回退至你提交的几个版本的前一版本(如你提交了好几次, 要回退至于远程仓库一致的版本)
    3. 然后再拉一下代码, 保证最新版本与远程一致
    4. 再次提交
      1
      2
      3
      4
      5
      $ git reset commit_id
      $ git status //发现刚提交的内容全部又在工作区
      $ git pull origin dev //再次拉下代码
      $ git add
      $ git commit -m "some message"

git 一些用法

master 分支创建feature-A 分支和 feature-B分支, 并合并
在分支操作时, 没弄明白工作区, 缓存区, 仓库的概念, 就在分支切换时修改代码, 然后直接切分支, 就发现分支之间代码都一样, 整了好半天也不知道什么原因, 这就促使我从头再学习一遍 git, 看了廖雪峰老师的 git教程 , 非常浅显易懂
下面就把常用操作记录一下

  1. 创建 feature-A 分支, 并处于 feature-A 分支下

    1
    $ git checkout -b feature-A
  2. 使用 git branch 查看分支一览表

    1
    2
    3
    $ git branch
    * feature-A //*表示当前所处分支
    master
  3. 在 feature-A 分支下修改READEME.md 文件, 并添加 commit 快照, 即存到仓库中

    1
    2
    3
    4
    5
    6
    $ git add READEME. md
    $ git commit -m "add feature-A"

    //与上一次提交合并在一起, 会生成新的 commitId, git log 中只显示最新的 commitId, 且只有一条提交 log;
    //也可以使用 git commit --amend 会出现使用 vi 打开的文件, 在里面进行 message 的编辑, 但是我一直没有成功过(先记录一下)
    $ git commit --amend -m "message"
  4. 再切回master分支, 查看README.md没有发生变化
    (如果不进行3操作, 直接切换到 master 分支, feature-A的内容也会到 master 分支, 原因是工作区内容没有分支区分, 工作区只有一个, 所有分支公用的一个)

    1
    $ git checkout master
  5. 合并分支

    1
    2
    $ git merge --no-ff feature-A
    $ git add conflictFile //解决完冲突后, 要 git add 一下冲突文件, 才可以再次进行 git pull/checkout 等等操作
  6. 查看提交日志(git commit -m “日志内容”)

    1
    $ git log -1 //查看日志个数
  7. 以图表的形式查看分支

    1
    $ git log -graph
  8. 回溯至 feature-A 某一版本, 创建分支feature-B

    1
    $ git reset --hard 9104c361a2e6531fed0ca606a52ade5cbfc0d354

    创建分支 feature-B

    1
    $ git checkout -b feature-B
  9. 在 feature-B 分支下修改READEME.md 文件并保历史记录, 添加至本地仓库

    1
    2
    $ git add README. md
    $ git commit -m "branch feature-B"
  10. 将 featur-B 分支内容回退到 feature-A 分支 并合并分支

    1
    2
    3
    4
    $ git reflog

    $ git reset --hard 9104c36
    $ git merge --no-ff feature-B

    解决冲突后执行, git add , git commit

  11. 删除分支

    1
    2
    $ git branch -d feature-A 该分支已合并
    $ git branch -D feature-A 该分支未合并
  12. 删除 git 仓库中的文件

    1
    2
    3
    $ git rm --cached [filename] || git rm -r --cached [directory]
    $ git commit -m 'remove useless files'
    $ git push -u origin
  13. 丢弃工作区修改
    工作区修改内容, 想放弃修改, 回退至修改前. 有两个状态, 回退至已添加到缓存区或仓库的版本

    1
    $ git checkout -- file
  14. 回滚已提交的版本

    1
    2
    $ git reset --hard commit_id //回滚至 commit_id 版本
    $ git reset --hard HEAD~n //回滚至上 n 版本, n 是数字
  15. 清除缓存区内容, 重新放回工作区

    1
    $ git reset HEAD file
  16. 删除文件
    从版本库删除文件

    1
    2
    $ git rm file //删除工作区文件, 并添加至缓存区
    $ git commit -m "delete some file"

    找回删除文件

    1
    2
    3
    $ git reset HEAD file //清除缓存信息
    $ git checkout -- file //找回删除文件(未提交至版本库)
    $ git reset --hard HEAD^ //已经提交至仓库的, 只能通过 reset 回退(已提交至版本库)

    或 本地手动删除

    1
    2
    $ rm file //删除工作区文件(1)
    $ git commit -a -m "commit log" //添加至缓存区, 并提交至版本库(2)

    删错了, 版本区有该文件, 将工作区内容回滚至与版本区内容一致

    1
    2
    $ git checkout -- file //只执行了(1)
    $ git reset --hard HEAD^ //执行了(2)即已经提交至仓库的,只能通过 reset 回退(已提交至版本库)