内容简介
- 获取Git仓库(init/clone)
- 记录每次更新到仓库(commit)
- 查看提交历史(log)
- 撤销操作(--amend)
- Git 别名(alias.)
获取Git仓库
获取Git仓库的方式有两种,一种是初始化一个仓库,把项目文件都添加到这个仓库中。另一种是从远程Git服务器把仓库下载到本地。
在现有目录中初始化仓库
打开命令窗口,进入项目的根目录下,输入以下命令
git init
该命令会在当前目录中创建一个.git的文件夹,可以使用ls -a
查看。这时候我们初始化了一个git仓库,但是您的项目文件还没有被跟踪。如果想要被跟踪,需要先将文件添加到暂存区,之后再提交到git仓库中。
克隆Git服务器上面的仓库
如果你要修改已有的项目文件或者查看其他人的Git仓库文件,那么就需要从远程Git服务器把远程仓库下载到本地。克隆仓库的命令格式为git clone [url]
,比如:
git clone https://github.com/quanyipinghe/GitDemo.git
执行这个命令之后,会在当前目录生成一个名字为'GitDemo'的目录,该目录下包含了项目的文件和Git仓库(.git目录)。如果你想在clone仓库的时候自定义本地目录名字,那么就用这样的命令格式git clone [url] [目录名]
Git支持多种数据传输协议
-
https://
协议,比如上面的例子 -
git://
协议,git协议涉及到安全问题,如果是公开项目可以使用该协议 -
SSH
协议,比如user@server:path/to/repo.git
记录每次更新到仓库
我们工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
我们使用Git时,文件状态的声明周期如下图所示。
查看文件的状态
查看文件状态使用命令git status
,如果在clone仓库以后首次使用此命令,那么我们会看到如下结果:
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
现在让我们在工作目录中新增一个README文件。如果目录中之前不存在这个文件,那么我们git status
将看到如下结果
$echo 'My Project' > README
$git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
从状态报告中我们可以看出README文件处于未跟踪(untracked)状态,未跟踪的意思是之前的快照中没有该文件,Git也不会自动将其纳入跟踪范围,除非我们主动的将此文件添加到跟踪范围(暂存区)
跟踪新文件
其实在上面的状态报告中已经给我一些如何跟踪的提示了。跟踪某个新文件执行git add [file]
这个命令就可以了,此命令会将新文件添加到暂存区。再次查看状态我们可以看到
$git add README
$git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要出现在Changes to be committed
这句话下面,那么说明文件处于已暂存状态。此时我们我们也可以将文件提交到仓库中。
提交文件的变化
使用git commit -m [内容]
命令可以将暂存区的快照提交到版本库中。
$git commit -m "add file"
[master e0c323d] add file
1 file changed, 1 insertion(+)
create mode 100644 README
修改已跟踪的文件并查看状态
在Changes not staged for commit
下面说明该文件被修改了,但是没有放大暂存区。因此我们可以执行git add [文件]
命令将其添加到暂存区。
这个说明文件的修改已放到暂存区了。此时如果我们再次修改了工作目录的这个文件,我们再次查看文件状态如下:
如果此时我们执行提交操作,只会把暂存区的修改提交到本地仓库中,工作目录的修改并不会被提交。因此,如果我们修改了文件并且此修改有必要提交,那么请及时放到暂存区。
状态简览
git status
此命令的输出非常详细,但不免有时候对于我们来说显得有点繁琐,此时,我们可以用更简单的命令来查看状态git status -s (git status --short)
。
查看已暂存和未暂存的修改
git diff
命令将通过文件补丁的格式来具体显示文件的哪些行发生了变化。
要查看尚未暂存的文件做了什么修改,可以使用git diff
命令
此命令比较的是工作目录中的当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
如果要查看已暂存的准备提交到版本库的修改可以使用git diff --cached
命令或者git diff --staged
命令
跳过使用暂存区域来提交文件
如果您不想每次更新了工作目录的文件,然后都要先放到暂存区,之后再提交的话。那么我们可以跳过把变化的文件放到暂存区这一步,直接提交工作目录变化的文件到本地仓库中。我们可以在git commit
后面 加一个-a
参数就可以实现了。
从这里我们可以看出,提交了工作目录和暂且区域文件的修改到仓库中。
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
使用git rm [文件]
命令会将文件从暂存区移除并且也从工作目录移除。这样此文件就不会出现在未跟踪列表中了。
如果删除之前修改过该文件并且已经放到暂存区了,那么必须要用强制删除选项 -f
还有一种情况,如果我们只是简单的想让某个文件从版本库中移除,但是还想保留在本地磁盘上面。那么我们可以使用--cached
选项。
文件重命名
重命名文件用的这个命令git mv [file1] [file2]
其实上面这句命令相当于下面这三句命令
$mv README README.md
$git rm README
$git add README.md
查看提交历史
在提交了若干次更新后或者从远程仓库下载下拉项目之后,我们想
查看文件的更新历史,此时我们就可以用git log
命令了。
git log
有很多好用的参数。一个比较常用的就是-p
,用来显示每次提交的内容差异。同时你也加上-2
来显示最近两次的提交:
--stat
选项可以查看每次提交的简略信息:
--pretty
选项可以指定不同的默认格式来展示每次的提交历史,它有一些内建的子选项可以使用。比如oneline可以将信息放到一行显示,当提交历史比较多的时候很实用。另外还有short,full和fuller等。
但最有意思的format子选项,它可以指定显示的记录格式:
关于这些占位符的意思,请看下图:
--graph
选项和format选项配合使用会有不一样的结果,如果有分之的话,因为它可以用不同的符号把分之给连接起来。
关于git log
的常用选项还有如下所有:
在限制git log
输出的选项中常用的选项
撤销操作
在任何时候,你都有可能想要撤销某些操作。
如果我们提交完了,才发现漏掉了几个文件没有添加或者提交信息写错了,那么我们可以使用带有 --amend
选项的提交命令重新提交。
$ git ci --amend -m "修改文件内容"
当你发现只是提交内容不对的时候,然后立马执行的上面这句命令,那么快照会保存不变,只是提交内容发生了变化。
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
最终你只会有一个提交--第二次提交的结果替代第一次的提交,提交信息不变。
取消暂存的文件
有时候我们想把两个修改的文件分两次提交,但是我们不小心把这两个文件都放到了暂存区,现在我们就想把不提交的那个文件从暂存区移除。
git reset HEAD [文件]
将文件从暂存区移除
撤销对文件的修改
如果我们想撤销工作目录中我们修改的文件时,我们应该用下面这个命令:
git checkout -- [文件]
这个命令可以撤销在工作目录里面修改的但是没有放到暂存区的文件。
Git 别名
顾名思义,别名就是名字的别称。如果您用过svn命令的话,您应该知道svn有命令的缩写形式,那么Git命令有没有对应的缩写呢?当然也是有的,只是需要你去配置一下。
git config --global alias.[别称] 原命令
比如:
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --' // 取消暂存的别名
...
其实当我们执行 git st
的时候,就相当于执行了git status
.
Git只是简单的将别名替换成对应的命令而已。
有了别名,我们就可以轻松很多了O(∩_∩)O~~