附件是git完全图解。下面是基本命令的解释,主要有:add, reset, checkout, pull, push, fetch, clone, init, tag等。
Ps:在commit时,需要注意一定要加-m参数,写上commit messages,否则会打开vim强制你写一个。
关于git flow,网上也有一些最佳实践,比如:http://www.cnblogs.com/cnblogsfans/p/5075073.html
1、Git add 详解
add将当前工作区的改动保存到暂存区。
在一次commit之前,可以进行多次add。也就是说,可以只改动一点就add,一次commit即可。
git add<pathspec>
pathspec可以是一个确定的文件,也可以用统配符,比如 git add *.c将add所有.c后缀的文件;
git add-A stages All
git add . stagesnew and modified, without deleted
git add -u stagesmodified and deleted, without new
使用实例:
在修改文件后,使用git status显示:
$ git status
On branch master
Changes not staged forcommit:(下列修改未加入暂存区,不会被提交)
(use "gitadd <file>..." to update what will be committed)(使用gitadd <file> 将修改加入暂存区)
(use "gitcheckout -- <file>..." to discard changes in working d(使用git checkout -- <file>取消以文件的修改,所有修改都会被清除,只会清除工作区的文件修改,已经提交到暂存区的修改不受影响,即将工作区的相关文件用暂存区的文件替换掉。 )
modified: welcome.txt
no changes added tocommit (use "git add" and/or "git commit -a")
在使用git add .后,git status显示:
$ git status
On branch master
Changes to becommitted:(这些更改需要被提交)
(use "gitreset HEAD <file>..." to unstage)(如 果后悔了,可以使用git reset HEAD<file>命令,将文件移出暂存区,恢复到工作区,下次commit时将不提交该文件。 git reset HEAD命令会将暂存区的文件恢复成HEAD所指向的状态,即恢复到版本库里保存的状态,工作区的文件不受影响)
modified: welcome.txt
beichen2012@BEICHEN2012-PC/F/leargit (master)
另:
git checkout HEAD<file>命令:会用版本库中的文件替换暂存区和工作区中的文件,工作区的修改会被清除,暂存区未提交的修改也会被清除。
2、git reset
git reset是重置命令,其默认值是用HEAD指向的版本库来重置暂存区,很少直接操作工作区(--hard除外),所以重置一般是用来重置暂存区的。
命令格式:git reset[<mode>] [<commit>]
a、--hard,例如:git reset --hard <commit>
替换指针指向,引用指向新的提交ID
替换暂存区,将引用指向的新的版本库文件替换到暂成存区,即暂存区文件将与新的版本库文件保持一致
替换工作区,工作区文件将同新的版本库文件保持一致
使用--hard参数,将会把引用指向新的(历史的)提交ID,并把暂存区和工作区文件同步成新的版本库文件,暂存区和工作区的所有原文件将丢失 。
b、--soft,如:git reset --soft <commit>
此命令只会把版本库的引用指向改变,但不会改变暂存区和工作区。
例如:git reset --softHEAD^,此命令使用后,工作区和暂存区保持不变,但是引用ID向前回退一次,当对更改不满意时,撤销最新的提交以便重新提交。与此功能相同的一个命令是: git commit --amend ,用于对最新提交重新提交以修补错误的提交说明或错误的提交文件。
c、--mixed,如:git reset --mixed <commit>或git reset<commit>
此命令会改变引用的指向,并重置暂存区,不影响工作区。
git reset或 gitreset HEAD:仅用于将HEAD指向的版本库区内容重置到 暂存区,工作区不受影响,相当于将之前 git add命令stage到暂存区的修改撤出暂存区。
git reset -- filename或gitreset HEAD filename:仅将 filename文件的改动撤出暂存区(仅将filename文件从版本库中重置到暂存区),暂存区中的其它文件不变。相当于对gitadd filename的反操作。
3、git checkout
git checkout的默认值是暂存区(这点与reset命令不同),此检出命令主要用来覆盖工作区(如果不省略<commit>参数,也会覆盖暂存区文件)
a、gitcheckout <branch>
用于切换 分支
git checkout -b <branch>
新建分支,并切换到该分支
b、gitcheckout或git checkout HEAD:
汇总显示工作区、暂存区与HEAD的差异
c、gitcheckout -- filename
用暂存区的文件来覆盖工作区的文件
git checkout -- . 或 git checkout . :用暂存区的文件覆盖所有工作区的文件,相当危险。
d、git checkout HEAD^(或是其他的commit id)
用HEAD^(或是其他的commit id)指向的版本库中的文件,替换当前工作区的文件,当前的工作区处于一个detached HEAD(游离HEAD),此命令可用于查看版本库的某一历史文件;如果修改了文件,也不会被保存,如果想要保存 ,使用:git checkout -b new_branch_name,创建基于当前游离HEAD的分支 。
4、git init,remote, clone, pull, push, fetch
a、在本地建立服务器仓库(远端仓库)
mkdir xx.git
cd xx.git
git init --bare
--bare参数表明创建一个“裸”仓库,该仓库不包含工作目录,仅包含git的一系列版本历史记录文件,也就是说不能在此目录下工作(不能使用git status查看状态等,但是可以用gitk查看历史)。目的是为了防止服务器仓库有人在操作某一分支,客户端有人向同样的分支提交而造成提交失败等一冲突问题。
b、clone命令
格式:git clone <xxxx.git> <本地目录名>
本地目录可以省略,则clone到当前目录
b.1)只clone某一分支
git clone–b <branch> xxxx.git
默认则clone所有分支,但是只显示master分支;
b.2)clone所有分支
git clone xx.git
git branch–a //显示所有的分支(包括隐藏的分支)
git checkout–b <branch>remote/origin/<branch> //基于远程的branch分支创建本地branch分支并切换到branch分支
c、remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
c.1)列出所有远程主机
git remote
c.2)查看远程主机的网址。
git remote -v
origin [email protected]:jquery/jquery.git(fetch)
origin [email protected]:jquery/jquery.git(push)
上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。
c.3)自定义主机名
克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。
git clone -o jQueryhttps://github.com/jquery/jquery.git
git remote
jQuery
上面命令表示,克隆的时候,指定远程主机叫做jQuery。
c.4)查看某主机的详细信息
git remote show <name-origin>
c.5)添加远程主机
git remote add <主机名> <网址>
c.6)删除远程主机
git remote rm <主机名>
d、fetch
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。
d.1)取回全部分支
git fetch <远程主机名>
d.2)取回指定分支
git fetch <origin> <master>
e、push
将本地分支推送到远程主机
git push <远程主机> <本地分支>:<远程分支>
将本地分支(比如master)推送到远程主机的某一分支上(比如master)
git push xxx.git branch1:branch1
将本地的branch1分支推送到xxx.git的branch1,如果xxx.git上不存在branch1,就会被创建一个。
git push xxx.git test:master
将本地的test分支推送到xxx.git上,并作为其master分支
git push xxx.git :test
推送一个空分支到xxx.git的test分支,即删除xxx.git上的test分支
默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。
1.push单个tag,命令格式为:git pushorigin [tagname]
例如:
git push origin v1.0 #将本地v1.0的tag推送到远端服务器
2.push所有tag,命令格式为:git push[origin] --tags
例如:
git push --tags
或
git push origin --tags
f、pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机名> <远程分支名>:<本地分支名>
此处与push命令刚好相反。
git pull origin next:master
取回origin主机的next分支,与本地的master分支合并
5、文件归档 git archive
a、基于最新提交建立归档文件:
git archive -o latest.zip HEAD
b、只将目录 src和 doc归档
git archive -o partial.zip HEAD src doc
6、git tag
git tag 有两种形式:轻量型和带注释的标签。
列出所有标签
git tag
创建轻量级标签
git tag <v1.0>
创建带注释的标签
git tag–a <v1.0> -m <comments>
查看某tag 处的文件
git checkout tag_name
此时,可查看该tag时刻的文件,但处理一种分离的分支( detached),不能够提交,仅能查看,拷贝。若需要在此 tag基础上修改文件,可从此处新建一个分支: gitchechout–b <branck name> tag_name,然后在新建的分支上工作,即可提交。
查看某标签:
git show tag_name
7、附:常用命令
git配置(config):
gitversion #查看版本
gitconfig-l #查看当前配置
gitconfig --global user.name "Dean" #设置用户名,邮箱
gitconfig --global user.email[email protected] #设置用户名,邮箱
gitconfig --global alias.cicommit #设置git命令的别名
gitconfig --global alias.cocheckout #设置git命令的别名
git仓库(repository):
#创建一个本地的git仓库并命名:
git initdemo
#克隆一个远程的git仓库到指定路径:
gitclonehttps://github.com/a396901990/android.git/path/workpsace
git分支(branch):
gitbranch #查看分支
gitremote show origin #查看所有分支
gitbranch <branchname> #创建新分支
gitcheckout <branchname> #切换到分支
gitcheckout -b <new_branch> #创建并切换到新分支
gitbranch -d <branchname> #删除分支(-D强删)
gitbranch -m <old> <new> #本地分支重命名
git添加(add):
git add<file> #将本地指定文件名或目录(新增和修改,没有删除)的文件添加到暂存区
git add. #将本地所有的(新增和修改,没有删除)文件添加到暂存区
git add-u #将本地的(修改和删除,没有新增)文件添加到暂存区
git add-A #将本地所有改动添加到暂存区(git add-A = git add . + git add -u)
git add-i #打开一个交互式界面按需求添加文件
git删除/重命名(rm/mv):
git rm<file> #删除文件
git rm-r<floder> #删除文件夹
git rm--cached <file> #从版本库中删除文件,但不删除文件
git mv<old_name> <new_name> #文件重命名
git提交(commit):
gitcommit -m"comment" #提交暂存区中的内容(已经add)并添加注释
gitcommit -a #把修改的文件添加到暂存区(不包括新建(untracked)的文件),然后提交。
gitcommit--amend #修改提交的commit(没有push)
gitcommit --amend -m "comment" #修改commit注解
git差异(diff):
gitdiff #查看工作目录(workingtree)暂存区(index)的差别
git diff--cached #查看暂存起来的文件(stage)与并未提交(commit)的差别
git diff--staged #同上
git diffHEAD #查看最后一次提交之后的的差别(HEAD代表最近一次commit的信息)
git diff--stat #查看显示简略结果(文件列表)
git diffcommit1 commit2 #对比两次提交的内容(也可以是branch,哈希值)
git查看历史(log):
git log
git log-3 #查看前3次修改
git log--oneline #一行显示一条log
git log-p #查看详细修改内容
git log--stat #查看提交统计信息
git log--graph #显示何时出现了分支和合并等信息
git查看状态(status):
gitstatus #查看你的代码在缓存与当前工作目录的状态
gitstatus -s #将结果以简短的形式输出
gitstatus --ignored #显示被忽略的文件
git存储(stash):
gitstash #保存当前的工作进度
gitstash save "message" #保存进度加说明
gitstashlist #显示进度列表
gitstashpop #恢复最新保存的工作进度,并将恢复的工作进度从存储的列表中删除
gitstashapply #恢复最新保存工作进度,但不删除
gitstashdrop #删除一个进度,默认删除最新的
gitstash clear #删除所有
git重置(reset):
gitreset --mixed #同不带任何参数的gitreset一样,重置暂存区,但不改变工作区
gitreset --soft #回退到某个版本,不改变暂存区和工作区(如果还要提交,直接commit即可)
gitreset --hard #彻底回退到某个版本,替换暂存区和工作区,本地的源码也会变为上一个版本的内容
gitreset #将之前用git add命令添加到暂存区的内容撤出暂存区(相当于git add-A 的反向操作)
gitresetHEAD # HEAD效果同上,因为引用重置到HEAD相当与没有重置
gitreset filename #将文件撤出暂存区(相当于git addfilename的反向操作)
gitresetHEAD^ #引用回退一次(工作区不变,暂存区回退)
gitreset --soft HEAD~3 #引用回退三次(工作区不变,暂存区不变)
git撤销(revert):
gitrevertcommit #撤销指定commit
gitrevertHEAD #撤销上一次commit
gitrevert -no-edit HEAD #撤销上一次并直接使用默认注释
gitrevert -nHEAD #撤销上一次但不commit
git合并(merge):
gitmerge<branch_name> #合并
gitmerge --no-ff <branch_name> #采用no fastforward的合并方式,这种方式在合并的同时会生成一个新的commit
gitmerge--abort #尽量回退到merge前的状态(可能会失败)
git重新基变(rebase):
gitrebase <branch_name> #
gitrebase --continue #执行rebase出现冲突解决后,执行该命令会继续应用(apply)余下的补丁
gitrebase --skip #跳过当前提交
gitrebase --abort #终止rebase,分支会回到rebase开始前的状态
git获取/拉(fetch/pull):
gitfetch #从远程获取最新版本到本地,不会自动merge
gitpull #从远程获取最新版本并merge到本地
git pull--rebase #暂存本地变更,合并远程最新改动,合并刚刚暂存的本地变更(不产生无用的merge的同步)
git推(push):
git pushorigin master #将本地分支推送到origin主机的master分支
git push-u origin master # -u指定origin为默认主机,后面就可以不加任何参数使用git push了
git push-f origin # -f强推,在远程主机产生一个"非直进式"的合并(non-fast-forwardmerge)
git push--all origin #将所有本地分支都推送到origin主