不同于熟知的SVN,CC等集中式的版本控制工具,Git是一款开源的分布式版本控制系统。
基本概念
工作拷贝(工作目录):用于存放产品开发数据本地工作目录
索引(Index):用于存放待提交数据的缓存区
本地库:远端库的一个完整的拷贝,包括所有文件的修改记录,分支等。
远端库:本地库clone来源
中心库:远端库的一种,公司级存放某个项目所有产品数据的仓库。
快照(snapshot):版本库某个时间点所有文件集合
全球版本号(commitID):Git库的版本号是通过SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了。
4种文件状态
Untracked files:未被跟踪的文件,此文件在文件夹中,但并没有加入到git库,一般指新添加的文件
Change not staged for commit:已修改的文件,包括modified和deleted状态
Change to be commit:已缓冲的文件,暂存状态,即已add的文件,执行git commit则将修改同步到库中,包括modified、deleted和new file状态
Nothing to commit:已提交的文件,即已commit的文件
Git基本操作
Clone库
#git clone 中心库名称地址 本地工作目录名称
git clone https://github.com/9plus/9plus.github.io.git ~/
增加、修改文件
git add . #处理目录下的所有修改和添加的文件,但是不处理删除的文件
git add -A #处理目录下的所有状态的文件
git add -u #处理目录下所有修改和删除操作,但不处理新增的文件
git commit -m "提交信息" #将缓存区的修改提交到本地版本库
#保持change-id不变:通过git log可以找到对应提交的change-id
git commit --amend #重写上次提交的信息
#实用情况
git add file #第一次
git commit -m "test"
git log #得到上一次的change-id
git commit --amend #重写上次的change-id,第二次提交
取消已缓存的修改
git rm --cached 文件名 #将新添加的文件从缓冲区删除,不影响本地内容
git reset HEAD 文件名 #此操作将修改的文件从缓冲区内删除,不影响本地内容
删除文件
git rm 文件名 #此操作只是删除文件并将删除的信息提交到缓冲区,使用git reset恢复
remove后需要提交。
rm -rf 文件名 + git add 文件名 = git rm 文件名
同理还有git mv
取消本地文件的修改,包括删除的文件
git checkout 文件名 #此操作将取消尚未提交的本地文件已做的但未提交的修改
git checkout . #回退当前目录下所有的修改文件
git clean -fd #清除本地未被跟踪的所有文件
比较文件差异
git diff OldCommitId NewCommitId #比较文件/目录下所有文件修改前后的不同,不加commitID则比较本地与缓存或者缓存与库中最新的
git diff --cached #index和远程库比较
git diff HEAD/master #工作区和head比较
查看修改日志
#git log
git log --all --pretty=oneline --graph #以树形显示日志的状态
git log --name-only #显示所有修改的文件名称
git log --name-status #显示所有修改的文件名称和修改的状态
git log --since 2012-11-10 #显示从2012/11/20至今修改过的日志
git log -p #详细信息
分支
- 创建分支
git branch 分支名 commitID #基于某一个全球版本号拉出新分支
git checkout -b 分支名 commitID #创建并切换分支 没注明commitID则默认为当前的HEAD
git checout -b=git branch + git checkout
- 合并分支
git merge 分支名 #将分支名指定的分支合并到当前所在的分支
git cherry-picl commitID #将某次特定提交合并到当前分支
- 查看分支
git branch
- 检查分支是否合并到当前分支
git branch --merged #查看已经合并到当前分支的所有分支
git branch --no-merged #查看还没有合并到当前分支的所有分支
- 删除私有分支
git branch -d/-D 分支名
注:-d删除分支前会检查分支中的内容是否都已经合并到其他分支,如果没有,则命令不执行
-D不进行检查,直接删除分支
- 重命名分支
git branch -m oldbranch newbranch
注:此操作是将"oldbranch"分支的名称改成"newbranch"。如果需要拉出分支,并同时切换到新分支可以用
git checkout -b oldbranch newbranch
上传
git push 远端库名称 本地分支名称:远程分支名称
注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可省略。一般git push权限不对普通员工开放,普通员工需要提交代码使用repo upload
更新当前代码(不推荐用git pull命令强制将更新合并到本地)
git fetch 远端库名称 #获取远端库的更新到本地库
git merge 远程库/分支名称 #将中心库的更新合并到本地工作目录中
修改提交信息
got commit -m '新的提交信息' --amend
注:此操作只能修改最新的一次提交,之前的提交无法修改
回退某一历史版本,然后提交到本地库
git revert 全球版本库
注:此操作将回退记录到历史的某一节点,并作为一次新的提交到库中
回退
git reset commitId #需要重新提交,修改的内容保持不变
git reset --har HEAD^ #回退到上个节点,修改的内容不保留
暂存本地修改
git stash
git stash pop
注:此操作是将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,用pop即可恢复,非常适合临时插入的紧急bug修改
git stash list #查看本地的暂存的patchset
查看全部提交
git reflog #可以找回任何提交记录,在没有删除git仓的情况下
查看commit信息
git show commitId #展示本次修改的信息及内容
解决冲突
Hello
<<<<<<< HEAD
12345
=======
world
>>>>>>> TEST_BR
12345为当前分支上的内容,world为TEST_BR分支的内容
忽略文件
在git仓工作的根目录下创建.gitignore文件。如果将某个已经忽略的文件添加,使用
git add -f 文件名
忽略规则
*.a #忽略所有.a结尾的文件
!lib.a #lib.a除外
/TODO #仅仅忽略项目根目录下的TODO文件,不包括subdir/TODO
build/ #忽略build/目录下的所有文件
doc/*.txt #忽略doc/notes.txt但是不包括/doc/server/arch.txt
网友评论