Git学习总结

168 阅读4分钟

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仓库,分两步:

  1. 使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  2. 使用命令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分支上提交更改。

image.png

  • 在工作区新增一个文本文件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其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。