关于GIT VCS的使用(公司资料)



附件是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

1Git add 详解

add将当前工作区的改动保存到暂存区。

 

在一次commit之前,可以进行多次add。也就是说,可以只改动一点就add,一次commit即可。

 

git add<pathspec>

pathspec可以是一个确定的文件,也可以用统配符,比如 git add *.cadd所有.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>命令:会用版本库中的文件替换暂存区和工作区中的文件,工作区的修改会被清除,暂存区未提交的修改也会被清除。

 

2git 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 -- filenamegitreset HEAD filename:仅将 filename文件的改动撤出暂存区(仅将filename文件从版本库中重置到暂存区),暂存区中的其它文件不变。相当于对gitadd filename的反操作。

 

3git checkout

git checkout的默认值是暂存区(这点与reset命令不同),此检出命令主要用来覆盖工作区(如果不省略<commit>参数,也会覆盖暂存区文件)

 

agitcheckout <branch>

   用于切换 分支

   git checkout -b <branch>

  新建分支,并切换到该分支

bgitcheckoutgit checkout HEAD

   汇总显示工作区、暂存区与HEAD的差异

cgitcheckout -- filename

  用暂存区的文件来覆盖工作区的文件

    git checkout -- .          git checkout .    :用暂存区的文件覆盖所有工作区的文件,相当危险。

 

dgit checkout HEAD^(或是其他的commit id

    HEAD^(或是其他的commit id)指向的版本库中的文件,替换当前工作区的文件,当前的工作区处于一个detached HEAD(游离HEAD),此命令可用于查看版本库的某一历史文件;如果修改了文件,也不会被保存,如果想要保存 ,使用:git checkout -b new_branch_name,创建基于当前游离HEAD的分支 。

4git init,remote, clone, pull, push, fetch

a、在本地建立服务器仓库(远端仓库)

mkdir xx.git

cd xx.git

git init --bare

--bare参数表明创建一个“裸”仓库,该仓库不包含工作目录,仅包含git的一系列版本历史记录文件,也就是说不能在此目录下工作(不能使用git status查看状态等,但是可以用gitk查看历史)。目的是为了防止服务器仓库有人在操作某一分支,客户端有人向同样的分支提交而造成提交失败等一冲突问题。

 

bclone命令

格式:git clone <xxxx.git> <本地目录名>

本地目录可以省略,则clone到当前目录

b.1)只clone某一分支

git cloneb <branch> xxxx.git

默认则clone所有分支,但是只显示master分支;

b.2clone所有分支

git clone xx.git

git brancha    //显示所有的分支(包括隐藏的分支)

git checkoutb <branch>remote/origin/<branch>   //基于远程的branch分支创建本地branch分支并切换到branch分支

 

cremote

为了便于管理,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 <主机名>

 

dfetch

一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。

d.1)取回全部分支

git fetch <远程主机名>

d.2)取回指定分支

git fetch <origin> <master>

 

epush

将本地分支推送到远程主机

git push <远程主机> <本地分支>:<远程分支>

将本地分支(比如master)推送到远程主机的某一分支上(比如master

git push xxx.git branch1:branch1

将本地的branch1分支推送到xxx.gitbranch1,如果xxx.git上不存在branch1,就会被创建一个。

 

git push xxx.git test:master

将本地的test分支推送到xxx.git上,并作为其master分支

 

git push xxx.git :test

推送一个空分支到xxx.gittest分支,即删除xxx.git上的test分支

默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。
1.push
单个tag,命令格式为:git pushorigin [tagname]
例如:
git push origin v1.0 #
将本地v1.0tag推送到远端服务器
2.push
所有tag,命令格式为:git push[origin] --tags
例如:
git push --tags

git push origin --tags

fpull

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

6git tag

git tag 有两种形式:轻量型和带注释的标签。

 

列出所有标签

git tag

 

创建轻量级标签

git tag <v1.0>

 

创建带注释的标签

git taga <v1.0> -m <comments>

 

查看某tag 处的文件

git checkout tag_name

此时,可查看该tag时刻的文件,但处理一种分离的分支( detached),不能够提交,仅能查看,拷贝。若需要在此 tag基础上修改文件,可从此处新建一个分支: gitchechoutb <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

你可能感兴趣的:(工作,git,教程,简单)