引言:基于图形界面 Git 的使用已经熟练掌握了。偶尔遇到要使用命令行的情况。在此进行简单记录。
时间:2016年11月18日15:26:29
作者:JustDo23
01. 参考
廖雪峰 Git 教程 哈哈~没啥说的,强烈建议去看看。本文即个人笔记。
关键字
Git 的历史
,集中式
和分布式
,版本库
,安全性
,分支管理
,CVS
,SVN
,Git 的安装
,仓库
,repository
,工作区
,暂存区
,远程仓库
,GitHub
,SSH
,公钥
,私钥
,分支
,冲突
,标签
。
02. 配置用户
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为 Git 是分布式版本控制系统,所以每台机器都需要进行自报家门。
注意:命令中的--global
参数是全局配置,整个机器上所有 Git 仓库的全局配置。
03. 创建仓库
$ git init
在一个空文件夹中执行命令,创建一个空的仓库。基本上瞬间就创建成功了,成功会有提示。
创建成功之后会在目录下生成一个.git
的目录,这个目录是 Git 自动生成的用来跟踪管理版本库
的,不要对其进行修改,否则会破坏版本库。这个目录是隐藏
的,使用命令ls -ahf
进行查看。
注意:文件夹可以不是空,可以有文件。.git
目录千万不要随便修改。
04. 追踪文本
这里明确一下,所有的版本控制系统,都是只能追踪文本的改动。音频
,图片
,Microsoft 的 Word
等都是二进制格式的,不能进行详细版本追踪。
文本都是有编码格式的,这里建议使用标准的UTF-8 编码
。
05. 查看状态
$ git status
使用命令可以查看当前版本库中文件跟踪的状态。文件状态会用不同的颜色进行标注。
- 未添加追踪的文件——红色
- 新添加的文件——绿色
- 修改的文件——红色
06. 添加文件追踪
$ git add <file>
$ git add .
add 命令
将文件添加追踪,如果指定了文件名称,则是将指定的文件进行添加追踪。如果使用.
进行 add 则代表将所有未添加追踪的文件进行添加。
07. 提交本地仓库
$ git commit
$ git commit -m "注释"
commit 命令
需要注意的是,commit 操作需要有相关的注释说明,对当前 commit 操作进行相关的解释说明。使用-m “注释”
是代表加上注释进行 commit,如果没有使用则同样会跳转填写注释的界面。
commit 操作成功会有相关的提示。
08. 查看修改
$ git diff
diff
其实就是difference
的意思了。在对文件修改之后,可以使用命令查看具体修改的内容。
09. 查看提交记录
$ git log
$ git log --pretty=oneline
使用git log
命令可以查看从最近到最远的提交记录。参数--pretty=oneline
只是为了更好的查看提交记录。
10. 版本回退
$ git reset --hard HEAD^
在进行版本回退之前,一定要明确,当前版本是什么,将要回退的版本是什么。在 Git 中,使用HEAD
表示当前版本,使用HEAD^
表示上个版本,使用HEAD^^
表示上上个版本。如果往上100个版本,则使用HEAD~100
来表示。
使用命令cat file
可以查看文件的内容。
$ git reset --hard commit_id
除了使用HEAD
之外,同样可以使用每次 commit 的commit id
进行回退操作。回退到之前或者之后的操作。在操作过程中 commit_id 并不是必须写全了,可以写开头几位,git 会自动去查找的。
11. 查看历史 commit id
$ git reflog
命令会显示出每次操作的id
,从中可以找到历史的id
进行使用。
12. 工作区和暂存区
-
工作区[Working Directory]
就是在电脑上直接看到的目录 -
版本库[Repository]
在工作区目录中有一个隐藏的.git
目录就是 Git 的版本库 -
暂存区[stage]
在版本库中有暂存区,所有的修改都会先添加至暂存区,使用add
命令添加至暂存区 -
分支[branch]
在版本库中可以有多条分支,默认生成的是master 分支
,使用commit
命令提交至分支 -
HEAD 指针
同样是存在于版本库中,这是一个指针,指向分支
回顾一下把文件添加到 Git 版本库的两个步骤:
- 使用
git add
把文件添加进去,实际上是把文件添加进了暂存区 - 使用
git commit
进行提交更改,实际上就是把暂存区的所有文件提交到当前分支
Git 跟踪并管理的是修改,而非文件。
13. 撤销修改
$ git checkout -- <file>
执行此命令可以丢弃工作区的修改,将工作区文件还原到最近一次git add
或者git commit
时的状态。
命令中的--
很重要,没有--
命令就会变成切换分支的命令。
- 文件修改后,没有被添加进暂存区,现在,撤销修改就回到和版本库中一样,也就是最近一次 commit 时的状态。
- 文件修改后,已经被添加进暂存区,接着又进行了修改,现在,撤销修改就回到和暂存区中一样,也就是最近一次 add 时的状态。此种情况下撤销修改需要先有以下操作。
$ git reset HEAD <file>
执行命令,可以把暂存区
中的修改进行撤销。
git reset
命令可以进行版本回退
,也可以把暂存区中的修改回退到工作区
。使用HEAD
时,表示最新的版本。
14. 删除文件
$ git rm <file>
执行命令后可以将本地文件进行删除,命令之后需要继续使用commit
命令将删除进行提交。另外,命令执行之后,是无法使用checkout
将文件还原的,此时还原文件需要使用reset
命令回退版本库。
另外,删除文件同样可以先在文件目录中将文件直接删除,然后执行add
命令,再执行commit
命令进行提交。如果是直接本地删除的话,可以使用checkout
命令进行还原。
15. SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
本地仓库和远程仓库之间的传输是通过SSH
进行加密的。所以需要创建并配置SSH Key
。
执行命令之后,可以在用户主目录
下看到.ssh
目录,应该是一个隐藏文件夹。打开目录之后会看到id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key
的秘钥对。其中,id_rsa
是私钥,不能对外泄露;id_rsa.pub
是公钥,用公钥进行远程仓库的配置。
另外,在使用图形化界面的时候,不用配置 SSH Key 但是其实走的是账号密码的形式进行加密和校验的。
16. 关联远程仓库
$ git remote add origin git@server-name:path/repo-name.git
当我们在远程仓库创建出一个新的仓库的时候,会获得一个远程仓库的连接地址,直接复制地址并在本地仓库执行命令,就可以将本地仓库和远程仓库建立连接。
$ git push -u origin master
连接建立成功之后,远程仓库此时仍然是空的,我们需要进行第一次的提交,将本地仓库的所有内容推送到远程仓库。第一次推送的时候注意需要加上-u
的参数。Git 不但会把本地master
分支上所有内容提交到远程master
分支,还会把本地master
分支和远程master
分支关联起来。
$ git push origin master
那么以后再进行提交就会简单,不用再加上-u
的参数了。
另,origin
代表了远程仓库的意思。
17. 仓库克隆
$ git clone git@server-name:path/repo-name.git
使用clone
命令可以将远程的仓库克隆到本地。
另,在第一次使用clone
或者push
命令时候,可能会有一个 SSH 连接警告,第一次连接时候 SSH Key 的指纹验证。输入yes
进行添加信任就可以了。
18. 分支管理
分支的概念初次接触其实还是有些摸不着头脑的。SVN 和 Git 都是支持分支操作,但是 Git 的分支管理更加的快捷好用。git init
命令初始化仓库的时候会默认生成master
主线,也就是master
主分支,之后的文件修改提交等都在master
分支上进行。多分支就像是多个平行的互补干扰的线。分支可以进行切换,可以进行合并。
master
分支指向提交,HEAD
指针执行master
分支,也就是HEAD
指针指向当前分支。
19. 分支操作
$ git branch
查看现有的分支,以及当前所在的分支,*
号表示当前
$ git branch dev
创建了一个叫做dev
的分支
$ git checkout dev
将当前分支切换到dev
分支,在进行分支切换操作后发现工作区的文件会随之改变
$ git checkout -b dev
命令中包含有-b
的参数,表示创建并切换分支,相当于创建和切换两条命令的合并
$ git merge dev
将dev
分支的内容合并到当前所在的分支中。命令中没有任何的参数,属于Fast-forward
即快进模式
,就是将当前分支直接指向dev
的当前提交,速度快。
$ git branch -d dev
将dev
分支进行删除
20. 解决冲突
冲突
,在两个分支上对同一文件同一行代码均进行了修改并提交,随后进行两个分支的merge
操作就会造成冲突的出现。merge
操作其实本身会进行自动合并,没有冲突的地方就会自动合并在一起。看到Automatic merge failed; fix conflicts and then commit the result.
就是提示自动合并失败,需要手动解决冲突,然后进行commit 提交。
出现冲突后打开冲突的文件会发现 Git 用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。将冲突的地方手动修改之后进行add
和commit
操作。这样就把冲突解决掉了。查看提交记录,并将旧分支删除。
git log --graph --pretty=oneline --abbrev-commit
带参数命令可以直观查看提交记录。
21. 分支管理策略
$ git merge --no-ff -m "message" dev
这里主要说明的是通常情况下 Git 会用Fast forword
模式进行分支合并,但是这种模式下,删除分支后,会丢掉分支信息。这个理解起来有些费劲,动手敲了指令,似懂非懂的样纸。
注意命令中的参数--no-ff
是禁止使用Fast forword
模式,参数-m
是合并后创建一个新的 commit 提交。合并后的历史有分支,能看出来曾经做过合并。
管理策略:
-
master
分支是稳定的分支,只是用来进行版本发布的。 -
dev
分支是非稳定的,在 dev 分支上干活,开发者在各自的分支上干活,然后合并到 dev 分支。
22. BUG 分支
当前在dev
分支上努力的工作中,文件已经add
,但是由于工作没有完全结束,没有进行commit
操作。突然来了要修复 BUG 的任务,要创建一个 BUG 分支来进行修复。dev
分支工作没有结束,又要创建新的issue
分支来修复 BUG 。
$ git stash
stash
功能可以将当前工作现场”储藏“起来,等以后恢复现场后继续工作。命令执行之后,gi status
就会发现工作区是干净的了。接下来就可以在需要修改 BUG 的分支创建新的bug 分支
然后进行修改,提交,合并,删除分支。当 BUG 修复工作结束掉后,切回dev
分支。
$ git stash list
执行命令可以查看我们之前保存的工作现场
$ git stash apply
执行命令将工作现场进行恢复,恢复之后
$ git stash drop
执行命令将"储藏"记录删除
$ git stash pop
这条命令其实是上边两条的合并,恢复现场同时删除记录
$ git stash apply stash@{0}
如果说是有多次进行stash
操作的时候,可以使用此命令恢复至指定的现场。
23. 多人协作
$ git remote
$ git remote -v
执行命令查看远程仓库,远程仓库的默认名称是origin
,加上参数-v
说明要查看详细信息。
$ git push origin <branchName>
将本地commit
的数据提交至远程仓库指定的分支上。
$ git checkout -b dev origin/dev
创建本地dev分支
,似乎也预先创建了一个远程的 dev 分支
,进行一次push
操作就可以在远程仓库k看到分支。
$ git branch --set-upstream dev origin/dev
远程仓库已经有了dev
分支,本地的dev
分支还没有和远程仓库的dev
分支建立连接,执行命令进行连接建立。
$ git pull
$ git pull origin <远程仓库名称>
进行代码的拉去。
24. 标签
发布版本时候在版本库中打上一个标签[tag]
,标签与版本号相联系,将来想回到这个版本的代码就很方便了。标签其实就是指向某次 commit 的指针,这个和分支很像,但是分支是可以移动的,标签是不能移动的。标签可以创建,也可以删除。
$ git tag <tagName>
在需要打上标签的分支里直接执行命令,就可以创建一个新的标签了。默认情况下,标签是打在最新一次的commit
上面。
$ git tag
执行命令,直接查看当前现有的标签。注意:标签的排序不是按照时间顺序排列,而是按照字母顺序进行排列的。
$ git tag <tagName> commit_id
标签是随时可以给某次commit
打上的,需要带上相应的commit id
就可以。
$ git show <tagName>
执行命令可以查看标签的信息。
$ git tag -a <tagName> -m "message" commit_id
使用参数-a
指定标签名,使用参数-m
指定说明文字。
$ git tag -s <tagName> -m "message" commit_id
使用参数-s
可以实现用私秘钥签名一个标签。签名采用PGP
需要先安装GnuPG
,如果没有就会报错,这个神马的就不清楚了。
$ git tag -d <tagName>
参数-d
就是删除的意思了,这个和分支的删除都是类似的。
$ git push origin <tagName>
$ git push origin --tags
tag
命令创建的标签都是在本地存储的,使用push
命令可以将指定的标签推送到服务器上,使用参数--tags
可以将本地所有尚未推送的标签进行推送。
$ git tag -d <tagName>
$ git push origin :refs/tags/<tagName>
要删除远程仓库的标签需要两步,先将本地的标签删除,然后将删除推送到远程。
这里注意参数:refs/tags/<tagName>
就可以了。
25. 忽略特殊文件
对于一些配置文件或者是自动生成的文件,虽然放在工作目录里,但是却不能提交到仓库中进行版本管理,比如编译生成的.class
文件或者是编译器本地配置的.iml
文件等。这些文件对于版本管理库来说都是要忽略的,这些在另一篇文章中都已经有提到过了。
在 Git 工作区根目录创建.gitignore
文件,并将需要忽略的文件进行配置,最后将.gitignore
文件添加到版本库中,并提交远程仓库。
关于.gitignore
文件的编写有一个网址参考:https://github.com/github/gitignore
在Windows
系统中无法直接创建.gitignore
文件,可以在文本编辑器中选择保存
或者另存为
。
$ git check-ignore -v <file>
执行命令可以检查文件的忽略配置。
$ git add -f <file>
注意使用参数-f
可以实现强制添加。
26. 自定义 Git
$ git config --global color.ui true
执行命令,会上 Git 显示不同的颜色,醒目区分文件的状态。
$ git config --global alias.st status
$ git config --global alias.<别名> <原命令>
配置别名
,参数config
是配置的意思,参数--global
是全局的意思,参数alias.
是给原来的命令设置一个新的别名,注意.
后边跟上指定要配置的别名。例如第一行配置就是给status
配置了一个新的别名st
,接下来使用git st
就会有和git status
一样的效果。
配置文件的位置:
- 本地仓库的配置,可以在本地仓库
.git/config
中进行查看,也可以从中删除别名的配置。 - 全局的配置,可以在用户主目录下隐藏文件
.gitconfig
中进行查看。
27. 结束
终于是写完了。本来只是想推荐大家看一下廖雪峰的教程,没想到自己打开就顺手开始敲命令,既然都已经开始动手实践了,就没有不记录的理由了。经过三天的努力,终于是完结了。总体来说以前没注意到的地方有了一个认知,收获多多。下面贴出之前学习总结起来的命令。
命令 | 功能 |
---|---|
git --help | 查看帮助 |
git --help 命令 | 查看指定命令的帮助 |
git init | 初始化仓库 |
git status | 查看状态[文件追踪状态] |
git add file | 添加指定的文件 |
git add . | 添加所有的文件 |
git commit | 代码提交 |
git commit -m "注释" | 代码提交带有注释的提交 |
git branch | 查看分支 |
git branch -v | 查看分支详细 |
git branch dev | 创建 dev 分支 |
git checkout dev | 跳转 dev 分支 |
git checkout -b dev | 创建并跳转 dev 分支 |
git branch -d dev | 删除 dev 分支 |
git merge dev | 合并 dev 分支到当前分支 |
git merge --no-ff -m "message" dev | 不使用快进模式合并,且带上提交的注释 |
git clone url | 从远程仓库克隆代码到本地 |
git pull origin dev | 从远程仓库 dev 分支拉去最新代码 |
git push origin dev | 将代码提交到远程仓库 dev分支 |
git diff | 查看修改 |
git log | 查看提交记录 |
git log --pretty=oneline | 查看记录一行显示 |
git relog | 查看所有记录 |
git rm file | 删除文件 |
28. 彩蛋
git checkout -b branch-name origin/branch-name
建立本地分支同时建立服务器分支
git branch --set-upstream branch-name origin/branch-name
将本地分支与服务器分支连接
git push origin :branch-name
在远程仓库删除分支
29. 推荐
- 慕课网有视频教程:版本管理工具介绍—Git篇主要讲的是 GitHub 客户端
- Git 官方网站:上面有中文版的教程