摘要:本篇文章将记录git常用命令介绍和使用,主要包括clone、init、add、mv、reset、rm、log、status、branch、checkout、commit、fetch、pull、push。
clone:克隆一个仓库到新目录
从远程主机克隆一个版本库。
$ gitclone<版本库的网址>
比如版本库网址为https://github.com/naffitary/gitstudy.git。
$ gitclonehttps://github.com/naffitary/gitstudy.git
该命令会在本地主机生成一个目录,与远程主机的版本库同名 。
如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
$ git clone<版本库的网址><本地目录名>
比如
$ gitclonehttps://github.com/naffitary/gitstudy.git project.git
该命令会在当前目录下生成project.git 内容从版本库的网址中克隆。
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等。
init:创建一个空的Git仓库或重新初始化现有的Git仓库
运用mkdir命令创建一个git目录
$mkdirproject.git
创建了project.git 目录,但没有输出。
切换到xxx.git目录(这里我用的是project)下
$cdproject.git/
切换到project.git目录下,没有输出。
显示目标列表,跟后面产生对比
$ls
没有输出。
初始化仓库
$ git--bare init
输出Initialized empty Git repository in D:/php相关/git/Git/project.git/,表示初始化完毕,没有出错。而且project.git 目录会有bare标志,显示为project.git (BARE:master)
再次显示目标列表,跟前面产生对比
$ls
输出project.git 下的目标列表config description HEAD hooks/ info/ objects/ refs/
add: 添加文件内容到索引
git add , 只将那些创建或修改并且没有被删除的文件添加到索引,其中可以是文件,也可以是目录。(aa就是我建的一个目录。)
$gitaddaa
这里我遇到一个问题,正确add任何存在的文件会提示错误信息,其它git所属命令(除init)也会提示错误信息:fatal: This operation must be run in a work tree。通过查找资料和实践发现,可能是我创建的是空仓库的缘故,在git --bare init之后,先后输入git init和git remote add origin命令然后git add aa,就可以正确添加了。
git add -u ,把中所有跟踪文件中被修改过或已删除文件的信息添加到索引库。 它不会处理没有跟踪的文件。
$gitadd-u aa
git add -A ,把中所有跟踪文件中被修改过或已删除文件和所有未跟踪的文件信息添加到索引库。
比如,$git add -A aa
git add -i , 查看中被所有修改过或已删除文件但没有提交的文件,
并通过其revert子命令可以查看中所有未跟踪的文件,同时进入一个子命令系统。
比如
$gitadd -iaa
git add --all,添加当前目录下的所有的目录和文件。
$ gitadd--all
以上前4点,都可以用.表示路径path,表示当前目录。$git add .,$ git add -u. ,$ git add -A .,$ git add -i .。
比如 输入
$ gitadd-i .
输出以下信息。
staged unstaged path
1: +1/-0+0/-0gitstudy
*** Commands ***
1:status2: update3:revert4: add untracked
5: patch6:diff7:quit8: help
选择子命令command(注意:可以输入序号,也可以输入命令单词),命令1是状态,显示路径上的变化;命令2是更新,将工作状态树添加到更改组 ;命令3是还原,还原更改组到头版本;命令4是添加未跟踪,添加未跟踪文件的内容到更改组;命令5是修补程序即补丁,挑选可行的以及选择性更新;命令6是差异, 比较单个文件或者目录内容;命令7是退出,退出该命令选项;命令8是帮助,显示其他命令的作用,帮助使用。
mv:移动或重命名文件,目录或符号链接
用$ ls查看当前目录下的文件和目录,可以看看准备移动的文件存不存在,为后面操作做准备。可以看到当前目录下有以下文件和目录11.txt aa/ pro.git/ README.md。
移动11.txt到aa目录下:
$ git mv11.txtaa
移动完后,查看一下状态,看看有没有移动成功。
$ git status-s
可以看到状态结果如下:
Aaa/11.txt
?? pro.git/
或者再用$ ls查看当前目录下的文件和目录,可以看到,当前目录下文件和目录为aa/ pro.git/ README.md,aa目录下多了11.txt,也能说明移动成功。
reset: 将当前HEAD复位为指定状态
如果发现错误的将不想staging的文件add进入index之后,想回退取消,则可以使用如下命令:
gitresetHEAD...
同时git add完毕之后,git也会做相应的提示。
git reset[--mode ][或HEAD]
将当前的分支重设(reset)到指定的或者HEAD(如果不显示指定commit,默认是HEAD,即最新的一次提交)。mode的取值可以是hard、mixed。
gitreset--hard
重设index和working directory,自从以来在working directory中的任何改变都被丢弃,并把HEAD指向。
gitreset--mixed
仅重设index,但是不重设working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,也不会被标记成"Changes to be committed"。
rm:从工作树和索引中删除文件
使用格式:
git rm [] [--] ...
-n, --dry-run 干运行
-q, --quiet 不列出删除的文件
--cached 只能从索引中删除
-f, --force 覆盖最新的检查
-r 允许递归删除
--ignore-unmatch 退出零状态即使没有匹配
注意:$ git rm文件名 ,必须在跟踪并提交到仓库中即add和commit后,才能删除。如果是已提交并修改后的文件和目录,需要用git commit -a -m文件名或git commit -a选择提交,不然会提示错误信息,error: the following file has local modifications:文件在本地被修改了。直接用git commit -m文件名或git commit选择提交是无法正常删除的,因为虽然没有提示错误信息但实际上并没有commit成功。
log:显示提交日志
不带参数,会显示所有的历史记录
$gitlog
按时间输出,最近的在最上面,
commit8deb05890c4a3d3a5da0085e8d93fde6a8105076 (HEAD->master, origin/master, origin/HEAD)
Author: naffitary <2219165492@qq.com>
Date: Wed Jul513:32:372017+0800
Initialcommit
带参数-p,按补丁显示每个更新间的差异。
commit8deb05890c4a3d3a5da0085e8d93fde6a8105076 (HEAD->master, origin/master, origin/HEAD)
Author: naffitary <2219165492@qq.com>
Date: Wed Jul513:32:372017+0800
Initialcommit
diff--git a/README.md b/README.md
newfilemode100644
index0000000..a077ed0
--- /dev/null
+++ b/README.md
@-0,0+1@@
+# gitstudy
\Nonewlineatendoffile
带参数--stat,显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
$ git status-s
输出信息没有-p命令详细。
AD aa/gitstudy.git
??11.txt
?? pro.git
status:显示工作树状态
输出详细状态信息用$ git status,输出简短状态信息用$ git status -s。
branch:列表,创建或删除分支
git branch命令的-r选项,可以用来查看远程分支。
$ gitbranch-r
输出
origin/master
-a选项查看所有分支。
$ gitbranch-a
输出
*master
remotes/origin/master
上面命令表示,本地主机的当前分支是master,远程分支是origin/master。
checkout:切换分支或恢复工作树文件
使用git checkout命令创建一个新的分支。
$ git checkout -bnewBrachorigin/master
上面命令表示,在origin/master的基础上,创建一个新分支。
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
$ git merge origin/master
或者
$git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
commit:将更改记录添加到仓库中
注意:养成在一开始就输入以下命令,来事先设置邮箱和用户名,以防远程操作的命令出错。
$ gitconfig--global user.email “2219165492@qq.com”
$ gitconfig--global user.name “naffitary”
$git commit -m"提交的描述信息"
如果我们这里不用-m参数的话,即$ git commit;git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息,前面有#将会被无视,若想被commit去掉前面的#并ZZ或:wq保存并退出,git commit -a也是如此。
$ git commit -a-m"提交的描述信息"
git commit命令的-a选项可只将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。如果只是修改或者删除了已被Git管理的文档,是没必要使用git add命令的。
git add .命令除了能够判断出当前目录(包括其子目录)所有被修改或者已删除的文档,还能判断用户所添加的新文档,并将其信息追加到索引中。
$ gitcommit--amend
对于已经修改提交过的注释,如果需要修改,可以借助git commit --amend来进行。
fetch:从另一个存储库下载对象和引用
将远程主机的版本库的更新(Git术语叫做commit)取回本地。默认情况下,git fetch取回所有分支(branch)的更新。
$ git fetch<远程主机名>
比如,
$git fetch origin
如果只想取回特定分支的更新,可以指定分支名。
$ git fetch<远程主机名><分支名>
比如,
$ git fetch originmaster
pull:从另一个存储库或本地分支中拉取并集成
取回远程主机某个分支的更新,再与本地的指定分支合并。
$ git pull<远程主机名><远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并:
$ git pull originnext:master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$git pull originnext
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
$git fetch origin
$git merge origin/next
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
$git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
$git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
push:推送更新远程引用以及关联的对象
将本地分支的更新,推送到远程主机。
$ git push<远程主机名><本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ gitpushoriginmaster
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ gitpushorigin:master
等同于
$ gitpushorigin--deletemaster
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ gitpushorigin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ gitpush
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
$ gitpush-uoriginmaster
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有对应的远程分支的本地分支。如果要修改这个设置,可以采用git config命令。
$ gitconfig--global push.defaultmatching
或者
$ gitconfig--global push.defaultsimple
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。
$git push --allorigin
上面命令表示,将所有本地分支都推送到origin主机。