本文作为 Git 入门 ---- Git 与 SVN 区别 的续篇,继续介绍 Git 的入门知识
四. Git 安装
OS X 版本: Mac 一般自带不需要安装
Windos 版本: https://git-for-windows.github.io/
Linux 版本: Linux 一般也是自带无需安装
五. 创建新仓库
创建新文件夹,cd 到文件夹,执行命令: git init 用来创建新 git 仓库
六. 提交文件进仓库
在新建好 git 仓库的文件夹里加入 readme.txt 文件
1. 使用 git add readme.txt 把文件添加到仓库,执行后没有任何提示,说明添加成功
2. 使用 git commit -m "提交内容的注释" 将文件真正提交到仓库
为什么提交分为 add 和 commit 呢?
那是 git 架构所决定的,你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index 又称 Stage),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。所以 add 是提交到 Index 的暂存区, commit 是提交到 Head,但是还没到远端仓库
七. 检出仓库
克隆本地仓库:
git clone /wenniuwuren/repository
克隆远端服务器上的仓库
git clone [email protected]:/wenniuwuren/repository
八. 查看本地与仓库的异同
修改 readme.txt 文件,然后执行 git status 查看本地和仓库的异同状态
git status # On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## modified: readme.txt# no changes added to commit (use "git add" and/or "git commit -a")
上述命令行提示信息意思是:本地已经修改,但还未 commit
执行 git diff 来查看本地与仓库详细的异同信息:
D:\gitTest>git diff diff --git a/readme.txt b/readme.txt index a888d81..77c430a 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1 @@ -你的本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件 ;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指 向你最后一次提交的结果。 \ No newline at end of file +update \ No newline at end of file
九. 版本回退
1. git log 查看提交历史记录
D:\gitTest>git log
commit b5683e767328b904694b247214d6ccf6e467a4a0
Author: unknown <[email protected]>
Date: Sat Jul 16 14:12:32 2016 +0800
update
commit 155899056f19a6d5f97aa4fc2f3550adcfe37b57
Author: unknown <[email protected]>
Date: Sat Jul 16 11:23:29 2016 +0800
add readme file
需要友情提示:你看到的一大串类似的b5683e767328b904694b247214d6ccf6e467a4a0 是commit
(版本号),和SVN不一样,Git的
idcommit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字。为什么commit
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,想象一下多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
id
2. 基础概念
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git
。
reset --hard commit_id- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
3. 修改后相关撤销操作
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交
b5683e767328b904694b247214d6ccf6e467a4a0,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。(PS:Windows
下用 HEAD^ 可能有点问题,会提示你 More? 本来输入 HEAD^ 就能回退到上一个版本,但是需要再输入一个 ^ 才能正确执行,Windows 下建议直接用 HEAD~1 回到上一个版本)
回退到上一个版本,就可以使用命令:
git reset --hard HEAD~1
上述的 hard 参数什么意思呢?
根据 soft、 mixed、 hard,会对 working tree 和 index 和 HEAD 进行重置:
git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset --soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset --hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
执行上述命令后,用 git log 就看不到执行记录了,只能用 git reflog 来查看所有的命令历史,这样就能根据提交的 id 来决定回到哪个版本,比如命令为:
D:\gitTest>git reset --hard b5683e7
HEAD is now at b5683e7 update
从上述命令可以看到,不需要输入全部提交的唯一标识 id,只要前几位 id 内容 git 就能区别是哪一个版本,执行完后,就回到了 b5683e7... 版本。
- 修改后 未add(添加到暂存区) 需要撤销修改时:
git checkout -- myfile.txt 或 手动删除工作区修改 工作区 : clean 暂存区: clean
- 修改后 add了(未commit) 再次修改文件 要撤销第二次修改时:git checkout -- myfile.txt(将暂存区恢复到工作区) 暂存区有第一次的修改需要commit
- 修改后 add了(未commit),需要撤销修改时:git reset HEAD myfile.txt(将暂存区修改删除) 此时工作区的修改还未撤销git
checkout -- myfile.txt(撤销工作区修改) - 修改后 add并commit了,需要撤销修改时:git reset --hard HEAD^(版本回退)**
十. 删除文件
git rm fileName.extension
然后 git commit fileName.extension,就可以把暂存库上内容删除
参考资料:
https://zh.wikipedia.org/zh-cn/Git
http://rogerdudler.github.io/git-guide/index.zh.html http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374027586935cf69c53637d8458c9aec27dd546a6cd6000