获得Git项目的仓库有两种方式:
在现有的目录下面通过导入所有的文件夹来创建Git仓库
从已有的仓库克隆一个新新的镜像仓库来使用
git init
在现有的工作目录中初始化新仓库:
初始化完成后,在当前的目录下面会出现一个名为.git的目录。
git clone
从现有的仓库克隆。
克隆的命令:git clone [url]
1 | git clone git@github.com:shuliqi/echarts-vue.git |
git status
检查当前文件的状态。
git的工作目录下的所有文件都不外呼两种状态:已跟踪,未跟踪
已跟踪:
指被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间之后,它们的状态可能是未更新
,已修改
,已放入暂存入
未跟踪:
没有上次的更新时的快照,也不在当前的暂存区域(即不是已跟踪文件就是未更新文件)。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
说明当前的工作目录很干净。所有的跟踪文件在上次提交之后没有更新过。
我们新建一个文件,1.js。 通过 git status
可看出我们新建的文件在未跟踪的文件列表里面.
git add
跟踪一个新文件。
例如,要跟踪一个新文件1.js, 则可以:
1 | git add 1.js |
添加跟踪完之后,我们再根据git status
查看状态,可看出该文件已经添加到已追踪列表.
只要在 “Changes to be committed” 这行下面的,就说明是已暂存状态。如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中
当我们在修改1.js 文件。再git status
:
文件 1.js 出现在 “Changes not staged for commit” 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行 git add
命令。
.gitignore
有一些文件我们不需要纳入git版本控制。但是我们也不希望它出现在未跟踪的文件列表中。我们可以创建一个名为:.gitignore的文件。里面列出需要忽略的文件的模式。
文件.gitignore
的格式如下:
- 所有的以
#
符号开头,所有的空行都会被省略。 - 可以使用标准的 glob 模式匹配(指 shell 所使用的简化了的正则表达式)。
- 匹配模式最后跟反斜杠(
/
)说明要忽略的是目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(
!
)取反。
1 | # 此为注释 – 将被 Git 忽略 |
git diff
git status
显示比较简单,仅仅是列出了修改过的文件。如果要看文件具体修改了哪些地方,可以使用git diff
如果我们修改了文件。再使用git diff
查看:
比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
注意
git diff :
对比工作区(未 git add)和暂存区(git add 之后)git diff —cached:
对比暂存区(git add 之后)和版本库(git commit 之后)git diff HEAD:
对比工作区(未 git add)和版本库(git commit 之后)
git commit
提交更新。
使用git commit
提交暂存区代码。
1 | git commit |
这种方式会启动文本编辑器以便输入本次提交的说明。
还有一种提交的方式,不需要启动文本编辑器来提交本次的说明。
提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f
),以及在本次提交中,有多少文件修订过,多少行添改和删改过。
虽然使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。
那么使用 git commit -a -m"跳过暂存区提交"
提交之前不再需要 git add
文件了。
**git commit --amend
** 此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。
我们使用git log -1
查看上一次commit的简要信息
撤销上次的commit, 重新编辑提交说明。
1 | git commit --amend |
提交说明改成: “提交新东西(git commit —amend)”
再git log
查看当前的提交历史
从图中看看出,我们的提交说明已经改变了。并且提交历史也没有我们第一次的commit(我们已经改变了)
如果上次的提交我们有些文件改动没有暂存,我们可以补上暂存操作,然后再git commit --ammend
提交。
例如: 我们提交了一次commit
当前的更新历史为:
补上一个暂存操作,再git commit --ammend
,可更改上次的提交了.
总结:以下的操作只会产生一个commit
1 | git commit -m '提交' |
git rm
移除文件。
如果想在git 删除某个文件,就必须得从已跟踪(暂存区)的文件清单中移除。然后再提交。使用git rm
移除文件。那么移除的文件就不会出现在未跟踪的清单中了。
如果手动删除了一个文件,再使用git status
查看:
显示在“Changes not staged for commit”。也就是文件还在跟踪中。
如果使用git rm
那么最后提交的时候,该文件就不再纳入版本管理了。
如果我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。则可以使用git rm –cached 文件
git mv
移除文件(更改文件名)。
git 无法跟踪文件的移除操作。如果我们改了一个文件名。 Git 并不会体现出这一操作。如果想给一个文件改名,则可以使用:
1 | git mv old_name new_name |
git mv
命令相当于以下命令:
1 | ➜ mv old.txt new.txt |
git log
查看提交历史。
使用git log
查看提交历史.
如果默认没有参数, 会按提交的时间显示所有的更新。最近的更新排在最上面。每一次的提交都有SHA-1 校验,作者的名字和邮箱,提交的时间, 提交声明。
git log
一些常用的选项:
1 | git log -p // 展开显示每次提交的内容的差异 |
1 | git log -<n> // 加上n > 0 的数字, 显示最近几次的提交 |
例如:git log -1
1 | git log -p --word-diff. // 单词层面的比较 |
1 | git log --stat //显示简要的增改行数统计 |
整理的常用的选项:
选项 | 说明 |
---|---|
-p |
按补丁格式显示每个更新之间的差异。 |
--word-diff |
按 word diff 格式显示差异。 |
--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(后跟指定格式)。 |
--oneline |
--pretty=oneline --abbrev-commit 的简化用法。 |
其他的:
选项 | 说明 |
---|---|
-(n) |
仅显示最近的 n 条提交 |
--since, --after |
仅显示指定时间之后的提交。 |
--until, --before |
仅显示指定时间之前的提交。 |
--author |
仅显示指定作者相关的提交。 |
--committer |
仅显示指定提交者相关的提交。 |
git reset
取消已经暂存的文件。
假如我们不小心git add
了一个文件加到暂存区。但是我们想撤消该文件加到暂存区。则可以使用git reset
进行撤销。
命令不需要我们强制记住,
git add
之后我们使用git status
可以看到git 提示我们如何撤消。
1 | git reset HEAD <file> // 如何在暂存区撤销一个文件 |
即可撤消。
git checkout – file
取消对文件的修改。
如果我们觉得对一个文件的修改没有必要。想要取消修改。则可以使用git checkout -- <file>
命令不需要我们强制记住,
git add
之后我们使用git status
可以看到git 提示我们如何取消对一个文件的修改。
撤消之后,再git status
该文件则已经回到没有修改过的状态了。
git remote
查看远程仓库。
git remote
: 会显示每个远程仓库的简短的名字.如:
1 | ➜ git remoete |
git remote -v
: 显示远程仓库的名字和对应的clone 地址。如:
1 | ➜ git remote -v |
git remote add [name] [url]
添加远程仓库。如:
1 | ➜ git remote add shuliqi git@github.com:shuliqi/rzfx.git |
可以通过 git fetch shuliqi
来抓取shuliqi仓库有的但是本地没有的信息。
git remote show [remote-name]
: 查看某个远程仓库的相信信息。
例如:查看克隆的origin的仓库的分支。
1 | ➜ git remote show origin |
给出了很多的信息:
仓库的克隆地址
提醒你要是在master 可以使用
git pull
抓取数据。列出了所有的处于跟踪的分支(master, shu, shu-branch )
git remote rename [old-remote-name] [new-remote-name]
命令修改某个远程仓库在本地的简称。
例如:把本地仓库origin
改成成shu
1 | ➜ git remote |
git remote rm [remote-name]` 删除远端仓库。
例如:删除远程仓库shu
1 | ➜ git remote |
git fetch
git fetach <remote-name>
会到远程仓库中拉取所有你本地仓库中还没有的数据。
fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支。
1 | ➜ git fetch origin |
git push
将本地仓库中的数据推送到远程仓库 git push [remote-name] [branch-name]
例如: 我们新建一个分支shu
。对代码做了一些改动。并且推送到远程跟踪的相应的分支。
1 | ➜ git checkout -b shu |
这条命令如期执行的条件:
- 在该克隆的服务器上有读写权限。
- 在同一时刻,没有其他人提交更新
如果在推送前,有人已经做了若干更新。 那么你的更新会被驳回。你只能把他们的更新抓到本地。 并且和冰岛自己的项目中。然后进行再次推送才会成功。
git tag
查看标签
使用git tag
列出所有的标签
1 | ➜ git tag |
Git 使用的标签有两种类型:
- 轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
- 含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
新建含附注标签
如命令:git tag -a v0.0.1 -m"新建一个标签,标记0.0.1版本"
可以新建一个含附注标签。
1 | ➜ git tag -a v0.0.1 -m"新建一个标签,标记0.0.1版本" |
-m
选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
git show [tag-name]
:查看一个标签的的信息。
1 | tag v0.0.1 |
可看出:标签名字,标签说明等。
轻量级标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a
,-s
或 -m
选项都不用,直接给出标签名字即可。
1 | ➜ git tag v1.1.6 |
可看出轻量级标签就只有相应的提交对象摘要。
分享标签
可以使用git push [remote-name] [tag-name]
命令将某一个tag 推送到远端。
1 | ➜ git push origin v0.0.1 |
可以使用git push origin --tags
命令推送所有的tag 到远端。
1 | ➜ git push origin --tags |