Git 是一个很强大的分布式版本控制系统。它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势, 通俗来讲,它其实是一个具备排序、对比以及合并项目更新等的工具。
1、获取和创建项目
mdir tag _name 创建一个空的文件夹
git init 初始化一个Git仓库(会在当前目录下生成一个.git 文件目录,Git用来跟踪和管理Git版本库的) 。
git clone +[url] 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改, url是你要复制的项目地址
2. 基本快照
使用 git add 添加需要追踪的新文件和待提交的更改, 然后使用 git status和 git diff 查看有何改动, 最后用 git commit 将你的快照记录进行提交。这就是使用的基本流程,绝大部分时候都是这样的。每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为" commit "。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。
git status 查看你的文件在工作目录与缓存的状态
git diff +路径 查看当前文件已修改了哪些内容
git add 把修改的文件添加到暂存区stage(或者叫index)
git commit -m "备注" 从缓存区添加到当前分支
git commit --amend 用来追加修改,不会产生新的提交记录
git checkout--文件名/路径 撤销本地修改
git log查看从近到远的提交记录
git reset --hard HEAD^ 表示回退到上一个版本
git reflog 查看你的每一次提交ID
如果不小心提交了错误的信息,我们是可以使用Git命令回退到历史版本,当然Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,
也就是最新的提交记录(注意每一条提交记录都会有一个唯一标识的ID),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
如果想要回退到修改之前的版本,可以使用 git reflog 查看保存的提交记录的ID, 再使用git reset --hard commit_id返回到你修改之前的版本。
3、分支与合并
一般就是使用git branch 命令列出、创建与管理工作分支,使用git checkout命令切换到新的分支上下文.
git branch local_branch 新建本地分支(不会改变分支指针)
git checkout branch_name 切换到某个已存在的分支(本地的或远程的)
git checkout -b local_branch 新建并且换到本地分支
git branch -d branch_name 删除分支
git branch –D branch_name 删除本地分支(只能删除本地创建的分支,因为 远程分支所有人都没有权限删除)
git reset --hard tag_name 放弃本地修改的内容. 这个方命令是把本地库当前分支的代码重置到tag节点的状态。(可能会丢失本地的修改,慎用)
二、Repo小结
android中使用git作为代码管理工具,开发了Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了Repo命令行工具,对git部分命令进行封装,将百多个 Git 库有效的进行组织。
1、清单文件库的介绍
一个清单库可以包含多个清单文件和多个分支,每个清单文件和分支都有对应的版本。清单文件以xml格式组织的。举个例子:
remote元素:定义了名为korg的远程版本库,其库的基址为git://172.16.1.31/
default元素:设置各个项目默认远程版本库为korg,默认的的分支为gingerbread-exdroid-stable。当然各个项目(project元素)还可以定义自己的remote和revision覆盖默认的配置 。
project元素:用于定义一个项目,path属性表示在工作区克隆的位置,
name属性:表示该项目的远程版本库的相对路径
project元素的子元素copyfile: 定义了项目克隆后的一个附件动作,从src拷贝文件到dest 。
2、repo常用指令
repo init -u []
在当前目录下安装 Repo。这会产生一个 .repo/ 目录,目录包括装 Repo 源代码和标准 Android 清单文件的 Git 仓库。
.repo/目录还包括 manifest.xml,是一个在 .repo/manifests/ 目录选择清单的符号链接。
例如:repo init -u
ssh://192.168.10.10:29418/cory/manifest -m cory_study.xml(不同项目xml不同),自动生成隐藏文件.repo
参数:
-u:指定一个恢复清单仓库的地址(URL)。
-m:在仓库里选择一个清单文件。如果没有清单名称,那么默认是 default.xml。
-b:指定一个修正,例如,一个特殊的清单分支(manifest-branch) 。
repo sync []
下载新的更改,更新在你本地环境中的工作文件。如果你不带参数运行 repo sync,它将同步所有项目的文件。
例如:拉取整个手机系统代码 repo sync -cj4 (-c代表只拉取某个分支,j4代表线程数目)
repo upload []
在指定的项目中,Repo 把本地分支的更新比作远程分支在最后一次 Repo 同步。Repo 会提示你选择一个或更多尚未上传审查的分支。
repo diff []
在 commit 和工作目录之间使用 git diff 显示明显差异的更改。
repo download
从审查系统下载指定的更改,然后使它在你的项目的本地工作目录中可用。
repo branch 查看本地分支
repo prune [] 删减(删除)已经合并的标题。
.repo/manifest.xml 查看项目是由哪些git库组成的
repo start [] 一个新分支的发展,从清单中指定的修正开始的。
参数:
参数应该提供一个更改的简短说明给你正在尝试建立的 项目。如果你不知道,那就考虑使用默认名称。
指定将要参与这个主题分支的项目。
注意:"." 是当前工作目录下的项目的一个方便的简写。
6、git log --pretty=oneline 只查看提交名字
7、git reset --hardHEAD^ 回退到上个版本,上上个版本后面两个^^,一次类推
8、git reset --hardHEAD~100 会退到前100个版本
9、cat readme.txt 查看文件内容
10、git reflog 查看当前版本后的版本号
11、git reset --hard 版本号 回到版本号对应的版本
12、Ctrl+z 退出编辑
vim readme.txt i编辑 Esc 退出编辑:x保存退出
13、git checkout --readme.txt 撤销还未添加到暂存区的内容,添加到暂存区后无法用该命令撤销
14、rm b.txt 删除文件,后两种情况,commit提交为从版本库中彻底删除此文件;用checkout命令恢复文件,然后提交
15、git push -u originmaster 把本地仓库分支master内容推送到元仓库去
gitpush origin master
16、git remote and
origin http://github.com/zhanguoliang/testgit.git 关联本地库
17、git clonehttp://github.com/zhanguoliang/testgit2.git 从元仓库克隆一个本地库
18、git checkout -b name 创建并切换分支name
19、git branch 查看有哪些分支
20、git checkout name 切换到分支name(???)
21、git merge name 在master分支上合并name分支内容
[if !vml]
[endif]
产生冲突(conflicts)
22、git branch -d name 删除name分支
23、git branch name 创建分支name
24、git log --graph --pretty=oneline --abbrev-commit 查看进行过的操作
25、git merge --no-ff -m "合并禁用fast forward" 合并后删除分支后,还可以找到被删除的分支的信息
a、bug分支
1、当前分支上工作没有提交,有新的bug需要处理
gitstash 将当前的工作现场隐藏起来
gitstash list 查看工作现场
gitstash apply 恢复工作现场
gitstash drop 删除一条stash,因为工作空间恢复后,stash的内容并不会删除
gitstash pop 恢复的同时把stash内容删除
b、多人协作
gitremote 查看远程库的信息
gitremove -v 详细信息
gitpush origin master 推送本地代码到远程库
git push originname 推送到name分支
c、抓取分支
git pull 与 git pull --rebase
https://stackoverflow.com/questions/18930527/difference-between-git-pull-and-git-pull-rebase
http://www.cnblogs.com/iammatthew/archive/2011/12/06/2277383.html
git config
利用这个命令可以新增、更改Git的各种设置,例如:配置本地的用户名和邮箱
1) 配置使用git仓库的人员姓名
git config --global user.name "YourName Comes Here"
2) 配置使用git仓库的人员email
git config --global user.emailyou@yourdomain.example.com
15、git cherry-pick commit-id (多个分支的提交,不常使用,容易出错)
公共问题的修改,例如先修改master公共分支,还需要添加到212kk_base分支上
1、先记一下master分支上本次修改的commit_id(注意不是change_id)
2、git checkout g212kk_base切换分支
3、git cherry-pick commit-id
4、git push origin HEAD:refs/for/g212kk_base