Git的常用命令
git branch –a 用来查看所有的分支 前面打*是指当前分支
git log(gitk) 查看发生了些什么
git checkout 在分支间切换
git add 管理索引文件
git commit 向前推进当前分支
git reset 撤销变更
git merge 合并两个本地分支
git diff (git status) 查看正在改动些什么
git clone 从上游来复制出本地仓库
git pull 取出更新并合并如当前分支
git gc 用垃圾回收去掉上次回退造成的残余物
git push 把分支提交到远程服务器
git fetch 取出更新但并不合到当前分支
git tag 查看所有的tag
git help 查看所有的git命令
删除已经提交的分支 git branch -d 分支名
0 安装
sudo apt-get install git-core curl
sudo apt-get install gitk
1
获得帮助可以使用类似man git-****的命令格式:
想获得关于commit命令的帮助,则man git-commit
想获得关于pull命令的帮助,则man git-pull
想获得关于merge命令的帮助,则man git-merge
以此类推
2
使用git之前,都要提交简单的个人信息,以便git区分不同的提交者身份。
#git config –global user.name “your name”
#git config –global user.email yourname@example.com
#git config --global core.editor emacs 可能会是 Vi 或者 Vim
#git config --global merge.tool vimdiff
3
想新开启一个项目,应该先建立一个目录,例如名为myproject,然后所有的项目开发内容都在此目录下进行。
#cd myproject
#git init
#git add .
#git commit //这个步骤会自动进入编辑状态,要求提交者输入有关本次提交的“开发信息”
至此,一个新项目就诞生了,第一个开发信息(开发日志)也随之诞生。
4
如果改进了项目源代码,并且到了开发者认为“应该再次记录开发信息”的时候,则提交“工作成果”。
#git commit -a //这是一个偷懒的命令,相当于git add .; git commit;
但是,此处有一点应该注意,那就是git commit -a无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文件夹,那么就要老老实实的先git add .,再git commit喽。[此处非常感谢freeren的提醒]
5
想检查到目前为止对源码都做了哪些修改(相对于本次工作刚开始之时):
#git diff //这个命令只在git add之前使用有效。如果已经add了,那么此命令输出为空
#git diff –cached //这个命令在git add之后在git commit之前有效。
#git status //这个命令在git commit之前有效,表示都有哪些文件发生了改动
6
想查看自项目开启到现在的所有开发日志
#git log
#git log -p //会输出非常详细的日志内容,包括了每次都做了哪些源码的修改
7
开启一个试验分支(experimental),如果分支开发成功则合并到主分支(master),否则放弃该试验分支。
#git branch experimental //创建一个试验分支,名称叫experimental
#git branch //显示当前都有哪些分支,其中标注*为当前所在分支
#git checkout experimental //转移到experimental分支
(省略数小时在此分支上的开发过程)…
如果分支开发成功:
#git commit -a //在experimental分支改进完代码之后用commit在此分支中进行提交
#git checkout master //转移回master分支
#git merge experimental //经证实分支开发成功,将exerimental分支合并到主分支
#git commit -a //彻底完成此次分支合并,即提交master分支
#git branch -d experimental //因为experimental分支已提交,所以可安全删除此分支
如果分支开发失败:
#git checkout master
#git branch -D experimental //由于分支被证明失败,因此使用-D来放弃并删除该分支
8
随时查看图形化分支信息。
#gitk
9
当合作伙伴bob希望改进我(rocrocket)的工作成果,则:
bob$git clone /home/rocrocket/project myrepo //此命令用于克隆我的工作到bob的myrepo目录下。请注意,此命令有可能会因为/home/rocrocket的目录权限问题而被拒绝,解决方法是chmod o+rx /home/rocrocket。
(省略bob数小时的开发过程)…
bob$git commit -a //bob提交自己的改进成果到自己的git仓库中,并口头告知我(rocrocket)他已经完成了工作。
我如果非常非常信任bob的开发能力:
$ cd /home/rocrocket/project
$ git pull /home/bob/myrepo //pull命令的意思是从远端git仓库中取出(git-fetch)修改的代码,然后合并(git-merge)到我(rocrocket)的项目中去。读者要记住一个小技巧,那就是“git pull .”命令,它和git merge的功能是一样的,以后完全可以用git pull .来代替git merge哦!请注意,git-pull命令有可能会因为/home/bob的目录权限问题而被拒绝,解决方法是chmod o+rx /home/bob。
如果我不是很信任bob的开发能力:
$ cd /home/rocrocket/project
$ git fetch /home/bob/myrepo master:bobworks //此命令意思是提取出bob修改的代码内容,然后放到我(rocrocket)工作目录下的bobworks分支中。之所以要放到分支中,而不是master中,就是要我先仔仔细细看看bob的开发成果,如果我觉得满意,我再merge到master中,如果不满意,我完全可以直接git branch -D掉。
$git whatchanged -p master..bobworks //用来查看bob都做了什么
$git checkout master //切换到master分区
$git pull . bobworks //如果我检查了bob的工作后很满意,就可以用pull来将bobworks分支合并到我的项目中了
$git branch -D bobworks //如果我检查了bob的工作后很不满意,就可以用-D来放弃这个分支就可以了
过了几天,bob如果想继续帮助我开发,他需要先同步一下我这几天的工作成果,只要在其当初clone的myrepo目录下执行git pull即可:
#git pull //不用加任何参数,因为当初clone的时候,git已经记住了我(rocrocket)的工作目录,它会直接找到我的目录来取。
repo
Repo概述只是google用Python脚本写的调用git的一个脚本,主要是用来下载、管理Android项目的软件仓库
repo的安装
首先在用户主目录下面创建一个文件夹bin,然后把该路径加入到环境path里面,具体方法如下:
编辑~/.bashrc, 在末尾加入一行:export PATH+=:~/bin/
然后启动终端,通过curl来下载Repo脚本,保存到~/bin/repo文件中,具体命令如下:
1 curl/wget http://android.git.kernel.org/repo >~/bin/repo
2 chmod a+x ~/bin/repo
源码下载
1初始化代码库:
Ap: repo init -u git://192.168.0.12/platform/manifest.git -b branchname –m manifest-android-internal.xml
BP: repo init -u git://192.168.0.12/platform/manifest.git -b branchname -m manifest-amss_internal.xml
2 下载或更新代码 repo sync
常用篇:
git commit -s提交信息中会存有Signed-off-by: <user.name> <user.email>信息
git commit -am
添加当前本地修改并写commit信息
如 git commit -am 'test'
git log --graph --oneline
简介显示git log,一行,树状图形。
git log -p
显示每个commit的diff信息
git log --stat [-num]
显示每个commit所修改的文件信息,显示最近num次
git tag <tag name>
在当前位置创建tag,加-m参数后可跟描述
git tag -d <tag name>
删除某tag
git tag -ln
显示当前的tag及描述列表
git push <remote> <tag>
推送本地tag至远端remote
git push <remote> :<tag>
删除远端tag
git diff --word-diff
逐词比较
git clone [--bare] [--mirror] repository directory[.git]
不带参数的时候就是将repository 克隆到本地成为工作区,版本库在.git目录下
--bare 是克隆到本地成为git裸版本库,可以对其进行推送(git push)
--mirror 是克隆到本地成为git版本库,对上游版本库进行了注册,所以在此版本库中可以执行git fetch操作进行持续更新
进阶篇:
git stash [sava <message>]将工作区修改暂存
git stash list
查看保存的进度
git stash pop <stash>
将git stash暂存的修改弹出
stash为git stash list的标号
git stash clear
删除所有存储的进度
git stash drop <stash>
删除一个保存的进度,默认是最新的那个
git rev-parse --show-toplevel
显示当前git仓储的绝对路径
git format-patch [-s] <since> <till>
将从since到till的commit转换成patch,-s代表需要签名。
cat *.patch | git am
应用git format-patch生成的patch
BUG篇:
git blame [-L <num>] <file>文件追溯,如果某个文件(哪行)导致了一个bug,可以通过这个命令快速查看这里是谁提交的,例:
git blame -L 6, +10 main.c 看main.c从第六行起后边10行的commit信息。
二分查找
git bisect start [BAD] [GOOD]
开始记录二分查找
git bisect good/bad
把某个commit标记为好/坏的版本
如果有标记错的情况:
git bisect log > logfile
git bisect reset
编辑logfile将错误的那条删除或#注释,然后
git bisect replay logfile
git bisect run [cmd]
bisect支持自动搜索,cmd可以是shell命令,shell脚本,其他脚本等等。如:
git bisect run make
git bisect run ~/test_case.sh
git bisect run sh -c 'make'
返回0代表good
返回125代表跳过
返回1~127(除125)代表bad
反悔篇:
git reflog show dev查看本地分支dev的提交记录,可用于恢复reset的内容
e875f66 dev@{0}: merge e875f66afec3177c69f420e5c23d78887676ae4a: Fast-forward
2923439 dev@{1}: merge 29234390a3b0a65be9c9e751914ecc0d0a175ba3: Fast-forward
bc51812 dev@{2}: merge bc51812ad4faf78421cb4ccff4b8bb9d1badab13: Fast-forward
git reset --hard dev@{2}
恢复到dev@{2}处,相当于反操作0 1的动作。
git commit --amend [-m <commit message>]
修改已经commit过的commit信息
git checkout [commit/branch/tag...] --path
将本地path文件回复至某个点时的状态,如 git checkout HEAD^ --README
git reset --soft HEAD^^
多步悔棋,恢复到最近两次提交之前,然后git commit。实现多次悔棋。
git commit -C [commit/branch/tag...]
提交的时候 commit信息用某个点的
git checkout master
git reset --hard HEAD@{1}
将master分支重置与最新的提交上
变基篇:
git rebase个人认为最难理解的一个命令,一度想要放弃理解,终于在实践后得到部分理解。故记录。
git rebase --onto <base> <since> <till>
首先会切换至base,相当于 git checkout base
然后cherry-pick since以上(不包括since)直到till(包括till)之间的所有commit
在原git树上的自上到下的结构应该是 till > since > base
执行命令后其实就相当于丢弃了base(不包含)到since(包含)之间的其他commit
如果till就是HEAD,则可省略HEAD,即: git rebase --onto base since
PS:since till也可以是别的线上的提交
git rebase -i <commit/tag/...>
交互式编辑,采用修改文件的方式自动变基。后接参数为“基”,修改配置文件的时候需要注意:
从上到下的顺序为最老提交到最新提交,与gitk qgit等顺序相反。
删除/跳过:删除那一行的commit信息
合并: 将自动的pick改为squash,则将与上一个老commit合并