本文主要对git经常使用命令的工做原理作一个详细的说明,经常使用命令主要包括:html
git add相关命令很简单,主要实现将工做区修改的内容提交到暂存区,交由git管理。git
git commit主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。github
关于分支,大概有展现分支,切换分支,建立分支,删除分支这四种操做。缓存
merge命令把不一样的分支合并起来。以下图,在实际开发中,咱们可能从master分支中切出一个分支,而后进行开发完成需求,中间通过R3,R4,R5的commit记录,最后开发完成须要合入master中,这便用到了merge。bash
注:通常在merge以后,会出现conflict,须要针对冲突状况,手动解除冲突。主要是由于两个用户修改了同一文件的同一块区域。以下图所示,须要手动解除。服务器
rebase又称为衍合,是合并的另一种选择。在开始阶段,咱们处于new分支上,执行 git rebase dev ,那么new分支上新的commit都在new分支上重演一遍,最后checkout切换回到new分支。svg
这一点与merge是同样的,合并先后所处的分支并无改变。post
git rebase dev ,通俗的解释就是new分支想站在dev的肩膀上继续下去。rebase也须要手动解决冲突。fetch
注1: merge与rebase的区别,请参考 <<merge与rebase区别>>url
注2:在项目中常用git pull来拉取代码,git pull至关因而git fetch + git merge,若是此时运行git pull -r,也就是git pull –rebase,至关于git fetch + git rebase,参考:简单对比git pull和git pull --rebase的使用
当你使用git pull时,它将会获取远程服务器(你请求的,不管什么分支)上的代码,而且当即合并到你的本地厂库,pull是一个高等级的请求,默认会支持fetch+merge的操做,若是不是为了使用上的方便,你能够彻底不使用它。
1 $git checkout localbranch 2 $git pull origin master 3 $git branch 4 master 5 *localbranch
上面的命令会将远程服务器上的master分支合并到localbranch中。
fetch和pull很类似,只是fetch不会作任何的合并操做。
1 $git checkout localbranch 2 $git fetch origin remotebranch 3 $git branch 4 master 5 *localbranch 6 remotebranch
所以,fetch指是获取remotebranch,而后建立一个本地copy,你不该该直接对这个copy作任何的操做,而应该应该建立一个本地分支,而后在本地分支上进行工做。
clone将会克隆一个本地厂库,
1 $cd newfolder 2 $git clone git@github.com:whatever/something.git 3 $git branch 4 *master 5 remotebranch
clone会为它被克隆的远程repo建立一个名为“origin”的local repo,并为远程repo的活动分支建立一个本地分支以及远程跟踪分支。
reset命令把当前分支指向另外一个位置,而且相应的变更工做区和暂存区。
以下图显示了soft mixed和--hard的做用范围。
git checkout hotfix
上面这个命令作的不过是将HEAD移到一个新的分支,而后更新工做目录。
由于这可能会覆盖本地的修改,Git 强制你提交或者缓存工做目录中的全部更改,否则在 checkout 的时候这些更改都会丢失。和 git reset
不同的是,git checkout
没有移动这些分支。
git checkout [<commit>] [--] <paths> ... 注:其中---表示路径标记,以避免路径和分支同名时用以区分
第1种用法(包含<paths>的用法)不会改变HEAD头指针,主要使用于指定版本的文件覆盖工做区中对应的文件。
若是省略<commit>,如git checkout paths,则会用暂存区的文件覆盖工做区中的文件,不然git checkout commit paths用指定提交中的文件覆盖暂存区和工做区中的对应文件
第2种用法(不包含<paths>的用法)单纯的检出某个commit或分支,如git checkout commit或git checkout branch是会改变HEAD头指针的。
只有当HEAD切换到某个分支的时候如git checkout branch才能够对提交进行跟踪,不然就会进入“分离头指针”的状态。若是省略用法2后面的<branch>如git checkout,则默认对工做区进行状态检查
这和 checkout 到另外一个分支是彻底同样的:把 HEAD 移动到特定的提交。好比,下面这个命令会 checkout 到当前提交的祖父提交。
git checkout HEAD~2
这对于快速查看项目旧版原本说很是有用。但若是你当前的 HEAD 没有任何分支引用,那么这会形成 HEAD 分离。这是很是危险的,若是你接着添加新的提交,而后切换到别的分支以后就没办法回到以前添加的这些提交。所以,在为分离的 HEAD 添加新的提交的时候你应该建立一个新的分支。
git revert用一个新提交来消除一个历史提交所作的任何修改
注:revert与reset的区别
(1)git revert是用一次新的commit来回滚以前的commit,git reset是直接删除指定的commit。
(2)在回滚这一操做上看,效果差很少。可是在往后继续merge之前的老版本时有区别。
由于git revert是用一次逆向的commit“中和”以前的提交,所以往后合并老的branch时,致使这部分改变不会再次出现,减小冲突。
可是git reset是之间把某些commit在某个branch上删除,于是和老的branch再次merge时,这些被回滚的commit应该还会被引入,产生不少冲突。
(3)git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,可以抵消要被revert的内容。
上传本地仓库分支到远程仓库分支,实现同步。
git push的通常形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,便是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,
第一个master是本地分支名,第二个master是远程分支名
1. git push origin master
若是远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(一般二者同名),若是该远程分支不存在,则会被新建
2. git push origin :refs/for/master
若是省略本地分支名,则表示删除指定的远程分支,由于这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
3. git push origin
若是当前分支与远程分支存在追踪关系,则本地分支和远程分支均可以省略,将当前分支推送到origin主机的对应分支
4. git push
若是当前分支只有一个远程分支,那么主机名均可以省略,形如 git push,可使用git branch -r ,查看远程的分支名
5 git push 的其余命令
这几个常见的用法已足以知足咱们平常开发的使用了,还有几个扩展的用法,以下:
(1) git push -u origin master 若是当前分支与多个主机存在追踪关系,则可使用 -u 参数指定一个默认主机,这样后面就能够不加任何参数使用git push,不带任何参数的git push,默认只推送当前分支,这叫作simple方式,还有一种matching方式,会推送全部有对应的远程分支的本地分支, Git 2.0以前默认使用matching,如今改成simple方式.若是想更改设置,可使用git config命令。git config --global push.default matching OR git config --global push.default simple;可使用git config -l 查看配置
(2) git push --all origin 当遇到这种状况就是不论是否存在对应的远程分支,将本地的全部分支都推送到远程主机,这时须要 -all 选项
(3) git push --force origin git push的时候须要本地先git pull更新到跟服务器版本一致,若是本地版本库比远程服务器上的低,那么通常会提示你git pull更新,若是必定要提交,那么可使用这个命令。
(4) git push origin --tags //git push 的时候不会推送分支,若是必定要推送标签的话那么可使用这个命令
1.http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html git checkout 命令详解
2.https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-%E4%BB%A3%E7%A0%81%E5%9B%9E%E6%BB%9A%EF%BC%9AReset%E3%80%81Checkout%E3%80%81Revert-%E7%9A%84%E9%80%89%E6%8B%A9 代码回滚:Reset、Checkout、Revert 的选择