1.集中式和分布式版本控制系统
- 集中式:版本库集中存放在中央服务其,工作时,用的是自己的电脑,所以要从中央下载,干完活在推送回中央。中央服务器好比一个图书馆,你要该一本书,必须从图书馆接出来,然后自己改完再放回去。
- 分布式:没有中央服务器,每个人电脑都有一个完整的版本库,不需要联网也能工作。
2.Windows上安装Git
- 直接在Git官网下载安装程序,然后默认选项安装即可;
- 在开始菜单里找到Git->Git Bash,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
- 安装成功后,还需要最后一步设置,在命令行输入:
git config --global user.name "Your Name"
git config --global user.email "2457037852@qq.com"
3.创建一个空目录
- 版本库又名仓库,英repository,可以理解成一个目录,这个目录里所有的文件都可以被Git管理起来。每个文件的修改,删除,Git都能跟踪。 -创建
mkdir learngit
cd learngit
pwd
/Users/michael/learngit
pwd命令用于显示当前目录,这个仓库位于/Users/michael/learngit;
用个git init把目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
- 瞬间Git就把仓库建好了,而且告诉你是一个空的(empty Git repository);
- 目录下多了一个.git目录,这个目录是Git来跟踪管理版本库的;
- 用ls -ah命令可以查看隐藏的.git位置。
在learngit目录下的文件添加到仓库Git add
- 创建一个readme.txt文件
Git is a version control system.
Git is free software.
- 注意:文件一定放到learngit目录下;
- 用命令git add 告诉Git,把文件添加到仓库,后面添加文件名;
$ git add readme.txt
- 执行上面命令,没有任何显示,说明成功。没有消息就是最好的消息;
用git commit把文件提交到仓库
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
- -m后面输入的是本次提交的说明,可以输入有意义的内容,这样可以在历史记录里方便的找到改动记录;
- git commit命令执行成功后,告诉你:
1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容).
- 为什么Git添加文件需要add,commit两步呢?
- commit可以一次提交很多文件;
- 可以多次add不同的文件;
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
总结
现在总结一下今天学的两点内容:
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>,完成。
版本修改
- git status命令
- 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")
- git status命令让我们时刻掌握仓库当前的状态;
- 以上输出命令告诉我们,readme.txt被修改过了,但还没被提交;
- git diff
- 这个命令可以查看具体修改了什么内容;
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
- 知道了对
readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add:
$ git add readme.txt
同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交后,我们再用git status命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
小结:
- 要随时掌握工作区的状态,使用
git status命令。 - 如果
git status告诉你有文件被修改过,用git diff可以查看修改内容。
版本回退
git log命令查看提交的历史记录;
- 版本1:wrote a readme file
Git is a version control system.
Git is free software.
- 版本2:add distributed
Git is a distributed version control system.
Git is free software.
- 版本3:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL
最近的一次提交时append GPL,上一次是add distributed,最早一次是wrote a readme file。
git reset返回到之前版本
- 上一个版本HEAD^;
- 上上一个版本 HEAD^^;
- 上100个版本,写成HEAD~100; 我们把当前版本append GPL回退到上一版本add distributed,就可以使用下面命令
$ git reset --hard HEAD^
- 打开 readme.txt来查看是不是版本add distributed
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
cat是打开文件的意思。
- 刚才的GPL版本已经消失了,要想获得他怎么办,只要命令行没有关闭,顺着往上找,找到版本号,就可以回到指定的版本了。
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
- 如果你找不到版本号可以用git reflog来记录每一次命令;
工作区和暂存区
- Git和其他版本系统有一个不同之处就是暂存区;
- 工作区(working Directory) 就是你的电脑能看到的目录,比如learnright文件夹就是一个工作区;
- 版本库(repository)
- 工作区有一个隐藏目录.git,这个不算是工作区,而是Git的版本库;
- 版本库里存了很多东西,其中最重要的就是stage的暂存区;还有Git为我们自动创建的第一个分支
master,以及指向master的一个指针叫HEAD。- 用
git add把文件添加进去,实际上就是把文件修改添加到暂存区; - 用
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
- 用
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
- 在工作区新增一个文本文件LICENSE
- git status查看下状态
Untracked files: (use "git add ..." to include in what will be committed)
LICENSE
说明`LICENSE`还从来没有被添加过,所以它的状态是`Untracked`。
- 使用 git add,把文件添加后,就存放到暂存区了;
- 再git commit就把暂存区所有的内容提交到分支了。
## 管理修改
Git的优秀之处,它跟踪管理的是修改,而非文件
- 如果对readme.txt文件进行修改,然后git add read.txt;
- 再次对readme.txt文件修改,然后git commit
- 那么最终提交的是第一次修改的版本,一位第二次修改没有git add,没有放在暂存区;
- 所以正确的做法:第一次修改 -> `git add` -> 第二次修改 -> `git add` -> `git commit`。
### 小结:每次修改,如果不用`git add`到暂存区,那就不会加入到`commit`中。
## 撤销修改
- 工作区修改的撤销:
,Git会告诉你,`git checkout -- file`可以丢弃工作区的修改:
$ git checkout -- readme.txt
```一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 暂存区修改的撤销:用命令
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
小节
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。