Git全家桶及其常用命令

Android使用Git作为代码管理工具,并开发了Gerrit进行代码审核以便更好的对代码进行集中式管理,还开发了Repo命令行工具(Repo是谷歌用Python脚本写的调用git的一个脚本),对Git部分命令封装,将百多个Git库有效的进行组织。

继Gerrit之后,广泛使用的GitLab是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。具有wiki和issue跟踪功能。安装方法参考GitLab在GitHub上的Wiki页面。

序号操作场景操作时机GIT + Gerrit(or Gitlab)
(git:代码管理工具;gerrit/gitlab: 代码审核管理工具)
Repo
(repo: 封装git的命令行工具;)
命令说明命令说明
一、基本操作:增、删、改、查    
1.1环境配置配置公钥ssh-keygen -t rsa -C "myemail@email.com" 生成rsa类型的非对称密钥,并添加一个comments。ssh key 一般在
~/.ssh/id_rsa.pub 文件内。
  
 配置用户名git config --global user.name "shaoyoushi"   
  配置邮件git config --global user.email "shaoyoushi@gmail.com"   
  修改manifest仓库分支信息修改.repo/manifests下真正的manifest文件***.xml 表面上调用的.repo/manifest.xml其实是个链接,查看实际链到的.xml后,修改该具体的.xml即可。  
1.2本地建仓,初始化新建并初始化空仓git init进入新建的本地工作目录后,下载git或repo工具并初始化,会在本地生成.git或.repo(内含仓库信息),类似SVN上的.svn。repo init初始化git仓库,如“repo init -u git://172.16.1.11/manifest.git -b 分支名称 -m wanglei.xml”
1.3拉代码获取库上代码git clone 中心库地址
例如:git clone ssh://git@gitlab.hw.com:2222/myname/soundeffectehb.git
克隆中心库到本地,不指定本地库名则克隆到本地的库名默认和中心库一致。
关于中心库的地址,Git 支持许多数据传输协议。可以使用git:// 协议、 http(s):// 或者 user@server:/path.git 表示的 SSH 传输协议。
更新所有工程代码:
repo sync(sync之前先repo init,下载repo并克隆manifest仓)
如果版本库尚不存在,则执行repo sync 命令相当于执行git clone;如果项目版本库已经存在,则相当于执行下面的两条指令:
git remote update
(相当于对每一个remote源执行了fetch操作)
git rebase origin/branch
(针对当前分支的跟踪分支执行rebase操作。)
 git fetch 远端库名称
例如:git fetch kirin
获取远端库的更新到本地库(但不更新工作拷贝)。  
 git fetch 远端库名称
git checkout origin/master -- path/to/file
先从远端库更新到本地库,然后从本地库更新单个文件到本地拷贝。  
 更新指定工程代码:
git pull <中心库地址> <远端库分支>:<本地分支>

如:git pull k br_trunk_bsp:HEAD(或本地的分支名)   (注意,这样会再本地生成一个HEAD的分支,手动删掉即可)
取回远程主机某个分支的更新,再与本地的指定分支合并(相当于先做git fetch,再做git merge)。如果是本地当前分支合并,则冒号后的部分都可以不输入。repo forall -c git checkout -b  本地分支名称(自定义)  中心库分支名称实际是一个迭代器操作。
1.4建分支创建本地分支git branch 新分支名注:若在分支名后加上commitID则表示是基于该commitID拉出的新分支。创建本地分支:
repo start 分支名 --all
创建分支。repo start实际是对git checkout –b 命令的封装。为指定的项目或所有项目(若使用—all参数),以清单文件中为设定的分支,创建特性分支。
 切换到某个已存在的工作分支git checkout 分支名 repo checkout <branchname>  [<project>…]切换分支。实际上是对git checkout 命令的封装,但不能带-b参数,所以不能用此命令来创建特性分支。
 创建并且切换到本地分支git checkout -b local_branch   
 删除本地分支git branch -d  分支名注:”-d”只删除已合并到其他分支的部分。删除分支前会检查分支中的内容是否都已经合并到其他分支,如果没有,则命令不执行;”。repo prune [<project>…]实际上是对git branch –d命令的封装,该命令用于扫面项目的各个分支,并删除已经合并的分支。
 git branch -D 分支名注:”-D”不进行检查,直接删除分支。删除本地分支:
repo abandon <branchname> [<project>…]
实际上是对git branch –D 命令的封装。
 创建远程分支步骤一:
创建本地分支,并切换到新建的本地分支工作
步骤二:
git push  远程版本库名 本地分支名
   
 删除远程分支git remote rm 远端库目标 repo remote rm 远端库目标删除远端库上的指定目标。Repo remote命令用于设置远端库,类似的还有“repo remote add 目标 远端库URL”
 分支合并场景1:直接合并"分支1"到"分支2":
步骤一:切换工作空间到"分支2"
git checkout "分支2"
步骤二:合并
"git merge ""分支1""

场景2:挑选合并某次commit到当前分支:
步骤一:切换到目标分支
步骤二:git cherry-pick commitID"
  
 重命名分支git branch -m oldbranch newbranch注:此操作是将“oldbranch”分支的名称改成“newbranch”。如果需要拉出分支,并同时切换到新分支可以用“git checkout –b oldbranch newbranch”  
1.5修改代码添加单个文件的修改git add 文件名添加某个文件repo stage -i [<project>…]把文件添加到index表中。实际是对git add --interactive命令的封装、用于挑选各个项目工作区中的改动以加入暂存区。
  添加整个目录的修改git add .  添加当前目录  
  提交到本地库git commit -m "新的提交信息" --amend此操作将所有缓存区的修改提交到本地版本库,同时可添加comments注释。
注:此操作只能修改最新的一次提交,之前的提交无法修改。
同git 
  修改最近一次提交的注释git commit --amend注意:必须是最近提交,还没有push并且merged的注释。  
  新建标签git tag -a 标签 -m 标签信息用 -a (译注:取 annotated 的首字母)指定标签名字,而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。另外,还可通过其他命令参数添加标签签署信息,便于校验。tag 
  为指定提交增加taggit tag tag_name a_commit_id 对当前分支的指定提交打一个tag  
  删除taggit tag -d a_tag_name   
  跟踪(add)时忽略某些文件在工作目录下新建一个名为.gitignore的文件,然后在里面规定忽略那些文件  
  删除文件git rm 文件名删除文件并将删除的信息转移至缓存区,要想删除库上的文件需要执行commit操作,同样使用git reset 恢复删除文件。同git 
  重命名文件或目录git mv 原文件名 新文件名重命名或者移动本地文件或目录,mv后直接到缓存区,需要执行commit操作。  
  新增修改至本地缓存(暂存区)git stash保存工作区现场,并将工作区置为clean状态。每次保存,最新的stash都被命名为stash@{0},而之前的保存的stash的命名都会加1,也就是说stash的保存类似于stack,是FILO的。
注:此操作是将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修改,运行“git stash pop ”即可,如果要恢复指定的stash修改则用git stash pop stash@{1} // 从指定的一个stash恢复,并删除该stash。
  
  保存至暂存区时添加说明git stash save "message"  保存一个stash,并附加一条说明消息到这个stash上,方便后面的查看  
1.6提交提交代码到中心库git push <远端库名称> <本地分支名(或HEAD)>:<远端分支名>
例如:git push ssh://git@gitlab.hw.com:2222/myname/soundeffectehb.git HEAD:master
注1:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可省略。
注2:gerrit不允许直接将本地修改同步到远程仓库。客户机必须先push到远程仓库的refs/for/*分支上,等待审核。这也是为什么我们需要使用gerrit的原因。gerrit本身就是个代码审核工具。因此需要使用以下命令提交:git push k(or origin) HEAD:refs/for/br_develop_20190817
repo upload

注解:
我们产品代码通过gerrit和repo禁用掉了直接用git push来上库
只能通过repo  upload  project_name 把修改上传到 “伪库”,必须经过代码review才可以真正”漂白”上库,共享给主线.
repo upload相当于git push,但是又有很大的不同。它不是将版本库改动推送到克隆时的远程服务器,而是推送到代码审核服务器(Gerrit软件架设)的特殊引用上,使用SSH协议。代码审核服务器会对推送的提交进行特殊处理,将新的提交显示为一个待审核的修改集,并进入代码审查流程,只有当审核通过后,才会合并到官方正式的版本库中。
git push  将本地当前分支推送到相关联的远程仓库中去。需要通过以下操作预先关联一个远程库:
在本地添加远程库
git remote add name url    // 在本地添加关联一个远程仓库
git remote add origin git@github.com:shaoyoushi/hello-world.git    // 在本地添加关联一个远程库,命名为origin(习惯),采用的是ssh协议进行传输
git remote add abc https://github.com:shaoyoushi/hello-world.git        // 在本地添加关联一个远程库,命名为abc,采用的是https协议进行传输
  
推送tag到远程仓库git push origina_tag_name(推送一个指定的tag到远程仓库origin)
git push origin --tags(推送所有未推送的tags到远程仓库origin)
 创建tag
repo forall -c 'git tag -a tag_name -m "创建tag的原因和描述" '
repo forall -c ' git push origin tag_name '

删除tag
repo forall -c 'git tag -d tag_name'

回退代码到某个tag(只读)
repo forall -c ' git checkout  tag_name '

回退代码到某个tag(可写)
repo forall -c 'git checkout -b new_branch_name tag_name'
 
把另一个分支的修改合并到当前分支git checkout mywork
git rebase origin
这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。参考:https://blog.youkuaiyun.com/hudashi/article/details/7664631/  

 

1.7查看库配置信息查看manifest内容  repo manifest –o xml文件显示manifest文件内容。
 查看git版本号git version显示git版本号。repo version显示repo版本号。
 查看单个git配置信息例如:git config user.name显示user.name的配置信息。  
 查看git配置列表信息git config --list有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如 /etc/gitconfig和~/.gitconfig),不过最终 Git 实际采用的是最后一个。  
查看分支信息查看分支git branch (或直接查看.git/HEAD中的内容,即为当前HEAD指针所指向的内容)查看git库中的所有分支,后面加参数“-r”则可显示git库中对应的远程分支参照。repo branches 
 查看指定分支信息git show a_branch   
 查看对应的远程分支git branch -r   
 查看本地关联的远程仓库git remote      // 查看远程仓库的名称
git remote -v  // 查看远程参考的名称和对应的url
   
 更新绑定的远端库路径git remote set-url 远端库名称 远端库新地址
例如:git remote set-url gitlab ssh://git@gitlab.hw.com:2222/ics/icsv1/audiosoundeffects/audiocontrol.git
当远端库地址更新时通过该操作重新绑定,否则会push失败。  
 查看分支合并记录git branch --merged查看已经合并到当前分支的所有分支。  
 git branch --no-merged查看还没有合并到当前分支的所有分支。  
查看修改提交信息查看当前仓下文件状态git status修改完之后,查看本地库中所有文件的状态,包括未受控的,已修改,已缓存。冲突文件的状态也表现为已修改的。repo status (可选加参数:文件,目录,分支)
 查看loggit log --all    (查看全部详细的log信息)
git log --pretty=oneline //查看当前分支的提交历史 里面包含 commit id    (查看全部log概要列表)
查看日志同git 
 统计所有提交者各自的代码行数git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --since ==2019-11-01 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done   
 查看命令历史git reflog   
 查看所有的stashgit stash list   
 查看指定提交信息git show a_commit_id   
 显示图形化的git日志树gitk --all  
查看标签信息查看所有tag标签git tag列出所有已有的标签。也可按照正则表达式列出指定的部分标签。  
 查看指定tag信息git show 已知标签可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。  
 分享标签git push 中心库 --tags默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。--tags可一次把所有本地新增标签都推送上去。  

 

1.8恢复清除未跟踪(未add)文件git checkout -- filename或git checkout .恢复工作区文件(如果暂存区有文件就从暂存区恢复,否则从仓库恢复)  
 清除所有未跟踪(未add)文件git clean -dxf清除所有未跟踪文件,包括纳入.gitignore中的文件。  
 撤销已修改(已add)文件git reset HEAD <文件路径>    
 恢复本地工作区内容(相对于本地版本库):已经修改,且已经add,未commit,回退整套代码到最近一次提后的状态
git reset --hard HEAD(or commitID)
注:该操作将回退本地所有文件到当前最新提交节点(或某个提交点),包括本地内容。
参数 --hard 表示删除自该次提交后所有的修改记录(未跟踪文件除外),如果需要保留目前的修改,则使用--soft参数。  
 回退至最近几次提交状态git reset –hard HEAD ^ (^表示回到上一个版本,如果需要回退到上上个版本的话,将HEAD^改成HEAD^^)(hard选项,表示彻底将工作区、暂存区和版本库记录恢复到指定的版本库)   
 回退某次提交git revert commitID注:此操作将回退某次提交,并作为一次新的提交到库中。  
1.9比较比较内容区别git diff OldCommitID NewCommit ID(前6位)比较文件/目录下所有文件修改前后的不同。
注:新添加的文件使用git diff的时候不能显示。
repo diff 目标1 目标2repo diff实际是对git diff 命令的封装,用于分别显示各个项目工作区下的文件差异。只看着两个目标的区别。
 git diff比较本地的与缓存的区别repo diff 查看所有项目的区别。
 git diff --cached比较缓存的与本地库中的区别
同git
 
 git diff commitID1 commitID2 --文件名对比该文件在特定commit之间的区别同git 
 git diff [filename]查看文件变化  
1.10构建发起构建时- repo build CommitID branch构建通过就可以正式合入到中心库了。
1.11查看帮助查看帮助文档git help repo help 
 查看某个命令的帮助文档git CMD -help (CMD为add、log等实际命令) repo CMD -help (CMD为sync、diff等实际命令) 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值