最近想系统学一下Git,而不仅仅是简单的拉取和推送。然而我查阅Git的官方文档的时候,因为懒得看英文,网页设置为谷歌自动翻译,但是”git”在英文中是混账、饭桶的意思,所以出现了啼笑生非的一幕:
因此,为了使用方便(头不笑掉),这里把git常用的一些命令记录下来。建议使用最新版本。
官方文档参见Git Reference,内容完整,不过可读性一般。当然,现代IDE内部一般都集成了git,所以只需要了解个大概就行。
常见词汇
repo:repository的简称,指代本地或远程仓库。
工作树:一般指实际操作的目录,目录结构是树型的。
索引(index):也叫暂存区,逻辑结构上位于工作树和版本库之间。工作树状态提交到索引,再由索引数据添加到版本库。一般来说,当前在目录上进行改动视为在暂存区更改,只有commit后才会成为新的版本。
分支(branch):进行版本控制时可以有多个不同分支,互不影响,可以有多种修改。主分支为”master”。
HEAD:指向现在使用的分支的最后一次更新,在/git/HEAD。
版本:每次提交作为一个版本,每个版本都会有自己的版本信息。可视为分支上的结点。
commit:提交,一次提交生成一个版本。
.git:版本库目录。
.gitignore:可以理解为”git ignore”,告诉git哪些文件不需要进行版本控制。
定义的环境变量
HOME:git的全局配置位置。
GIT_ALTERNATE_OBJECT_DIRECTORIES:告诉 Git 到哪里去找不在 GIT_OBJECT_DIRECTORY 目录中的对象。 如果你有很多项目有相同内容的大文件,这个可以用来避免存储过多备份。
GIT_DIR:生成.git的工作目录,如果没有设置, Git 会按照目录树逐层向上查找 .git 目录,直到到达 ~ 或 /。
GIT_EDITOR:用户需要编辑文本时git使用的编辑器。
GIT_EXEC_PATH:git寻找根据此路径找子程序,git –exec-path查看。
GIT_HTTP_LOW_SPEED_LIMIT:若git网络操作在网速低于GIT_HTTP_LOW_SPEED_LIMIT字节/秒,并且持续 GIT_HTTP_LOW_SPEED_TIME 秒以上的时间,Git 会终止这个操作。
GIT_ICASE_PATHSPECS:让所有的路径规范忽略大小写。
GIT_INDEX_FILE:索引文件的路径。
GIT_NOGLOB_PATHSPECS:若设置为1,通配符将仅作为字符匹配,如*.c只匹配名为*.c的文件。
GIT_OBJECT_DIRECTORY:对象储存目录,.git/objects 目录的位置。
GIT_TEMPLATE_DIR:临时目录。
GIT_TRACE_SETUP:显示 Git 发现的关于版本库和交互环境的信息
PREFIX:系统级别的配置。
关于提交
GIT_AUTHOR_NAME :“author” 字段的可读名字。
GIT_AUTHOR_EMAIL: “author” 字段的邮件。
GIT_AUTHOR_DATE : “author” 字段的时间戳。
GIT_COMMITTER_NAME : “committer” 字段的可读名字。
GIT_COMMITTER_EMAIL : “committer” 字段的邮件。
GIT_COMMITTER_DATE : “committer” 字段的时间戳。
EMAIL:如果 user.email 没有配置, 就会用到此指定的邮件地址。
基本指令
关于参数
在本文中,指令下方附带常用参数,本文用@p表示参数填入位置,参数可多选。参数前横杠规律:
单字母参数前一个横杠,如-a;
单词参数前两个横杠,如–option;
多单词参数最前面两横杠,单词间一横杠,如–on-contains。
分享与更新类指令
git init @p
初始化命令。在当前目录(如果指定了GIT_DIR将使用此目录)创建一个空的 Git 存储库或重新初始化现有的存储库,产生.git目录作为版本库。
-b <分支名称> - 为新创建的存储库中的初始分支使用指定的名称
git clone [仓库url] @p [目录]
将存储库内容克隆到本地目录,可以是远程主机的储存库。Git 支持 ssh、git、http 和 https 协议。
git clone https://github.com/git/git/archive/v2.17.0.tar.gz
git add @p [文件或目录路径]
将文件内容添加到暂存区中,会递归添加指定目录下所有文件,或是可以并排添加多个。添加”Documentation/“支持正则匹配,如
$ git add Documentation/\*.txt
匹配目录及子目录下所有txt文件。不含’'将不会搜索子目录。直接用*就是当前目录下所有文件。
-A 添加指定目录下所有文件,若未指定则当前目录。
-p 交互式地列出并询问前后版本差异,确认是否更改。(很细致)
-u
git commit @p
创建一个提交,记录对储存库的更改。这是对储存库的更新。
-m 参数后接字符串作为提交的信息(为什么做这次更改)。
-a会将没有使用git add的文件也提交到库。
git commit提交规范建议
(Link provided by las)
git config @p [配置项] [值]
配置git使用的信息,如git config –global user.name “passacaglia”配置用户名。
–global 全局配置,而非仅当下储存库。
git push @p <远程主机名> <本地分支名>:<远程分支名>
推送指令;提交本地仓库以更新远程仓库。
-u 绑定选项
-f 强制提交,会覆盖之前所有内容
比如我要上传到github,也可使用git remote add origin git@github.com:<用户名>/<仓库名>关联仓库。
一般一个完整的流程是git init创建仓库,git add添加内容到暂存区,git commit提交到本地库,git push推送到远程仓库。
git pull @p <远程主机名> <远程分支名>:<本地分支名>
拉取指令。获取远程仓库的内容合并到本地。
注:如果分支名相同,只需要写一个,省略冒号。
查看信息类指令
git diff @p
命令比较文件的不同,即比较文件在暂存区和工作区的差异。
–cached 查看已缓存的改动。
–stat 只显示摘要
HEAD 查看所有的改动
git status @p
查询仓库的当前状态。
-s 输出标记会有两列。
git log @p
查看历史记录,无参数时查看过去的提交信息和版本号。
–online 仅显示简洁版本。
–reverse 倒序显示日志。
–graph 拓扑图选项,可以看到何时出现分支和合并。
–author 只查看指定作者的日志。
分支操作类指令
git branch @p <分支名>
列出、创造或删除分支。
–list:列出目前已有的分支,当前所处分支绿色高亮表示。
-d:删除指定的分支
git checkout @p <分支名>
切换分支或恢复工作树文件。
git checkout master //切换到master分支
-b <分支名> 创建一个本地分支并切换
git merge <分支名>
从分支的分歧开始,将两个或多个开发历史合并在一起。将指定分支合并到HEAD指定的分支。
快进合并(Fast-Forward):通常的合并方式如图:
快进合并后原有的两条分支在逻辑上合成一条,就像快进了一样。比如topic合并到master后,只剩下D-E-F-G-H-A-B-C,但是HEAD位置仍在原位置。
git rebase
快速合并分支,当从分支B融合到A上时,直接删除分支B,将分支B与A分歧的部分直接添加在A后面。
补丁修改类指令
git revert <版本号>
通过提交一个新的版本,在这个版本中撤消过去某个版本A所做的变化,来达到删除A的影响的目的。
注:<版本号>内容为HEAD时,指当前版本;HEAD^为上次,HEAD^^为上上次,以此类推。也可以用HEAD~n表示当前版本以前n个版本。
git reset @p <版本号>
从当前位置A回退到之前的某个版本B。
–hard 回退到指定版本号,期间的版本全部丢弃。
–soft 回退到之前的指定版本。
注:由于回退后本地版本库可能会比远程库旧,下一次git push时需添加-f选项强制执行。
常用的大概就这些,日后需要再添加。版本管理是一件值得做的事,一旦版本多了再管理就会很混乱。
如果有任何有错误或不够清晰的表达,欢迎邮件至 passacaglia@88.com,谢谢!