git常用命令总结

0. 基本感念

git是一个分布式版本管理系统。有几个重要的名词

Git 仓库目录 是 Git 用来保存项目的元数据和对象数据库的地方。

暂存区域 是一个文件,保存了下次将提交的文件列表信息, git add 就是把文件加到暂存区域。

工作目录 是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件, 放在磁盘上供你使用或修改。

版本号: 每提交一次产生一个版本号,用四十个十六进制字符来表示。取值范围 为0-9, a-f字符, 例如: 04f588017ac7d0e9e5e6c6678b2e564d0b1f408a, Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。

文件根据在不在版本库中分为两种情况,已跟踪和未跟踪, 已跟踪文件是指被纳入 了版本控制的文件。

Git中已跟踪的文件有三种状态,你的文件可能处于其中之一:已提交(committed)、 已修改(modified)和已暂存(staged)。

  • 已提交表示数据已经安全的保存在本地数据库中。

  • 已修改表示修改了文件,但还没保存到数据库中。

  • 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

分支(branch): 功能分支或产品分支,如果需要同时开发多个版本就需要创建分支。

标签(tag): 就是一个让人容易记住的有意义的名字, 通常每隔一段时间会创建标签 或者每一个阶段成果创建一个标签。

1. 下载及更新代码

git clone [url] 例如下载openwrt的代码

git clone https://git.openwrt.org/openwrt/openwrt.git

git fetch //把远程库的代码更新到本地库

git pull 更新代码,最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支

2. 设置账号及日志编辑器

设置用户账号信息:

$ git config --global user.email "zhangyz@xxx.com"
$ git config --global user.name "Yongzhi Zhang"

设置默认的注释文本编辑器:

$ git config --global core.editor vim

保存在~/.gitconfig文件中,–global表示全局设置,每一个git仓库都会使用, 例如我这里文件内容如下:

cat ~/.gitconfig
[user]
    email = zhangyz@xxx.com
    name = Yongzhi Zhang
[core]
    editor = vim

邮件地址请更换为自己的真实邮件地址

3. 提交代码(提交到本地库)

git status 查看本地文件状态

git add . //把本地的修改加到临时暂存空间stage中

删除 git rm libiw -r

git commit -m ‘comments’ //把stage中的修改提交到本地库

git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交, 从而跳过 git add 步骤。

git rm –cached 从暂存区删除。

git reset 它只会修改暂存区域

git add a.cpp //把本地的修改的a.cpp文件加到暂存区域(stage)中

git commit -m ‘自己的注释’ //把暂存区域(stage)中的修改提交到本地库, 如果本地还有修改,并不会提交。

4. 提交到远端

git push //把本地库的修改提交到远程库中

4.1, 从中心仓库更新代码

git pull

git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

4.2 查看远程仓库

git remote -v

4.3 添加远程仓库

git remote add <shortname> <url>

4.4 从远程仓库拉取

git fetch [remote-name]

5. 查看历史

git log 会按提交时间列出所有的更新,最近的更新排在最上面 -p,用来显示每次提交的内容差异 –oneline 一行显示

6. 比较两个版本之间的差异

比较两个版本之间的差异:

git diff 版本号1 版本号2   src

采用统一格式来显示两个版本之间的差异

git diff 工作目录代码和暂存区域代码代码的差异。

git diff –cached 工作目录中当前文件和暂存区域快照之间的差异

git diff –staged 暂存区和版本库异。

7. 查看状态

git status git status -s

8. 标签管理

  1. git tag 列出所有标签

  2. 创建标签

    git tag -a <tagname> [-m <commit msg>] [<commit> | <object>]
    git tag -a 0.5.0 -m 'first version'
    
  3. 推送标签

    git push origin [tag name]
    git push origin 0.5.0
    
  4. 检出标签代码

    git checkout -b [branchname] [tagname]

切换分支或恢复工作拷贝,会丢失本地修改。检出标签代码,同时会创建分支, 注意不要在这里修改提交。例如:

$ git checkout -b version5 0.5.0

9. 分支管理

  1. 创建分支, 可以基于标签来创建分支。

::

git branch DEC [tag] git push origin DEC

  1. 切换分支 git checkout DEC

    修改代码并提交

  2. 提交分支到远程 git push origin DEC

  3. 同步主干代码, git merge master –squash

e)合并分支

git merge origin/DEC –squash

  1. 创建分支并推送该分支, 需要使用–set-upstream来设置远程分支。

    git branch bleGW
    git push origin bleGW
    
    git branch daliGW
    git push origin daliGW
    git checkout daliGW
    git push --set-upstream origin daliGW
    
  2. 合并某次提交代码到当前分支,然后推送到远程服务器仓库中

git cherry-pick commit-id1
git push
  1. 设置跟踪上游分支

    git branch –set-upstream-to=origin/MIFI7628 MIFI7628

10. 查看及修改远程仓库

git remote -v

如果需要修改远程仓库指向,例如我们已经将开源的仓库clone到公司的库,那我们通过修改配置即可修改。

git config -e

然后修改url指向,保存退出即可。

另外如果服务器进行了搬迁,IP地址发生了更改,也会修改远程仓库地址 可以直接使用git remote命令修改:

git remote set-url origin [url]

11. 撤销某次提交

git revert 306c6a33ae285abf2a2ac72e728b1198ca632270 git push

12. git修改日志

当注释写的不正确时,使用该命令来修改最后一次提交的注释信息:

git commit --amend

13. 导出代码

如果需要备份代码,则通常备份指定标签的代码,例如导出1.0标签的代码,并压缩为tar.gz格式:

git archive --format=tar 1.0 | gzip > v1.0.tar.gz

14. 清除工作目录中不受git控制的文件

git clean -d -x -f

  • -d

    除去未跟踪文件之外的未跟踪目录。

  • -f, –force 强制删除

  • -x

    不使用标准忽略规则,即不读取.gitignore,将忽略跟踪的文件也删除。

15. 管理vendor分支

例如我们都是基于OpenWrt代码开发,开始时基于OpenWrt18.06.1进行开发,后续开源社区进行升级, 我们就需要进行升级,但我们专有代码不像开源社区提交,因此创建一个分支来跟踪开源社区的进展情况。

这种也适合跟踪硬件厂家的代码,都是基于同一基础代码进行开发,我们需要合并硬件厂家代码, 因此同时也创建一个硬件分支。

首先我们将OpenWrt18.06.1创建一个标签。

创建跟踪OpenWrt上游分支, 我们是基于OpenWrt18.06.1开发的。

git branch vendor_OpenWrt OpenWrt18.06.1

创建跟踪上游硬件厂商分支,假定我们上游厂家是联发科,联发科也是基于OpenWrt18.06.1版本做的硬件适配。

git branch vendor_mtk OpenWrt18.06.1

我们自己的代码提交在自己的主干上,经过一段时间开发后,很多代码进行了修改。同一时间开源社区代码 升级到OpenWrt18.06.2,修正了很多Bug,因此我们需要将开源社区的代码合并过来。这是我们就可以将OpenWrt18.06.2 提交在vendor_OpenWrt分支上,然后再用git merge命令合并到我们自己的开发主干。

同理vendor_mtk也可以将mtk的代码提交在该分支,然后使用git merge合并到主干,如果遇到冲突解决冲突。 类似以下情况,上游在分支上进行开发,开发完成后合并到主干。 我们可以拿到联发科的代码,删除本地工作拷贝的目录, 然后将联发科代码提交在分支上。这样可以发现删除、修改和增加的文件。如果仅仅是覆盖,无法发现删除和移动 的文件。

/------------\
---------------------
\---------/

16. 创建镜像

我们访问github比较慢,如果团队有很多人要下载github代码,那都会需要很长的时间。

如果我们在某台机器上下载,然后其他人都用这个镜像,那就会大大提高效率。

创建镜像方法,首先进入到工作目录, 然后使用git clone并指定mirror参数创建git镜像

cd /home/zhang
git clone --mirror https://github.com/contiv/vpp.git

下载成功后,我们可以按以下方法使用。

git clone zhang@10.137.22.189:/home/zhang/vpp.git

zhang为服务器的登录用户名,然后输入密码。