git学习

2014年11月26日

学什么都很浅,底子薄人又懒!!!一样一样来!

csv、svn与git

CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统。

命令

git init //初始化一个Git仓库,先创个文件夹
git add <file> 可反复多次使用,添加多个文件至暂存区(Stage) //我一直是git add -A全部一次提交文件,以后要注意下是否有不该提交的文件   
git commit -m "说明" //把暂存区的所有内容提交到当前分支
git status //随时掌握工作区的状态,查看有无文件修改过(修改但没commit)
git diff //查看修改内容   

master //git为我们自动创建的第一个分支
HEAD指向的版本就是当前版本,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id() //上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
origin //git默认的远程库的名字	  

git log //查看提交历史,以便确定要回退到哪个版本(最近三次)
git reflog //查看历史命令,以便确定要回到未来的哪个版本  

git clone //克隆远程库  
git branch //查看分支
git branch <name> //创建分支
git checkout <name> //切换分支
git checkout -b <name> //创建+切换分支
git merge <name> //合并某分支到当前分支
git stash //把当前工作现场“储藏”起来,等以后恢复现场后继续工作(因为没有commit当前分支的内容是无法切换分支的)
git branch -d <name> //删除分支
git branch -D <name> //强行删除没有被合并过的分支

git checkout -b dev origin/dev  //创建远程origin的dev分支到本地!!!
git remote -v //查看远程库信息 
git branch --set-upstream branch-name origin/branch-name //建立本地分支和远程分支的关联

git tag <name> //新建一个标签,默认为HEAD,也可以指定一个commit id
git tag -a <tagname> -m "blablabla..." //指定标签信息  
git tag -s <tagname> -m "blablabla..." //用PGP签名标签
git tag //查看所有标签
git push origin <tagname> //推送一个本地标签
git push origin --tags //推送全部未推送过的本地标签
git tag -d <tagname> //删除一个本地标签
git push origin :refs/tags/<tagname> //删除一个远程标签 ### 暂存区的概念 工作区: 就是电脑里能看到的目录   版本库: 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库  Git的版本库最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD(HEAD指向的是当前分支)

把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。 全部commit后再git status就会提示nothing to commit (working directory clean)工作区就是“干净”的。

git跟踪并管理的是修改,而非文件

每次修改,如果不add到暂存区,那就不会加入到commit中。

撤销修改(还没提交到远程)

git checkout -- file可以丢弃工作区的修改,就是让这个文件回到最近一次git commit或git add时的状态(注意是只add而没有commit)。 //git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

远程仓库

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

分支策略

master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

推送分支

就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支。 git push origin 分支名称

抓取分支

多人协作时,大家都会往master和dev分支上推送各自的修改。当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支: git checkout -b dev origin/dev

本地新建的分支如果不推送到远程,对其他人就是不可见的; 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致

Bug分支(很常用!)

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除; 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

标签管理

####创建标签 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id; git tag -a -m "blablabla..."可以指定标签信息; git tag -s -m "blablabla..."可以用PGP签名标签; 命令git tag可以查看所有标签。

忽略文件

忽略某些文件时,需要编写.gitignore
.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

添加子模块

git submodule add git地址

删除.swp文件

在terminal中提交代码到git上去的时候,常常会提示错误信息。 其实这是因为vi没有正常退出或者多个程序编辑同一文件产生了.swp 文件。解决办法是删掉.swp文件(rm -fr *.swp)

所以要注意: 当你打开一个文件,vi就会生成这么一个.swp文件以备不测,如果你正常退出,那么这个swp文件将会自动删除。 不测分为:
1用多个程序编辑同一个文件;
2非常规退出;

参考链接

感谢作者访问