现在的位置: 首页 > 综合 > 正文

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

2013年01月03日 ⁄ 综合 ⁄ 共 9619字 ⁄ 字号 评论关闭


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

首先要安装的几个工具包:

Java代码  收藏代码
  1. git工具包  
  2. sudo apt-get install git-core    
  3. 一个图形操作界面的git工具  
  4. sudo apt-get install gitk  
  5. 局域网访问个哦你觉包ssh  
  6. sudo apt-get install ssh  

注意了!开始搭建了!
先创建一个workspaces文件夹

Java代码  收藏代码
  1. deanye@dean:~$ mkdir workspaces  
  2. deanye@dean:~$ cd workspaces  

将此文件夹作为版本库

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git init  
  2. Initialized empty Git repository in /home/deanye/workspaces/.git/  

Java代码  收藏代码
  1. HEAD代表当前最新状态。  
  2. tag为某个状态的标签。  
  3. SHA1为每个提交日志的唯一标识。  
  4. 开发人员需要为git仓库配置相关信息,这样在提交代码时,这些信息会自动  
  5. 反映在git仓库的日志中。  
  6.    
  7. git config user.name "your name"  
  8. git config user.email yourname@email_server  
  9. git config core.editor vim  
  10. git config core.paper "less -N"  
  11. git config color.diff true  
  12. 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代码  收藏代码
  1. deanye@dean:~/workspaces$ mkdir text_a  
  2. deanye@dean:~/workspaces$ mkdir text_b  
  3. deanye@dean:~/workspaces$ ls  
  4. text_a  text_b  
  5. deanye@dean:~/workspaces$ echo "abc">>text_c  
  6. deanye@dean:~/workspaces$ echo "abcd">>text_d  
  7. deanye@dean:~/workspaces$ ls  
  8. text_a  text_b  text_c  text_d  
  9. deanye@dean:~/workspaces$   

查看当前的状态

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git status  

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

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

可以添加一个修改text_c到默认的branch master 然后在次查看状态

Java代码  收藏代码
  1. 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代码  收藏代码
  1. deanye@dean:~/workspaces$ git add .  

通过 git commit 命令来提交:

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git commit -m "first commit"  

查看历史修改

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git log  

Java代码  收藏代码
  1. log:  
  2.    
  3. git log file                    查看一个文件的改动。  
  4. git log -p                      查看日志和改动。  
  5. git log tag1..tag2              查看两个tag之间的日志。  
  6. git log -p tag1..tag2 file      查看一个文件在两个tag之间的不同。  
  7. git log tag..                   查看tag和HEAD之间的不同。  
  8.    

修改两个文件并且查看修改文件diff

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git diff .  

我们可以再次使用组合命令 git add 和 git commit 将我们的工作提交到版本库中

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git add .  
  2. deanye@dean:~/workspaces$ git commit -m "second"  

或者直接

Java代码  收藏代码
  1. git commit -a -m "second"  

Java代码  收藏代码
  1. commit:  
  2.    
  3. git commit -a -e        提交全部修改文件,并调用vim编辑提交日志。  
  4. git reset HEAD^ or  
  5. git reset HEAD~1        撤销最后一次提交。  
  6. git reset --hard HEAD^  撤销最后一次提交并清除本地修改。  
  7. git reset SHA1          回到SHA1对应的提交状态。  
  8.    
Java代码  收藏代码
  1. add/delete/ls:  
  2.    
  3. git add -a              添加所有文件。除了.gitignore文件中的文件。  
  4. git rm file             从git仓库中删除文件。  
  5. git commit              添加或是删除后要提交。  
  6.    
  7. git ls-files -m         显示修改过的文件。  
  8. git ls-files            显示所有仓库中的文件。  

上面是提交的基本流程下面一个重点也是git的精髓

Java代码  收藏代码
  1. 管理分支  

查看当前分支

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git branch  

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

git show-branch 命令可以使我们看到版本库中每个分支的世系发展状态,并且可以看到每次提交的内容是否已进入每个分支。

Java代码  收藏代码
  1. deanye@dean:~/workspaces$ git show-branch   

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

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

deanye@dean:~/workspaces$ git checkout  master

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

合并两个分支:git merge

Java代码  收藏代码
  1. $ git checkout master  
  2. $ git merge -m "Merge" second  

合并两个分支,还有一个更简便的方式,下面的命令和上面的命令是等价的

Java代码  收藏代码
  1. $ git checkout master  
  2. $ 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代码  收藏代码
  1. 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代码  收藏代码
  1. deanye@dean:~$ mkdir text  
  2. deanye@dean:~$ cd text  
  3. deanye@dean:~/text$ git clone ssh://deanye@10.100.13.126/home/deanye/workspaces  
  4. Initialized empty Git repository in /home/deanye/text/workspaces/.git/  

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

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

抱歉!评论已关闭.