1. 在本地可以建任意分支,只要不往服务器git push就不影响服务器的内容。
2.在使用git push的时候,如下:
git push file:home/hebo/work/testgit/ master
这样对本地的修改,只会master分支推送到服务器上,其它的不影响
但是如果需要把其它的本地维护的分支推送到服务器,需要
git push file:home/hebo/work/testgit/ local_hebo,本地也必须存在local_hebo的分支
疑问:
1.为什么在自己建的git工程中,可以使用git branch查看分支,而在android的工程中使用git branch查看的分支为空?
2.为什么自己无法建立remote/umg/froyo这样子的分支,而android可以
3.repo init -u git://android.intel.com/manifest -b froyo -m prod-bb表示什么?
使用以上例子做如下实验:
1. git init m2doc
创建一个空的m2doc库,以做实验用ll查看,可以看到只有一个.git目录。
2. git remote add hb /home/hebo/work/test_hebo_git/m2doc.git/
添加一个远程仓库的标签,用此标签进行管理,可以使用git remote show查看,生成了一个hb的远程仓库在本地的标签,使用git remote show hb查看,生成如下信息,此时show命令会通过网络与远程仓库通信:
* remote hb
Fetch URL: /home/hebo/work/test_hebo_git/m2doc.git/
Push URL: /home/hebo/work/test_hebo_git/m2doc.git/
HEAD branch: master
Remote branches:
local_sub_local new (next fetch will store in remotes/hb)
master new (next fetch will store in remotes/hb)
此信息表示, 抓取的远程的地址,HEAD分支,相当于master分支,远程存在local_sub_local分支,以及存在master分支,如果使用git clone会自动创建一个original的标签
3. git fetch hb
从远程仓库同步抓数据到本地的仓库,本地建立了一个和远程仓库完全一样的镜象。
remote: Counting objects: 686, done.
remote: Compressing objects: 100% (663/663), done.
Receiving objects: 100% (686/686), 1020.29 KiB, done.
remote: Total 686 (delta 132), reused 0 (delta 0)
Resolving deltas: 100% (132/132), done.
From /home/hebo/work/test_hebo_git/m2doc
* [new branch] local_sub_local -> hb/local_sub_local
* [new branch] master -> hb/master
此时,才真正从远程仓库取数据下来同步到本地的仓库,可以看到 local_sub_local对应远程的 hebo/local_sub_local,master对应的远程下的hb/master
4.使用git checkout hb/local_sub_local
会出现如下提示Note: checking out 'hb/local_sub_local'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
表示当前处于"detached HEAD"的状态,在此状态可能查看,实验,用git branch
可以看到出现如下提示:* (no branch),表示本地还没有确定的分支。
5. git checkout local_sub_local
从本地库拉出一个local_sub_local分支,使用 git branch
* local_sub_local
可以看到当前处于 local_sub_local的分支。
6. git checkout master
从本地拉出一个master的分支,使用git branch
local_sub_local
* master
可以看到当前处于master的分支,本地有local_sub_local以及master两个分支
7. git checkout hb/master
从本地拉出一个空分支,此分支是临时的,本地的修改无法保存。
再次使用git checkout hb/master,然后通过git branch
* (no branch)
local_sub_local
master
可以看到当前双处于远程的no branch分支。
8. git diff的使用
git diff是一个强大的比较版本的工具,可以对本地与本地缓存,远程分支,tags标签进行比较
例如: git diff --stat remotes/umg/froyo-stable remotes/umg/froyo-prod-bb
别外可以使用git diff sha1 sha2 path比较某个目录下的不同,也可以在某个目录下使用 git diff --relative比较当前目录下的不同文件。
可以在一个工作树中使用git diff进行比较,也可以在一个仓库中直接使用git diff branch_name1 branch_name2进行比较,比较是基于
仓库的,其本质是都是基于HASH值,如果本地的仓库没有更新,是无法比较本地创库没有,而远程创库有的更新的节点的。
由此引申开来,此质的remote/umg/branch_name其实对应的是本地的仓库,只要在使用git remote show orginal的时候,才会发起网络连接,可以看到远程是否有更新。如果有更新,会显示 (next fetch will store in remotes/umg)
9. 对于存在分支与本地目录同名的的信息
可以使用git diff master test3 --
在test3后面加一个--表示这是一个分支,而不是一个路径
10. git rev-parse 命名是一个底层命令,我们偶尔要将某些称谓翻译成对象名的时候非常有用。
$ git rev-parse origin
e05db0fd4f31dde7005f075a84f96b360d05984b
用此可以得到分支分支,tag对应的HASH值。
11. git diff的使用
Git 比较不同版本文件差异的常用命令格式:
- git diff 查看尚未暂存的文件更新了哪些部分
- git diff filename 查看尚未暂存的某个文件更新了哪些
- git diff –cached 查看已经暂存起来的文件和上次提交的版本之间的差异
- git diff –cached filename 查看已经暂存起来的某个文件和上次提交的版本之间的差异
- git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9 b8e7b00c02b95b320f14b625663fdecf2d63e74c 查看某两个版本之间的差异
- git diff ffd98b291e0caa6c33575c1ef465eae661ce40c9:filename b8e7b00c02b95b320f14b625663fdecf2d63e74c:filename 查看某两个版本的某个文件之间的差异
12. git checkout
在git branch new_branch之后,git checkout new_branch相当于从本地当前分支上建立分支,工作树中的内容与当前的分支一致,如果要更新内容,需要从远程分支中merge到当前的分支,git merge origin/branch_name, 如果new_branch名与remote中的一致,在git remote show origin的时候,可以看到
Local branch configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
hb pushes to hb (up to date)
master pushes to master (up to date)
如果当前的new_branch名与remote中的不一致,在git remote show origin的时候,可以看到:
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
可以看到,此时新的分支不能直接push到服务器上
如果是通过git checkout -track origin/branch_name,此命令相当于git checkout -b branch_name origin/branch_name,
Local branches configured for 'git pull':
hb merges with remote hb
master merges with remote master
Local refs configured for 'git push':
hb pushes to hb (up to date)
master pushes to master (up to date)
如果 git checkout -b new_bracn origin/branch_name,此时会显示,another_branch不会直接push到服务器。
Local branches configured for 'git pull':
another_branch merges with remote hb
hb merges with remote hb
master merges with remote master
Local refs configured for 'git push':
hb pushes to hb (up to date)
master pushes to master (up to date)
13. git show-ref
List references in a local repository 浏览在本地仓库的引用。
14. git var
Show a git logical variable 加-l参数显示本地的逻辑变量.
15. 使用如下方法,fetch到的数据,与repo抓到的一样,
git init bionic
cd bionic/
git remote add hb git://shumg001.sh.intel.com/a/aosp/platform/bionic.git
git fetch hb
输出结果:
emote: Generating pack...
remote: Done counting 6707 objects.
remote: Deltifying 6707 objects...
remote: 100% (6707/6707) done
remote: Total 6707 (delta 4616), reused 6446 (delta 4420)
Receiving objects: 100% (6707/6707), 2.55 MiB | 156 KiB/s, done.
Resolving deltas: 100% (4616/4616), done.
From git://shumg001.sh.intel.com/a/aosp/platform/bionic
......
* [new branch] froyo-integ-mfld -> hb/froyo-integ-mfld
* [new branch] froyo-integ-pr1 -> hb/froyo-integ-pr1
* [new branch] froyo-integ-sr -> hb/froyo-integ-sr
* [new branch] froyo-prod-bb -> hb/froyo-prod-bb
......
* [new tag] android-sdk-2.0.1_r1 -> android-sdk-2.0.1_r1
* [new tag] android-sdk-2.1_r1 -> android-sdk-2.1_r1
* [new tag] android-sdk-tools_r2 -> android-sdk-tools_r2
remote: Generating pack...
remote: Done counting 5 objects.
remote: Deltifying 5 objects...
remote: 100% (5/5) done
remote: Total 5 (delta 2), reused 5 (delta 2)
Unpacking objects: 100% (5/5), done.
From git://shumg001.sh.intel.com/a/aosp/platform/bionic
* [new tag] android-2.0_r1 -> android-2.0_r1
* [new tag] android-sdk-2.0_r1 -> android-sdk-2.0_r1
* [new tag] android-sdk-tools_r3 -> android-sdk-tools_r3
* [new tag] android-sdk-tools_r4 -> android-sdk-tools_r4
* [new tag] android-sdk-tools_r5 -> android-sdk-tools_r5
在refs的目录下,会生成remote/hb/分支名, 以及tags/tag名,HEAD文件的内容指向ref: refs/heads/master.
使用git checkout --track hb/froyo-prod-bb可以在本地生成与分支froyo-prod-bb同名的本地分支,使用git checkout -b my_topic hb/froyo-prod-bb生成一个本地的分支,
可以使用git remote show branch看其与远程分支的相关性,如下所示:
Local branches configured for 'git pull':
froyo-prod-bb merges with remote froyo-prod-bb
my_topic merges with remote froyo-prod-bb
Local ref configured for 'git push':
froyo-prod-bb pushes to froyo-prod-bb (up to date)
注意:出现此问题的原因是,在本地将一个git工程拷贝过来,然后以此工程为基础,然后clone过来,由于本地只有my_topic所以clone过来的只有一个my_topic分支,此处不会再clone服务器远端的分支,克隆是相对的,对于克隆来说,只有一个父,而与其父亲的父亲没有关系。
16. 使用git cat-file与git ls-tree查看当前checkout出来的文件对应的是哪一个提交
假如想通过git checkout HEAD^^ . 将当前的目录回退到之前某一个版本,然后想知道具体回到了哪个版本,可以使用如下方法尝试:
i. 通过git log查看commit的SHA值
ii.通过git cat-file commit SHA-ID找到对应的tree , parent的SHA-ID
iii.通过git ls-tree 查看SHA-ID,就可以找到当前tree下此文件的blob SHA-ID
iv.通过git ls-files -s可以当前路径下件下暂存文件的SHA-ID,这样就可以知道checkout出来的是哪一个文件
但一般如果需要回退文件,不通过此方法,通过branch回退版本,然后进行比较
例如:我想回到上几个修改,可以git checkout -b my_topic_xxmonth_xxday_xxhour_xxminute SHA_ID,这样在此分支上进行验证,然后通过git log就可以知道在哪个log的状态上了。
原文转自:http://blog.csdn.net/gracioushe/article/details/6129891