不断补充命令,方便查阅。
基本操作
初始化Git仓库
命令:git init
例:创建test目录,进入test目录,执行git init,如图:
一个名叫test的仓库就初始化好了,test目录下生成.git子目录。
查看仓库状态
命令:git status
例:执行git status,可以查看test仓库状态,如图:
跟踪新文件和向暂存区中添加文件
命令:git add
功能:有两个功能,一是跟踪新文件并提交到暂存区,二是提交修改文件到暂存区
例:该命令是向暂存区添加新文件或者暂存已经修改的已有文件。暂存区是提交之前的一个临时区域,其实就是一个文件。先创建一个要跟踪的文件README.md,执行
touch README.md
ls
创建和查看文件README.md,如图:
如果执行git status,会显示文件README.md未被跟踪,如图:
执行
git add README.md
git status
向暂存区添加文件和查看仓库状态,如图:
暂存区文件提交到仓库
命令:git commit
例:执行
git commit -m "First commit"
如图:
-m参数之后的"Firs commit"是对此次提交的一行描述信息。可以有多行描述,直接执行
git commit
此时会进入默认的vim编辑器,如果之前配置过编辑器(比如notepad++),执行命令后会打开notepad++,如图:
其实就是.git目录下的一个COMMIT_EDITMSG。现在就可以添加多行描述信息了,格式如下:
第一行:默认是空白行,可以在该行用一行文字简述提交的更改内容
第二行:空一行
第三行:从该行之后,可以记述更改的原因和详细内容
注意以#开头的内容将被忽略,会被认为是空,此时如果保存退出,结果会中止提交。再次执行git status,查看仓库状态,如图:
如果想要将修改过的跟踪文件直接提交到仓库,添加-a参数即可,即
git commit -a -m "commit directly"
没有被跟踪的文件不能执行此操作。
查看提交日志
命令:git log
执行git log,如图:
结果会按时间顺序显示,最新的提交显示在最前面。每条日志构成:commit、SHA-1校验和、作者姓名和邮箱、提交日期以及提交描述。添加-n参数可以列出最近n次提交的日志,如图:
-p参数可以列出每次提交引入的差异,如图:
如果要显示目录或文件的日志,在命令后面加上目录或者文件名:
git log test
git log README.md
其他参数:
--stat:每条提交日志下列出日志统计信息
--pretty=oneline:设置日志输出格式,oneline表示一行输出
--since=2.weeks(或者--after):列出最近两周内的所有提交
--until(或者--before):列出指定时间之前的日志
查看工作树和暂存区差别
命令:git diff
例:现在README.md中添加一行:
# git diff
,执行git diff命令,如图:
此时就能看到工作树和暂存区中README.md文件的差别了。将文件添加到暂存区,再次查看区别,如图:
此时就没区别了。
查看工作树和最近提交的差别
命令:git diff HEAD
例:如图
此时就能看到差别了。HEAD是指向当前分支中最近一次提交的指针。建议在执行git commit命令前先执行git diff HEAD,查看本次提交和上次提交的差别。
移除文件
命令:git rm
效果:从暂存区移除文件状态,并从工作区将文件删除
例:首先从工作目录中删除README.md文件,并查看仓库状态,如图:
此时文件已经从工作树中移除,但是文件移除状态并未提交到暂存区。执行
git rm README.md
命令,就可以将文件移除状态记录到暂存区,如图:
再执行git commit就可以将文件移除状态提交到仓库中。注意直接执行git rm README.md,会将README.md文件从工作区中直接删除。如果已经提交到暂存区的问价被修改后再次提交到暂存区,此时执行git rm README.md,无法删除,如图:
此时添加-f参数才能将从暂存区删除文件状态并从工作区移除文件,如图:
如果只想从暂存区删除文件状态,而将文件仍保留在工作区,添加--cached参数即可,如图:
移动文件
命令:git mv
例:执行命令,工作区的文件会重命名,仓库元数据不会记录此次重命名操作,如图:
如果直接给文件改名,git会认为将源文件删除了,并添加了一个未跟踪的新文件,如图:
分支操作
显示分支列表
命令:git branch
例:执行命令,如图:
列表表示仓库中只有一个master分支,*表示当前我们所在分支。
创建分支
命令:git branch feature-A
例:执行命令创建分支,并显示分支列表,如图:
此时feature-A分支创建成功,当前我们还是在master分支下开发。
切换分支
命令:branch checkout feature-A
例:执行命令切换到feature-A分支,并查看是否切换成功,如图:
feature-A分支前有星号,说明我们现在已经在该分支下,在该分支下修改代码并提交的话,代码会提交到该分支。下面尝试一下,在README.md文件中添加如下一行:
# feature-A
执行添加暂存区和提交仓库命令:
git add README.md
git commit -m "Add feature-A"
,如图:
切换到master分支,查看README.md文件,如图:
发现保持原来状态,并没有添加文字。
同时创建和切换分支
命令:git checkout -b
例:执行命令创建并切换到分支feature-B,如图:
切换到上一个分支
命令:git checkout -
例:刚才是从master分支切换到了feature-B分支,所以master是feature-B的上一个分支,现在执行命令再切回到master分支,如图:
查看每个分支上的最新提交
命令:git branch -v
例:
删除分支
命令:git branch -d [branch-name]
例:
其他分支操作命令
git branch --merged:查看并入当前分支的所有分支;
git branch --no-merged:查看尚未并入的所有分支;
主题(Topic)分支和主干分支
主题分支,顾名思议,集中实现单一主题,除此之外不进行任何作业的分支。开发中,常常创建多个主题分支,同时再保留一个随时可以发布软件的稳定分支,通常由master分支担当。基于特定主题的作业在主题分支中进行,主题完成后再与master分支合并。这样就能保证master分支可以随时提供查看。
主干分支是主题分支的原点,同时是合并的终点。通常将master分支作为主干分支。主干分支中没有开发到一半的代码,可以随时提供查看。主干分支有时需要配置在生产环境,有时需要使用Tag创建版本信息。可以创建多个主干分支,同时管理多版本发布。
分支合并
命令:git merge [branch-name]
功能:将branch-name分支合并到当前分支
例:之前创建了feature-A分支,假设现在该分支已经实现完毕,准备将它合并到master分支中,首先切换到master分支,然后执行
git merge feature-A
如图:
如果在合并分支时,想要提交合并分支的描述,在合并时添加--no--ff参数,如图:
执行命令后会打开如下编辑器(事先已经配置为notepad++),如图:
写好描述信息后保存关闭编辑器,命令行显示如图:
查看分支合并
命令:git log --graph
例:执行命令查看feature-A合并到master的日志,如图:
更改提交操作
撤销已暂存的文件
命令:git reset HEAD
执行命令将READ.md文件从暂存区撤销,如图:
撤销对文件的修改
命令:git checkout -- [filename]
例:先在文件readme.md中添加一些内容,然后查看仓库状态,再执行git checkout -- readme.md命令,文件readme.md又恢复到未添加内容之前,如图:
重新提交描述
命令:git commit --amend
例:有时提交之后发现忘了添加某些文件或者写错了提交信息,执行上面命令即可修改描述。
远程仓库使用
显示远程仓库
命令:git remote
例:先克隆远程仓库https://github.com/JavaLeb/bigdata到本地remote目录,如图:
进入bigdata目录,执行命令查看远程仓库,如图:
添加-v参数可以查看每个远程仓库名称和对应的URL,如图:
添加远程仓库
命令:git remote add
例:添加一个远程仓库https://github.com/JavaLeb/algorithm,如图:
从远程仓库获取和拉取数据
命令:git fetch [remote-name]
例:先在https://github.com/JavaLeb/bigdata远程仓库中,添加一个新的文件,如图:
这是新建文件,本地仓库还没有,现在将这个文件拉取下来,如图:
数据已经被拉取下来,但是不会自动将数据合并到本地工作区,也不会修改工作区任何数据,执行合并命令,如图:
此时才将文件拉取到本地工作区。
将数据推送到远程仓库
命令:git push [remote-name] [local-branch-name[:remote-branch-name]]
例:假设之前其他人已经推送数据到origin远程仓库,如果你直接推送,会报错,如图:
推送前需要先拉取别人的数据并合并到自己的工作区后才能推送。如图:
git push origin master,是将本地仓库master分支推送到远程仓库origin的 master仓库,更详细的写法应该是:
git push origin refs/heads/master:refs/heads/master
如果想将本地master分支推送到远程仓库的hotfix分支,应该执行:
git push origin master:hotfix
本地创建分支跟踪远程分支
命令:git checkout -b [local-branck-name] [remote-name/remote-branch-name]
例:git checkout -b hotfix origin/hotfix,此时在本地创建了一个hotfix跟踪远程仓库的hotfix,并切换到hotfix下。
检查远程仓库
命令:git remote show [remote-name]
例:
重命名远程仓库
命令:git remote rename [oldname] [newname]
例:
删除远程仓库
命令:git remote rm ag
例:
克隆仓库的.git目录
命令:git clone --bare [store-name] [.git-name]
例:例如仓库testgit中有工作区等目录,现在只拷贝.git目录下的所有文件,而不需要工作区,就可以使用下面命令:
git clone --bare testgit testgit.git
导出的仓库是.git目录下的文件,现在就导出到testgit.git目录下了,如图:
标记
Git标记有两种类型:轻量标签(lightweight tag)和注释标签(aunotated tag),注释标签作为对象存储在Git数据库中,包含标记者名字、邮箱、创建时间和标记信息等,而轻量标签只是一个指向某次提交的指针,不包含上面标记信息,一般作为临时标签。推荐创建注释标签。
创建注释标签
命令:git tag -a [tag-name] -m [tag message]
例:创建一个v1.0注释标签,如图:
列举标签
命令:git tag
例:查看刚创建的注释标签,如图:
查看标签
命令:git show [tag-name]
例:
显示出了标签数据以及对应的提交。
创建和查看轻量标签
命令:git tag [tag-name]
例:创建轻量标签不需要添加-a和-m等参数,一般在轻量标签后添加lw后缀,以与注释标签区分,如图: