获取Git仓库
创建Git仓库的方法主要有两种:一是将现有的项目或者目录导入Git中,二是从服务器上Clone到现有的Git库
初始化版本库
可以理解为一个由Git进行管理和可追踪的文件目录,其中的每个文件的修改、删除,Git都可以追踪并能在将来某时刻“还原”。
创建一个空目录:
$ cd d/documents
$ mkdir GitRoot
$ cd gitroot
$ pwd
/d/documents/gitroot
注意为了避免各种码放,你创建目录的时候尽量不要使用中文,包括父项和子项
通过git init命令将这个目录变成Git可以管理的仓库;
$ git init
Initialized empty Git repository in D:/Documents/GitRoot/.git/
对于一个已经非空文件夹,你应该开始追踪这些文件并进行初始提交。通过git add
命令来指定所需的文件来进行追踪,然后执行git commit
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
克隆现有的仓库
获得一份已经存在了的Git仓库的拷贝需要用到git clone
命令。 如果你对请留心一下你所使用的命令 是"clone"而不是"checkout"。这是 Git 区别于其它版本控制系统的一个重要特性,Git克隆的是该Git仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。当你执行git clone命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版都将被拉取下来。
事实上,如果你的服务器的磁盘坏掉了,你通常可以使用任何一个克隆下来的用户端来重建服务器上的仓库 (虽然可能会丢失某些服务器端的钩子(hook)设置,但是所有版本的数据仍在)。
命令是:git clone <url>
比如,要克隆 Git 的链接库 libgit2,可以用下面的命令:
$ git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2 文
件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。
如果你想在克隆的时候自定义本地仓库的名字,可以通过额外的参数进行指定
$ git clone https://github.com/libgit2/libgit2 mylibgit
Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用SSH 传输协议,比如user@server:path/to/repo.git 。 在服务器上搭建 Git 将会介绍所有这些协议在服务器端如何配置使用,以及各种方式之间的利弊。
记录变更
现在我们有一个Git仓库,里面每一个文件有两种状态:已追踪和未追踪。工作之后,则可能是:未修改,已修改或已放入暂存区。已追踪的文件就是Git已知的文件。初次克隆之后的文件都属于已追踪文件。
编辑某些文件之后,标记为已修改文件,工作的时候可以选择将它们放入暂存区,然后提交对于所有暂存的修改,如此反复。
检查当前文件状态
命令和界面一览
使用git status
命令查看那些文件处于什么状态
-
没有任何文件时:
$ git status On branch master No commits yet nothing added to commit but untracked files present (use "git add" to track)
-
有文件的时候出现:
$ echo 'My Project' > README $ git status On branch master No commits yet 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 files下面,意味着Git之前的快照中也没有这些文件
-
克隆一个仓库后立刻使用该命令:
$ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean
说明当前所有文件都未被修改,且目录下面没有任何追踪文件出现
跟踪新文件
使用git add <file>
开始跟踪一个文件,此时再运行git status
可以看
$ git add README
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
这说明README已经被跟踪,并且处于暂存状态:
只要在Changes to be committed
这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在你运行git add
时的版本将被留存在后续的历史记录中。你可能会想起之前我们使用git init
后就运行了git add <files>
命令,开始跟踪当前目录下的文件。git add
命令使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
暂存已修改的文件
再次创建文本并修改
现在我们来修改一个已被跟踪的文件。如果你修改了一个名为B.md 的已被跟踪的文件,然后运行 git status 命令,会看到下面内容:
$ git statusOn branch masterChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: READMEChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: B.md
文件B.md出现在 Changes not staged for commit
这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add
命令。这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。 现在让我们运行 git add
将“B.md”放到暂存区,然后再看看 git status
的输出:
$ git statusOn branch masterChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: B.md new file: README
现在两个文件都已暂存,下次提交时就会一并记录到仓库。 假设此时,你想要在 B.md 里再加条注释。 重新编辑存盘后,准备好提交。 不过且慢,再运行 git status
看看:
$ vim B.md$ git statusOn branch masterChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: B.md new file: READMEChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: B.md
为什么B.md 文件同时出现在暂存区和非暂存了呢?实际上 Git 只不过暂存了你运行 git add
命令时的版本。 如果你现在提交,B.md 的版本是你最后一次运行 git add
命令时的那个版本,而不是你运行 git commit
时,在工作目录中的当前版本。 所以,运行了git add
之后又作了修订的文件,需要重新运行git add
把最新版本重新暂存起来:
$ git add B.md$ git statusOn branch masterChanges to be committed: (use "git restore --staged <file>..." to unstage) new file: B.md new file: README
这里如果遇到vi或者vim的问题可以参考一下,vi编辑器的简要使用手册
状态简览
使用命令git status -s
或者你将得到一种格式更为紧凑的输出
$ git status -sA B.mdA README?? "Any.md"?? CodeNote/?? CodeZero/
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。