安装git
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
Linux上安装Git
首先,你可以试着输入git
,看看系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
像上面的命令,有很多Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。
Windows上安装
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装后的配置
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git
是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email
地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git
仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email
地址。
查看当前配置
命令行中输入git config --list
。
如果输出为空,说明还未初始化,则使用上述方法。
如果已经初始化后,可以通过该指令看到自己的用户名和邮箱。
修改当前配置
git config --global --replace-all user.email “我的邮箱”
git config --global --replace-all user.name “用户名”
创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
git init创建版本库
所以,创建一个版本库非常简单,
-
首先,选择一个合适的地方,创建一个空目录。
-
第二步,通过
git init
命令把这个目录变成Git可以管理的仓库:瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个
.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
git clone创建版本库
- 用
git clone
时会自动创建一个版本库,并将远程仓库的内容完整地复制到本地。 - 与
github fork
的区别:git clone
是获取远程仓库的拷贝到本地进行开发和修改,而Fork
是在 GitHub 平台上创建原始仓库的独立副本,允许在自己的账号下自由地修改和管理代码库,并通过 Pull Request 向原始仓库提出改进建议。git clone 针对个人开发或团队协作,而 Fork 则更适用于开源项目和社区贡献。
git init
和git clone
创建版本库的区别
-
通过
git init
创建的仓库没有与远程仓库建立联系,需要手动添加远程仓库或进行代码的初始化提交。执行
git clone
命令时,Git 会自动为你创建一个本地仓库,并设置好与远程仓库的关联。克隆的仓库已经包含了所有的历史记录、分支信息和其他元数据。
把文件添加到版本库
-
编写一个
readme.txt
,把它放在上一步创建的仓库目录下(子目录也可以) -
用命令
git add
把文件添加到仓库$ git add readme.txt
-
用
git commit
告诉Git,把文件提交大仓库$ 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
简单解释一下
git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。为什么Git添加文件需要
add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件
版本穿梭
把修改提交到Git版本库
-
git add
-
git commit
-
git status
git status
命令可以让我们时刻掌握仓库当前的各种状态 -
git diff xxx
虽然Git告诉我们
xxx.yyy
被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的xxx.yyy
,所以,需要用git diff
这个命令看看:git diff
顾名思义就是查看difference,显示的格式正是Unix通用的diff格式。
版本回退
- 在
Git
中,我们用git log
命令查看提交日志,如下所示:
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
git log
命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
。
-
首先,Git必须知道当前版本是哪个版本,在Git中,用
HEAD
表示当前版本,也就是最新的提交1094adb...
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。现在,我们要把当前版本
append GPL
回退到上一个版本add distributed
,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
--hard
参数有啥意义?
但是要注意
git reset
后,日志中最新的提交就被删除了,如何恢复?第一个方法:记得住最新的版本号,直接
git reset --hard id
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个
append GPL
的commit id
是1094adb...
,于是就可以指定回到未来的某个版本:$ git reset --hard 1094a HEAD is now at 83b0afe append GPL
版本号没必要写全,前几位就可以了,Git会自动去找。
然后顺便把工作区的文件更新了。所以你让
HEAD
指向哪个版本号,你就把当前版本定位在哪。现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的
commit id
怎么办?第二个办法:利用
git reflog
来查看记录的命令来找到commit id当你用
$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:$ git reflog e475afc HEAD@{1}: reset: moving to HEAD^ 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL e475afc HEAD@{3}: commit: add distributed eaadf4e HEAD@{4}: commit (initial): wrote a readme file
工作区和暂存区
-
工作区就是电脑中能看到的目录
-
版本库(
repository
):工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为
stage
(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个
master
分支,所以,现在,git commit
就是往master
分支上提交更改。你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
管理修改
现在,假定你已经完全掌握了暂存区的概念。下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
Git管理的是修改,当你用git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
- 现在,你又理解了Git是如何跟踪修改的,每次修改,如果不用
git add
到暂存区,那就不会加入到commit
中。
撤销修改
小结:
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
命令
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改(工作区和暂存区的同时修改,所以不能直接用git checkout -- xxxfilename
),分两步,第一步用命令git reset HEAD
,就回到了场景1,第二步按场景1操作:git checkout -- xxxfilename
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退
一节,不过前提是没有推送到远程库:即找出没出错的提交的commit id,然后使用git reset xxxid
。
删除文件
-
正确的想删除某文件
- 工作区中
$rm test.txt
- 版本库中
$git rm test.txt
- 最后,
$git commit -m "remove xxx"
- 工作区中
-
删错了
$ git checkout -- test.txt
,将版本库的最新版本还原。