1、基本概念
在 Git 的世界里,有三个地方:工作目录
、暂存区
、Git仓库
。
- 工作目录(working directory):你看得见的、就是平时使用的文件夹/目录
- 暂存区(staging area):保存了下次将提交的文件列表信息。
- Git仓库(Git directory):保存版本数据的地方。这是最重要的。
状态
对应地,工作目录中的文件就有三种状态:已修改、已暂存、已提交
- 已修改(modified):工作目录下的文件每次修改后,就处于已修改状态;
- 和已暂存(staged):把修改后文件提交到暂存区后的状态,反之称 unstaged;
- 已提交(committed):把修改提交到版本数据库后的状态。
另外要注意的一点是,以上三种状态均建立在文件已被 Git 追踪的前提下。在工作目录新建一个文件,此时文件的状态为未追踪(untracked)。
删除被追踪的文件后,可以查看到的状态是已删除(deleted)
流程
基本的 Git 工作流程如下:
- 在工作目录中修改文件;
- 暂存文件,将文件的快照放入暂存区域;
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
2、创建
创建仓库
选择一个合适的地方,创建一个空目录,或者使用命令:
$ mkdir learngit
$ cd learngit
$ pwd
pwd
命令只是用于显示当前目录。
初始化仓库
把这个目录变成 Git
可以管理的仓库:
$ git init
可以发现当前目录下多了一个 .git
的目录,这个目录是 Git
来跟踪管理版本库的,不要手动修改/删除这个目录里面的文件。
ls -a
命令就可以列出包括隐藏文件在内的文件。
3、暂存
添加修改到暂存区
暂存区就好像一个码头,先把货物运到这里,再往目的地(版本库)运输。
现在编写一个 README.md
文件,放到 learngit
目录/子目录下,或者使用命令新建:
$ touch README.md
用编辑器打开添加点内容,或在终端中编辑:
$nano README.md
把修改的文件暂存,用于提交:
$ git add README.md
可以一次性添加所有同类型文件的修改:
git add '*.md'
也可以一次性添加所有文件的修改:
$ git add .
4、提交
向版本库提交修改
每次向版本库提交修改最好添加提交信息,first commit
就是一次提交的信息。
$ git commit -m "first commit"
5、查看
查看文件状态
显示工作目录下文件所处状态,这时经常用到的命令:
$ git status
查看文件内容
显示工作区文件与上次提交版本的内容有什么不同。
$ git diff README.md
查看提交记录
显示从最近到最远的提交日志,可查看到每次提交的 40 位 commit id
(版本号):
$ git log
查看命令记录
Git
提供了一个命令用来查看你每一次命令的记录:
$ git reflog
重返未来
:假如你回退到某个版本,这个版本之后的修改都会被抛弃(其实这很有道理),再想恢复到这个版本之后的版本,这个命令可以查看到所需的 未来 版本号。
6、撤销、回退
撤消文件修改的暂存。可以把添加到暂存区的修改撤销掉(unstage),不改变工作区。
$ git reset HEAD <file>
撤消对工作目录文件的修改。此命令会使用暂存区中的内容替换掉你的工作目录中的文件。(即撤销未提交的修改)
$ git checkout -- <file>
丢弃在本地的所有改动与提交
$ git reset --hard HEAD
回退到某个版本,并抛弃该版本之后的修改
$ git reset --hard <commit id>
commit id 可以换成:
-
HEAD^
上一个版本, -
HEAD^^
上上一个版本 -
HEAD~100
上100个版本
注意:Git
使用 HEAD
指向当前版本。
7、远程仓库
Git 在本地就已经可以实现版本管理的功能,远程仓库有别于存储在你硬盘里的版本库,它存储在网络服务器中,它的发明是为了 Git 的协作和防止本地数据的丢失。
远端服务器上的仓库,克隆一份来本地:
$ git clone username@host:/path/to/repository
其实 clone
命令也可以拷贝本地的仓库,但最常用的还是从远程服务器拷贝。
推送
把本地的修改提交到远程仓库的操作叫做推送(push)。要推送的前提是,必须给当前工作目录指定远程仓库的地址。
使用命令连接一个远程仓库:
$ git remote add origin <server>
这里的 origin
可以是其它你想到的名字,它只不过是用来标识远程仓库的别名而已。但是最常用这个一看就了解的名字。使用 $ git remote
命令可以列出已连接的远程仓库的别名,加 -v
参数可以查看具体地址:$ git remote -v
推送命令:
$ git push -u origin master
把本地分支 master 推送到名为 origin 的远程仓库的。可以把 master 换成你想要推送的任何分支。
注:-u
参数为第一次提交使用,作用是把本地的 master 分支和远程的 master 分支关联起来,简化命令,之后提交不需要这个参数。