Android学习笔记Android必备开发工具之一命令行创建Git库(Dean

来源:未知 责任编辑:责任编辑 发表时间:2013-08-27 11:16 点击:

在前面一篇文件简述了一个标准流程的基本Git的操作!现在我尝试自己建立git库并操作文件将git命令的使用进行分析!采用SSH方式让局域网的同学们可以访问并且push和clone!

首先要安装的几个工具包:
Java代码 
git工具包 
sudo apt-get install git-core   
一个图形操作界面的git工具 
sudo apt-get install gitk 
局域网访问个哦你觉包ssh 
sudo apt-get install ssh 


注意了!开始搭建了!
先创建一个workspaces文件夹
Java代码 
deanye@dean:~$ mkdir workspaces 
deanye@dean:~$ cd workspaces 

\
 


将此文件夹作为版本库
Java代码 
deanye@dean:~/workspaces$ git init 
Initialized empty Git repository in /home/deanye/workspaces/.git/ 

\
 
Java代码 
HEAD代表当前最新状态。 
tag为某个状态的标签。 
SHA1为每个提交日志的唯一标识。 
开发人员需要为git仓库配置相关信息,这样在提交代码时,这些信息会自动 
反映在git仓库的日志中。 
  
git config user.name "your name" 
git config user.email yourname@email_server 
git config core.editor vim 
git config core.paper "less -N" 
git config color.diff true 
git config alias.co checkout 

 

这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。你可以用 ls -a 查看一下,并请注意其中的三项内容:
  * 一个叫 HEAD 的文件,我们现在来查看一下它的内容:
  $ cat .git/HEAD
  现在 HEAD 的内容应该是这样:
  ref: refs/heads/master
  我们可以看到,HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。
  * 一个叫 objects 的子目录,它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
  Note
  关于 git 对象的分类,以及 git 对象数据库的说明,请参看 [Discussion]
  * 一个叫 refs 的子目录,它用来保存指向对象的索引。
  具体地说,子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。
  请注意:master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。
  另外,这只是一个约定俗成的习惯而已,实际上你可以将你的工作分支叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。
  现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库植入数据了。

新建几个文件和文件夹
Java代码 
deanye@dean:~/workspaces$ mkdir text_a 
deanye@dean:~/workspaces$ mkdir text_b 
deanye@dean:~/workspaces$ ls 
text_a  text_b 
deanye@dean:~/workspaces$ echo "abc">>text_c 
deanye@dean:~/workspaces$ echo "abcd">>text_d 
deanye@dean:~/workspaces$ ls 
text_a  text_b  text_c  text_d 
deanye@dean:~/workspaces$  

 \

 


查看当前的状态
Java代码 
deanye@dean:~/workspaces$ git status 

 \

 
Java代码 
diff: 
  
开发人员在本地进行开发后,可以使用git diff查看改动。 
除了直接比较当前开发后的改动外,git diff还可以: 
  
git diff tag                    比较tag和HEAD之间的不同。 
git diff tag file               比较一个文件在两者之间的不同。 
git diff tag1..tag2             比较两个tag之间的不同。 
git diff SHA11..SHA12           比较两个提交之间的不同。 
git diff tag1 tag2 file or 
git diff tag1:file tag2:file    比较一个文件在两个tag之间的不同。 


这个时候可以案件刚才添加的两个文本文件的状态!文件夹为空所以无法看到

可以添加一个修改text_c到默认的branch master 然后在次查看状态
Java代码 
deanye@dean:~/workspaces$ git add text_c 

\
 


git add 实际上是个脚本命令,它是对 git 内核命令 git update-index 的调用。因此上面的命令和下面的命令其实是等价的:
  $ git update-index --add text_c
  如果你要将某个文件从 git 的目录跟踪系统中清除出去,同样可以用 git update-index 命令。例如:
  $ git update-index --force-remove text_c

也可以全部添加当期的改动文件(注意此时并为提交到branch)
Java代码 
deanye@dean:~/workspaces$ git add . 

 \

 


通过 git commit 命令来提交:
Java代码 
deanye@dean:~/workspaces$ git commit -m "first commit" 

 \

 


查看历史修改
Java代码 
deanye@dean:~/workspaces$ git log 

 \

 

Java代码 
log: 
  
git log file                    查看一个文件的改动。 
git log -p                      查看日志和改动。 
git log tag1..tag2              查看两个tag之间的日志。 
git log -p tag1..tag2 file      查看一个文件在两个tag之间的不同。 
git log tag..                   查看tag和HEAD之间的不同。 
  


修改两个文件并且查看修改文件diff
Java代码 
deanye@dean:~/workspaces$ git diff . 


 \


我们可以再次使用组合命令 git add 和 git commit 将我们的工作提交到版本库中
Java代码 
deanye@dean:~/workspaces$ git add . 
deanye@dean:~/workspaces$ git commit -m "second" 

\
 

或者直接
Java代码 
git commit -a -m "second" 

Java代码 
commit: 
  
git commit -a -e        提交全部修改文件,并调用vim编辑提交日志。 
git reset HEAD^ or 
git reset HEAD~1        撤销最后一次提交。 
git reset --hard HEAD^  撤销最后一次提交并清除本地修改。 
git reset SHA1          回到SHA1对应的提交状态。 
  


Java代码 
add/delete/ls: 
  
git add -a              添加所有文件。除了.gitignore文件中的文件。 
git rm file             从git仓库中删除文件。 
git commit              添加或是删除后要提交。 
  
git ls-files -m         显示修改过的文件。 
git ls-files            显示所有仓库中的文件。 


上面是提交的基本流程下面一个重点也是git的精髓
Java代码 
管理分支 

查看当前分支
Java代码 
deanye@dean:~/workspaces$ git branch 

\
 

创建一个分支并移到该分支
deanye@dean:~/workspaces$ git checkout -b first

 \


git show-branch 命令可以使我们看到版本库中每个分支的世系发展状态,并且可以看到每次提交的内容是否已进入每个分支。
Java代码 
deanye@dean:~/workspaces$ git show-branch  

\
 

从上图可以看出branch的层次结构类似与树形
关于 GIT 版本世系编号的定义,请参看 git help rev-parse

再用 git whatchanged 命令来看看 master 分支是怎么发展的

deanye@dean:~/workspaces$ git checkout  master

 \

我们可以在每一个不同分支上做自己的修改!
也就是有多种不同的工程环境!

合并两个分支:git merge
Java代码 
$ git checkout master 
$ git merge -m "Merge" second 

合并两个分支,还有一个更简便的方式,下面的命令和上面的命令是等价的
Java代码 
$ git checkout master 
$ git pull . second 

但是,此时 git 会出现合并冲突提示:$ cat text_c然后解决冲突
还有更复杂的三路合并和多内容树合并的情况。详情可参看: git help read-tree, git help merge 等文档。

逆转与恢复
逆转与恢复:git reset
  项目跟踪工具的一个重要任务之一,就是使我们能够随时逆转(Undo)和恢复(Redo)某一阶段的工作。
  git reset 命令就是为这样的任务准备的。它将当前的工作分支的 头 定位到以前提交的任何版本中,它有三个重置的算法选项。
  命令形式:
  git reset [--mixed | --soft | --hard] [<commit-ish>]
  命令的选项:
  --mixed
  仅是重置索引的位置,而不改变你的工作树中的任何东西(即,文件中的所有变化都会被保留,也不标记他们为待提交状态),并且提示什么内容还没有被更新了。这个是默认的选项。
  --soft
  既不触动索引的位置,也不改变工作树中的任何内容,我们只是要求这些内容成为一份好的内容(之后才成为真正的提交内容)。这个选项使你可以将已经提交的东西重新逆转至“已更新但未提交(Updated but not Check in)”的状态。就像已经执行过 git update-index 命令,但是还没有执行 git commit 命令一样。
  --hard
  将工作树中的内容和头索引都切换至指定的版本位置中,也就是说自 <commit-ish> 之后的所有的跟踪内容和工作树中的内容都会全部丢失。因此,这个选项要慎用,除非你已经非常确定你的确不想再看到那些东西了。
  一个重要技巧--逆转提交与恢复
Java代码 
git reset 44b8f4ca48673291ee6fa77f7c076c476a86f5f2 --hard 

两种类型的标签
  在 git 中,有两种类型的标签,“轻标签”和“署名标签”。
  技术上说,一个“轻标签”和一个分支没有任何区别,只不过我们将它放在了 .git/refs/tags/ 目录,而不是 heads 目录。因此,打一个“轻标签”再简单不过了。
  $ git-tag my-first-tag
  如果你打算针对某个commit ID来打标签,虽然该命令可以通过gitk里的右键菜单来实现,但是该命令对实际应用是很有帮助的。
  $ git-tag mytag f0af6283824688f9d23426031734657661b54388
  “署名标签”是一个真正的 git 对象,它不但包含指向你想标记的状态的指针,还有一个标记名和信息,可选的 PGP 签名。你可以通过 -a 或者是 -s 选项来创建“署名标签”。
  $ git-tag -s <tag-name>

在另一台电脑上访问并操作此git库
Java代码 
deanye@dean:~$ mkdir text 
deanye@dean:~$ cd text 
deanye@dean:~/text$ git clone ssh://deanye@10.100.13.126/home/deanye/workspaces 
Initialized empty Git repository in /home/deanye/text/workspaces/.git/ 

 \

 


Java代码 
修改文件如果需要提交可以提交的到git库的某一个分支 
deanye@dean:~/text/workspaces$ git branch 
获取当前分支名 
deanye@dean:~/text/workspaces$ git push ssh://deanye@10.100.13.126/home/deanye/workspaces/$REPO_PROJECT.git master:first 

 \

 

Java代码 
git中有四种对象:blob、tree、commit、tag。 
blob代表文件,tree代表目录,commit代表提交历史,tag代表标签。 
这四种对象都是由SHA1值表示的。在仓库的.git目录中保存了git管理仓库 
所需要的全部信息。 
git ls-tree HEAD file   显示file在HEAD中的SHA1值。 
git cat-file -t SHA1    显示一个SHA1的类型。 
git cat-file type SHA1  显示一个SHA1的内容。type是blob、tree、commit、tag之一。 
patch: 
git format-patch -1     生成最后一个提交对应的patch文件。 
git am < patch          把一个patch文件加入git仓库中。 
git am --resolved       如果有冲突,在解决冲突后执行。 
git am --skip           放弃当前git am所引入的patch。 
conflict: 
git merge               用于合并两个分支。 
git diff                如果有冲突,直接使用diff查看, 
                        冲突代码用<<<和>>>表示。手动修改冲突代码。 
git update-index        更新修改后的文件状态。 
git commit -a -e        提交为解决冲突而修改的代码。 
  
branch: 
git branch -a           查看所有分支。 
git branch new_branch   创建新的分支。 
git branch -d branch    删除分支。 
git checkout branch     切换当前分支。-f参数可以覆盖未提交内容。 
  
daemon: 
有时更新公共代码仓库使用patch的方式,或者直接 
用git pull git://ip/repo branch 
的方式更新每个人的代码。使用git pull的方式需要 
提交代码的机器运行: 
git daemon --verbose --export-all --enable=receive-pack --base-path=/repo 
request-pull: 
git request-pull start url      用于产生本次pull请求的统计信息。 
  
clean: 
  
git clean -dxf          用于清除未跟踪文件。 
git clean -dnf          可以显示需要删除的文件,但不包括被.gitignore忽略的。 
git reset --hard HEAD   用于清除跟踪文件的修改。 
 
常量的使用方法 
 
HEAD:表示最近一次的commit。 
MERGE_HEAD:如果是merge产生的commit,那么它表示除HEAD之外的另一个父母分支。 
FETCH_HEAD:使用git-fetch获得的object和ref的信息都存储在这里,这些信息是为日后git-merge准备的。 
ORIG_HEAD:保存父节点的SHA-1值 
HEAD^:表示HEAD父母的信息 
HEAD^^:表示HEAD父母的父母的信息 
HEAD~4:表示HEAD上溯四代的信息 
HEAD^1:表示HEAD的第一个父母的信息 
HEAD^2:表示HEAD的第二个父母的信息 
COMMIT_EDITMSG:最后一次commit时的提交信息。

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Android 完全退出程序
    • 原创:Android应用开发-Andorid歌词秀,含源码
    • android 屏幕保护
    • Android手机软件汉化教程---第四课 dex文件汉化
    • 众多Android 开源项目推荐,给力工作给力学习
    • Android Audio代码分析4
    • Android得到已安装的应用程序信息!
    • Android开发者指南(29) —— USB Host and Accessory
    • Android成长的幕后推手:工程师鲁宾
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1