Git基本命令
git init
执行这个命令后,会在当前目录下建立一个.git的隐藏文件。这个文件下包含了初始化Git仓库的所有文件。具体内容有:
(暂时不知道这些文件的具体含义,留白待更)
执行了这个init命令仅仅是做了一些初始化操作,并没有跟踪任何文件。
git clone
命令格式是:git clone [url],例如:git clone https://github.com/libgit2/libgit2。这个命令的执行是获取url所指向的一份仓库副本,几乎包含此仓库的所有数据(为什么是几乎?),默认是此Git仓库的每一个文件的每一个版本的所有数据。git clone使用的协议有https://、git://或着SSH协议。
git status
查看文件的状态。这里需要了解文件有哪些状态,下图能够给予直观的解释:
重点解释未跟踪文件的定义(Untracked files),这类文件是Git快照未包括的文件,我的理解是这类文件未与Git建立联系。
git status --s或git status --short命令可以等到更加紧凑的输出。
git add
跟踪文件,将未跟踪文件纳入到Git中管理。参数是文件名或目录的路径,如果参数是目录则会递归地跟踪该目录下的所有文件。这个命令的含义是"添加内容到下一次提交中",add的意思是"将......添加到暂存区域,等待提交"。
注意,如果在git add后又修改了文件,则git status会出现文件同时存在暂存区和非暂存区的情况,这是因为Git暂存的是add命令后的版本,不是工作目录的当前版本。
cat .gitignore
建立.gitignore这个文件,定义一些文件模式,则Git会忽略这些文件,不进行管理。文件格式规范如下:
- 所以空行或以#开头的文件
- 标准glob模式匹配的文件
- 匹配模式以/开头防止递归
- 匹配模式以/结尾指定目录
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反
git diff
以文件补丁的形式查看文件的具体变化,比较的是工作目录中文件与暂存区域快照的区别,也就是修改后未暂存的文件变化,注意diff比较的不是自从上次提交后的文件变化。git diff --cached或git diff --staged表示已暂存的尚未提交的文件变化。
git commit
将暂存区域的文件提交到仓库。git commit -v可以展示更详细的关于修改内容的提示,git commit -m添加一些提交信息。git commit -a可以跳过暂存区域,将所有已跟踪文件的修改一起送入到仓库,即省略了git add过程。
git rm
从暂存区域移除某个已跟踪文件。直接使用这个命令会导致工作目录的文件也被删除,git rm --cached可以解决这个问题。git rm --f强制删除之前修改过并且已经放到暂存区域的文件(没太理解清楚!)。
git mv
文件重命名。命令格式是:git mv file_from file_to。
git log
查看提交历史。直接使用这个命令会列出所有的历史信息,最近的条目在上。git log -p显示每次提交的内容差异。git log -stat显示每次提交的简略信息。--pretty选项可以以不同于默认格式的方式展示历史信息。例如git log --pretty==oneline、git log --pretty==short、git log --pretty==full或git log --pretty==fuller等。
最灵活的是format选项,可以定制各种格式,常用选项如下:
选项 | 说明 |
%H | 提交对象(commit)的完整哈希字串 |
%h | 提交对象的简短哈希字串 |
%T | 树对象(tree)的完整哈希字串 |
%t | 树对象的简短哈希字串 |
%P | 父对象(parent)的完整哈希字串 |
%p | 父对象的简短哈希字串 |
%an | 作者(author)的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date= 选项定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者(committer)的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期,按多久以前的方式显示 |
%s | 提交说明 |
例:git log --pretty=format:"%h - %an, %ar : %s"。
git log的常用选项如下:
选项 | 说明 |
--stat | 显示每次更新的文件修改统计信息。 |
--shortstat | 只显示 --stat 中最后的行数修改添加移除统计。 |
--name-only | 仅在提交信息后显示已修改的文件清单。 |
--name-status | 显示新增、修改、删除的文件清单。 |
--abbrev-commit | 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 |
--relative-date | 使用较短的相对时间显示(比如,“2 weeks ago”)。 |
--graph | 显示 ASCII 图形表示的分支合并历史。 |
--pretty | 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。 |
限制git log输出的选项:
选项 | 说明 |
-(n) | 仅显示最近的 n 条提交,如git log -2 |
--since, --after | 仅显示指定时间之后的提交 |
--until, --before | 仅显示指定时间之前的提交 |
--author | 仅显示指定作者相关的提交 |
--committer | 仅显示指定提交者相关的提交 |
--grep | 仅显示含指定关键字的提交 |
-S | 仅显示添加或移除了某个关键字的提交 |
git commit --amend
这个命令可以尝试重新提交。如果自从上次提交以后还未进行修改,那么快照不会改变,只是修改了提交信息,例如在某次提交后发现落下了一个文件,则可以使用这个命令进行补充。如:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
git reset HEAD <file>...
这个命令用来取消暂存,也就是将文件从暂存区域取出,下次提交时不会存入仓库。
git checkout --<file>
这个命令用来取消修改,使文件回到上次提交时的状态。git checkout -b <new branch>新建一个分支并切换到此分支
git remote
查看所有已经配置的远程仓库服务器。git remote -v显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。git remote add <shortname><url>用来添加一个新的远程服务器,并且可以为其设置一个简写名称。
git fetch [remote-name]
这个命令会拉取远程服务器中本地缺少的数据,但是它不会修改或合并本地工作目录,需要手动操作。
git pull
这个命令与git fetch的区别在于它会自动合并工作目录,也就是pull=fetch+merge。
git push [remote-name] [branch-name]
将[branch-name]推送到[remote-name],将本地工作目录的内容备份到服务器,但是前提要求具有[remote-name]的写入权限,并且之前无人推送过更新,否则将被拒绝执行此命令。
git remote show [remote-name]
查看[remote-name]的更多信息。
git remote rename
用于修改远程仓库的简写名字。
git remote rm
移除远程仓库。
git tag
列出所有标签。选项-l可以完成特定模式标签的展示。
Git中有两种标签:轻量标签和附注标签。轻量标签是对特定提交的引用,更像一种不会改变的分支。附注标签则存储在Git数据库中,包含着许多信息,例如打标签者的名字、邮件地址、日期时间等,更为常用。git tag -a可以创建一个附注标签,同时使用-m选项指定存储在标签中的信息。git show [tag-name]可以展示这个标签的信息。轻量标签只需要在git tag后面加入名字即可创建。
git push [remote-name] [tag-name]可以将标签推送到远程服务器,--tags用来推送多个标签。
git checkout -b [branch-name] [tag-name] 在特定的标签上创建一个分支,因为标签不能像分支一样移动,这种方法可以是工作目录和仓库上的标签一致。
git config --global alias.xx xx
这个命令用来为特定命令设置一个别名。
北京 15th