git 日常操作指令

使用Windows的童鞋要特别注意:

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:

set-utf8-notepad++

下图:

WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间

Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。

Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。

1 创建新的分支:

$ git branch experimental

2 查看分支,前面带“*”的分支表示当前所在的分支。

$ git branch
experimental
* master

3 切换分支:


$ git checkout experimental

1,3两步可以合并为一个命令:

git checkout -b experimental

git checkout -b [分支名] [远程名]/[分支名]。(本地建立与远程分支名 跟踪分支)

git checkout -b dev  origin/dev 建立一个新的本地分支dev
git checkout --track  origin/dev建立一个新的本地分支dev
----------------------------------------------------------------------------------------------------------
图例解释:http://blog.csdn.net/hudashi/article/details/7664631/
假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。


git checkout -b mywork origin

一段时,由于你未经常更新代码,现需将本地代码与远程分支同步更新到最新版本

git rebase origin

git rebase 用于把一个分支的修改合并到当前分支

----------------------------------------------------------------------------------------------------------

git fetch 和  git pull的区别


1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin master:tmp
git diff tmp 
git merge tmp
从远程获取最新的版本到本地的test分支上 之后再进行比较合并
2. git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
------------------------------------------------------------------------------------------------------------------------------------

git merge 与 git rebase的区别

原文地址图例解释:http://blog.csdn.net/wh_19910525/article/details/7554489

git merge b    # 将b分支合并到当前分支

同样 git rebase b,也是把 b分支合并到当前分支

在使用git merge与git brease合并时,有可能会发生冲突,解决冲突时,两种合并方式的不同
使用merge命令合并分支,解决完冲突,执行git add .和git commit -m'fix conflict'。这个时候会产生一个commit。
使用rebase命令合并分支,解决完冲突,执行git add .和git rebase --continue,不会产生额外的commit。这样的好处是,‘干净’,分支上不会有无意义的解决分支的commit;坏处,如果合并的分支中存在多个commit,需要重复处理多次冲突。

------------------------------------------------------------------------------------------------------------------------------------

git log --online

--oneline标记将每个commit压缩成一行. 默认情况下显示一个commit ID和commit描述的第一行 

git log --decorat  功能差不多的其它命i令(git  branch -av

如果当前本地分支命令非常不规范,分不清本地分支是对应哪个过程分支时,可用此命令查看,当前所处的本地分支对应哪个远程分支,

同样git branch -vv 命令也可以查看当前本地分支与远程分支的关联对应关系

git log --author="xxxx"

查看XXX用户的所有提交

git log --grep="BugID“”

按commit描述,搜索commit中的描述的字符串,如果工程师在提交commit时,对提交有对应描述,可按下方法搜索对应的修改

查看某一个文件的修改记录,如SystemUI.java:

git log -- SystemUI.java 

查看每次的修改内容:

git log -- stat 或是git log -p

Git中从远程的分支获取最新的版本到本地有这样(将远程的的所有分支拉到本地)

git fetch (远程主机名)

git revert   是生成一个新的提交来撤销某次提交,此次提交之前的commit都会被保留

git reset    是回到某次提交,提交及之前的commit都会被保留,但是此次之后的修改都会被退回到暂存区

------------------------------------------------------------------------------------------------

git merge

git merge的基本用法为把一个分支或或某个commit的修改合并到现在的分支上。

# 切换到Master分支
  git checkout master
# 对Develop分支进行合并到当前分支master
  git merge --no-ff develop

git merge 和 git merge --no-ff的区别
1、我自己尝试merge命令后,发现:merge时并没有产生一个commit。不是说merge时会产生一个merge commit吗?
注意:只有在冲突的时候,解决完冲突才会自动产生一个commit。
如果想在没有冲突的情况下也自动生成一个commit,记录此次合并就可以用:git merge --no-ff命令,下面用一张图来表示两者的区别:

2、如果不加 --no-ff 则被合并的分支之前的commit都会被抹去,只会保留一个解决冲突后的 merge commit。

-----------------------------------------------------------------------------------------------------------------------------------------

git apply  应用补丁

git push oright HEAD:refs/for/branchname;    推送代码, origin为你当前的远程库名

有时候用 git commit -m 提交时,可能没写好或者误操作导致提交的信息不合适,但你还没有 push 到远程分支时,

可以使用 git commit --amend 修改上一次的提交信息。

-------------------------------------------------------------------------------------------------

【git 删除本地分支】
git branch -d branchname 或是git branch -D branchname

这里使用‘-d’表示在分支合并到主线上后删除。如果使用‘-D’表示不管是否合并直接删除分支

【git 删除远程分支】
git push origin :br  (origin 后面有空格)

【创建远程分支】

可以这样,分两步走
创建分支        $ git branch 分支名
推送到远程    $ git push origin 分支名

 

【查看当前的远程库】

git remote -v    -v 选项(译注:此为—verbose 的简写,取首字母),显示对应的克隆地址

origin git://github.com/schacon/ticgit.git

【添加建远程库】

git remote add repositoryname giturl

【重命名远程库】

git remote rename 命令修改某个远程仓库在本地的简称,比如想把 pb 改成paul,可以这么运行
git remote rename beforerepositoryname  afterrepositoryname 

【删除远程库】

git remote rm reposttory

-----------------------------------------------------------------------------------------

git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id
【本地代码库回滚】:
git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除
git reset --hard HEAD~3:将最近3次的提交回滚

git reset --head HEAD^回滚至前第一次提交

git reset --head HEAD^^回滚至前第二次提交

---------------------------------------------------------------------------------

git pull --rebase,

我们在使用git pull命令的时候,可以使用--rebase参数,即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上

两者的区别可以用下面的关系式来表示:
git pull = git fetch + git merge
git pull --rebase = git fetch + git rebase

个人建议:在大部分时候合并代码或是更新代码时,推荐使用git rebase  --branchname, git pull --rebase;不推荐git merge

--------------------------------------------------------------------

(1)  若要看已经暂存起来的文件(已执行git add filename)和上次提交时的快照之间的差异,可以用 git diff --cached 命令

此命令与git diff 不同,git diff只能查看未暂存的文件 

 

----------------------------------------------------------------------

repo 操作

repo init -u URL 用以在当前目录安装 repository ,会在当前目录创建一个目录 ".repo"  -u 参数指定一个URL, 从这个URL 中取得repository 的 manifest 文件。   
示例:repo init -u git://android.git.kernel.org/platform/manifest.git
获取的manifest文件放在.repo目录中。命名为manifest.xml。这个文件的内容其实就是所有被git管理的仓库的列表!


可以用 -m 参数来选择获取 repository 中的某一个特定的 manifest 文件,如果不具体指定,那么表示为默认的 namifest 文件 (default.xml)
repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml
(有诸多供我们选择的manifest文件,所有的manifest文件都放在目录.repo/manifests中,该目录本身亦被git所管理,你可以cd进去看看)
可以用 -b 参数来指定某个manifest 分支。


repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0
你会发现.repo/manifests是个被git管理的仓库,这里放的是所有的manifest文件(*.xml),因为被git管理,固然有分支,-b可以切换到你想要的分支然后再下载相关的xml文件,当然具体下载那个xml还要看-m参数了,所以如果你仅仅指定-b而没有-m的话,就是下载-b指定分支下的default.xml文件


如果不指定-b参数,那么会默认使用master分支

 

repo init -b branchname 代表对mainfrema.xml 库执行项目所有库切换到branchname分支,

repo  checkout branchname(用repo切换所有库的分支, 前提是本地已建立了此branchname分支,如果本地还未建立此分支则无法切过去)

如果本地已建立了分支branchname,而要进行版本更新:

repo sync -c j12  直接repo sync 会更新所有的分支的代码,加入参数-C 代表所有库都执行同样的命令

如果本地还未已建立了分支branchname,要进行版本更新:

repo sync -c -b j12 此命令只比上条 命令多了一个参数-b ,-b 代表在当前匿名分支更新版本,

 

 

如果是想把Android当前主线上最新版本的所有的sourcecode拿下来
repo init -u git://android.git.kernel.org/platform/manifest.git

 

如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:
 repo init -u git://android.git.kernel.org/platform/manifest.git -b branchname

------------------------------------------------------------------------------------------------------------

初始化Git仓库
repo init -u git://172.16.1.11/manifest.git -b 分支名称 -m wanglei.xml
 
更新仓库代码
repo sync
 
启动分支代码
repo start 分支名称 --all

 --all意思为对所有项目操作,如果对某个项目操作如下
  Repo start master(分支名) cmd1(项目名)
 
 
下载新分支
repo forall -c git checkout -b  本地分支名称(自定义)  服务器分支名称
 
切换到另一个分支
repo forall -c git checkout your_branch
 
克隆分支下的某个git仓库
git clone  git://172.16.1.11/teset_dir/test.git -b test-dev
 
删除分支
repo forall -c git branch -D  分支名称
 
从本地代码中,将最近一次的修改抽取成patch
git add -u
git commit -m "correct the wrong info of charger status"
git format-patch -1
 
从分支的提交记录上抽取patch
git log
git format-patch 31accb599f63eadf07f606da9fe1e1b0fb728a65 -1
 
强制取消之前的修改,并恢复到最新版本
git reset --hard
 
将文件恢复到之前某个提交记录的版本
git log 文件名
git reset commit号
git stash
 
把patch提交到本地,以patch owner的名义提交
git am   patch名称
 
以自己的账号合入patch
patch -p1 <   patch名称

 

12. repo forall -c 
这个命令会遍历所有的git仓库,并在每个仓库执行-c所指定的命令(这个被执行的命令就不限于仅仅是git命令了,而是任何被系统支持的命令,比如:ls 、 pwd 、cp 等等的 )
当我想通过这个命令遍历所有的仓库并在每个仓库执行"git checkout . "用以将每个仓库的改动都清除的时候,我这么输入命令:
repo forall -c git checkout . 
我发现这样根本不行。看来repo不能遍历执行checkout这个命令。今天我终于想到了另外一个命令"git reset --hard HEAD" 哈哈
repo forall -c git git reset --hard HEAD
再说一个新发现:以前用repo forall 执行一些命令的时候,可能再遍历到某个仓库的时候出了问题,但是我却苦于不知道这个仓库到底是哪个!一直也没有解决。今天终于找到了。。。。  关键时候还是要看命令自己带的帮助手册呀。。。
repo help forall  用这个命令查看下针对forall的帮助吧。说的很清楚,repo执行的时候加上-p参数就可以在遍历到每个仓库的时候先打印出当前的pwd,然后再继续执行-c所指定的命令。举例如下:
repo forall -p -c git branch    
 
//该命令会遍历所有仓库并打印每个仓库的分支情况,由于有了-p参数,这样便会打印出每个仓库的路径!!!
 
11. repo status
显示 project 中每个仓库的状态,并打印仓库名称。

 

异常解决方案

同步代码:repo sync 

如果本地版本库中的源代码有一些改动,执行上述命令后,会出现对应的库无法成功更新下来,如下提示(笔者本地为例):

packages/apps/Calendar/: discarding 1 commits
packages/apps/Contacts/: discarding 2 commits
packages/apps/Mms/: discarding 1 commits
packages/apps/Music/: discarding 1 commits
packages/apps/Phone/: discarding 1 commits
vendor/embinux/support-tools/: discarding 1 commits 

这时需要使用下面的操作命令(解决此类冲突的方案很多,作者只是在此备注其一):

1,repo forall -c git reset --hard
2,repo sync

这样,本地代码就和服务端仓库中的代码完全一致了。

猜你喜欢

转载自blog.csdn.net/nei504293736/article/details/72236137