git学习(1)-git基础

Git 学习

首先安装 git ,安装过程很简单,省略。

安装完git之后需要配置git

$ git config --global user.name "Your Name"
$ git config --global user.email ""

初始化仓库

切换到你想要当作仓库的目录使用命令:

git init

工作区和暂存区

git学习(1)-git基础

如图所示,git分为工作区和版本仓库两个部分

其中版本仓库里边包含暂存区(stage)和【主】分支(master)

提交文件到暂存区

当我们编辑好一个文件想要将它加入到版本控制/版本仓库中去,第一步是要将文件提交到版本仓库的暂存区(stage),使用命令 git add <filename>·:

$ git add file.txt

如果想把当前目录下的所有文件和文件夹都添加到暂存区

$ git add .

tips:. 表示当前目录

将暂存区的文件提交到版本仓库的分支

一般情况下,我们将文件提交到暂存区之后,接下来的一步就是将文件提交至仓库分支上,这样才能达到版本控制的目的。使用命令git commit -m "some commit messages"

$ git commit -m "first commit message"

查看提交记录

查看详细提交记录使用命令:

$ git log
# 我们会看到像这样的输出
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: 。。。作者信息
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: 。。。作者信息
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: 。。。作者信息
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

有些场景下需要过滤掉一些不需要的信息,可以添加一些参数:

$ git log --pretty=oneline
$ git log --oneline # 这两句都是可以的 上面一句显示的commit id更长 更全一点

什么是 commit id?

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: 。。。作者信息
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

如上所示,这是git log 的其中一条 commit eaadf4e... commit 后边跟的这一串就是 commit id,注意commit 是很重要的一个东西 接下来我们还会用到这个。

查看当前仓库状态

如果我们忘记了我们提交的状态,可以使用命令:

$ git status

来查看当前仓库的状态 git 的提示非常友好,我们可以根据提示做相应的操作。

撤销修改

有两种撤销修改的场景

  1. 在工作区的文件撤销修改
  2. 已经被添加到暂存区的文件修改

第一种情况,工作区的文件撤销修改 首先查看一下仓库状态:

$ 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:   afile

no changes added to commit (use "git add" and/or "git commit -a")

可以看到,git 为我们提供了友好的提示 git checkout -- <file> 可以丢弃工作区的修改。

$ git checkout -- afile

上边命令的意思就是 把 afile 文件在工作区的修改全部撤销掉.

第二种情况,我们已经把文件放到暂存区了,但还没有commit提交到分支上, 同样的我们先查看仓库状态:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   afile

可以看到 git 给我们的提示,使用git reset HEAD <file> 可以将暂存区的修改撤销掉(unstage), 重新放回到工作区:

$ git reset HEAD afile
Unstaged changes after reset:
M	afile

当我们用HEAD时,表示最新的版本。

当我们再用 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:   afile

这样我们就又回到了第一种情况,使用同样的操作git checkout -- file 可以丢弃工作区修改。

版本回退

首先 我们需要回忆一下两个知识点:

  1. git log 命令
  2. commit id

使用 git log 可以查看提交日志,每一条提交日志里边都包含 commit id 即版本号。

还拿我们之前的例子来说,假设,我们查看 git 日志是下面的情况:

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: 。。。作者信息
Date:   Fri May 18 21:06:15 2018 +0800

    append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: 。。。作者信息
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: 。。。作者信息
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

可以看到,apend GPL 即有(HEAD -> master) 标注的提交版本是最新版本(当前版本),现在我们有某些需求,想要回退到 上一个版本即add distributed 版本。

我们只需要使用命令:

$ git reset --hard HEAD^

上边我们说到 HEAD 版本是最新版本, 那我们要回退一个版本可以使用 HEAD^ 做标记,回退两个也就是上上一个版本可以使用HEAD^^,那假如说要回退50个或者 100甚至更多版本写100个^也不太好数,所以git 就为我们提供了另外一种方式(波浪号后边跟数字)即HEAD~100

运行完上边的命令,我们又后悔了怎么办?

查看一下日志:

$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master)
Author: 。。。作者信息
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: 。。。作者信息
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

回退真的成功了,我们后悔了,怎么回去,git 还是有给我们留了后悔药的。

我们上边提到的第二个概念 commit id 可以帮助我们回到未来时刻。

如果没有关掉命令窗口,网上翻旧可以找到append GPL 的commit id是1094adb...,它就是我们回到未来的钥匙。

$ git reset --hard 1094ad
HEAD is now at 83b0afe append GPL

看提示,我们已经回来了。可以使用 git log 自己验证一下。

同样的 commit id 可以用来回退版本。

总结一下:三种方式

git reset --hard HEAD^  # 回退两个版本可以使用 HEAD^^
git reset --hard HEAD~13  # 13 是你想回退13个版本
git reset --hard 1094ad  # 1094ad 表示某一次提交的 commit 前几位

需要解释一下两个点:

--hard 参数是什么意思,这里我们学习期间先直接用就行了,后边会说到。

版本号commit id 当我们使用的时候不需要给完整的 commit id,因为 git 很聪明的会帮我们区匹配。一般情况下 会取版本号前几位,注意不能取1-2位这种的,相似性太高了,git会无法确定是那个版本。

删除文件

在开发过程中,避免不了删除文件,通常我们会通过文件管理器,或者rm命令删除文件

这里准备一个文件 gitrm.txt 并将它提交到了代码仓库

$ git add gitrm.txt

$ git commit -m "add gitrm.txt"
[master b84166e] add gitrm.txt
 1 file changed, 1 insertion(+)
 create mode 100644 gitrm.txt

现在将它删除掉

$ rm gitrm.txt

此时,工作区和版本库已经不一致了,git会知道你删除了一个文件 git status 查看一下

$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    gitrm.txt

no changes added to commit (use "git add" and/or "git commit -a")

正如上边 git 给我们的提示一样,我们现在有两个选择:

  1. 使用 git rm <file> 然后commit 删除掉仓库里边的文件。
  2. 如果发现删错了,后悔了, 使用 git checkout -- <file> 可以将版本库中的文件放到工作区

注意:git checkout 使用版本库中的版本替换工作区版本,所以无论工作区是修改还是删除都会被替换掉。另外没有被添加到过版本库的文件是没办法恢复的。

相关推荐