从零开始的Git

Git 与 SVN 区别

Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征



1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。

2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。

3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。

4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。

5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。


安装

https://gitforwindows.org/

用户信息

配置个人的用户名称和电子邮件地址

1
2
$ git config --global user.name "runoob"
$ git config --global user.email test@runoob.com

查看配置信息

1
2
3
4
$ git config --list
http.postbuffer=2M
user.name=runoob
user.email=test@runoob.com

工作流程

创建仓库

git init

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录

指定目录作为Git仓库

1
git init newrepo

初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交

1
2
3
$ git add *.c
$ git add README
$ git commit -m '初始化项目版本'

将目录下以 .c 结尾及 README 文件提交到仓库中

git clone

我们使用 git clone 从现有 Git 仓库中拷贝项目

1
2
3
4
git clone http://github.com/CosmosHua/locate new
git clone http://github.com/CosmosHua/locate.git new
git clone git://github.com/CosmosHua/locate new
git clone git://github.com/CosmosHua/locate.git new

多种协议

1
2
3
git clone git@github.com:fsliurujie/test.git         --SSH协议
git clone git://github.com/fsliurujie/test.git --GIT协议
git clone https://github.com/fsliurujie/test.git --HTTPS协议

git add

git add 命令可将该文件添加到缓存
git status 命令用于查看项目的当前状态

1
2
3
4
5
6
7
8
9
10
11
$ git status -s
?? README
?? hello.php
$

$ git add README hello.php

$ git status -s
A README
A hello.php
$

git diff

执行 git diff 来查看执行 git status 的结果的详细信息。

1
2
3
4
5
6
7
8
9
10
11
12
$ git status -s
A README
AM hello.php
$ git diff
diff --git a/hello.php b/hello.php
index e69de29..69b5711 100644
--- a/hello.php
+++ b/hello.php
@@ -0,0 +1,3 @@
+<?php
+echo '菜鸟教程:www.runoob.com';
+?>

git commit

执行 git commit 将缓存区内容添加到仓库中

1
2
3
4
5
6
7
8
9
$ git add hello.php
$ git status -s
A README
A hello.php
$ git commit -m '第一次版本提交'
[master (root-commit) d32cf1f] 第一次版本提交
2 files changed, 4 insertions(+)
create mode 100644 README
create mode 100644 hello.php

git add 提交缓存的流程太过繁琐,Git 也允许你用 -a 选项跳过这一步

1
2
3
git commit -am '修改 hello.php 文件'
[master 71ee2cb] 修改 hello.php 文件
1 file changed, 1 insertion(+)

git rm
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交

1
2
3
4
$ git rm hello.php 
rm 'hello.php'
$ ls
README

git mv

git mv 命令用于移动或重命名一个文件、目录、软连接

1
2
3
$ git mv README  README.md
$ ls
README.md

Git 分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作

创建分支命令

1
git branch (branchname)

切换分支命令

1
git checkout (branchname)

列出分支

1
git branch

手动创建分支

1
git branch (branchname)

删除分支

1
git branch -d (branchname)

合并分支

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git branch
* master
newtest
$ ls
README test.txt
$ git merge newtest
Updating 3e92c19..c1501a2
Fast-forward
runoob.php | 0
test.txt | 1 -
2 files changed, 1 deletion(-)
create mode 100644 runoob.php
delete mode 100644 test.txt
$ ls
README runoob.php

查看提交历史

git log 命令查看

  • –oneline 选项来查看历史记录的简洁的版本
  • –graph 选项,查看历史中什么时候出现了分支、合并
  • –reverse 参数来逆向显示所有日志

Github

生成SSH key

1
$ ssh-keygen -t rsa -C "youremail@example.com"

或查看本机的SSH key

验证是否成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ ssh -T git@github.com

$ mkdir runoob-git-test # 创建测试目录
$ cd runoob-git-test/ # 进入测试目录
$ echo "# 菜鸟教程 Git 测试" >> README.md # 创建 README.md 文件并写入内容
$ ls # 查看目录下的文件
README
$ git init # 初始化
$ git add README.md # 添加文件
$ git commit -m "添加 README.md 文件" # 提交并备注信息
[master (root-commit) 0205aab] 添加 README.md 文件
1 file changed, 1 insertion(+)
create mode 100644 README.md

# 提交到 Github
$ git remote add origin git@github.com:tianqixin/runoob-git-test.git
$ git push -u origin master

查看当前的远程库

1
2
3
4
5
$ git remote
origin
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)

从远程仓库下载新分支和数据

1
git fetch

从远端仓库提取数据并尝试合并到当前分支:

1
git merge

推送到远程仓库

1
2
3
4
5
6
7
8
$ touch runoob-test.txt      # 添加文件
$ git add runoob-test.txt
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 runoob-test.txt

$ git push origin master # 推送到 Github

删除远程仓库

1
git remote rm [别名]