· 孙金帅的技术博客

栏目: 编程工具 · 发布时间: 7年前

内容简介:· 孙金帅的技术博客

安装 git

如果你正在使用Mac做开发,有两种安装 git 的方法。

安装完成后,还需要最后一步设置,在命令行输入:

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

创建 git 仓库

git 仓库,英文名 repository ,你可以简单理解成一个目录,这个目录里面的所有文件都可以被 git 管理起来,每个文件的修改、删除, git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

首先创建一个空目录:

➜  desktop git:(master) ✗ mkdir learngit
➜  desktop git:(master) ✗ cd learngit
➜  learngit git:(master) ✗ pwd
/Users/michael/desktop/learngit
➜  learngit git:(master) ✗

pwd 命令用于显示当前目录的相对路径。

通过 git init 命令初始化一个 git 仓库:

➜  learngit git:(master) ✗ git init
Initialized empty Git repository in /Users/michael/Desktop/learngit/.git/
➜  learngit git:(master)

通过 ls -ah 命令可以看到当前目录下多了一个 .git 的目录,这个目录就是 git 来跟踪管理 git 库的。

➜  learngit git:(master) ls -ah
.    ..   .git
➜  learngit git:(master)

创建测试文本文件

➜  learngit git:(master) touch readme.txt
➜  learngit git:(master) ✗ ls
readme.txt
➜  learngit git:(master) ✗

通过 vim 命令添加测试内容。

➜  learngit git:(master) ✗ vim readme.txt
2 files to edit
➜  learngit git:(master) ✗

一定要放到 learngit 目录下(子目录也行),因为这是一个 git 仓库,放到其他地方 git 再厉害也找不到这个文件。

把文件添加到 git 仓库

➜  learngit git:(master) ✗ git add readme.txt
➜  learngit git:(master) ✗

把文件提交到 git 仓库

➜  learngit git:(master) ✗ git commit -m "wrote a readme file"
[master (root-commit) e030980] wrote a readme file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme.txt
➜  learngit git:(master) ✗

git status

修改刚才提交的 readme.txt 文件, git status :查看 git 仓库当前的状态

➜  learngit git:(master) ✗ 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")
➜  learngit git:(master) ✗

git diff

git diff 可以查看文件的修改内容

diff --git a/readme.txt b/readme.txt
index e69de29..4d53f0e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -0,0 +1,2 @@
+git is a distributed version control system.
+git is free software.

版本回退

git log 查看 git 仓库里面提交的历史记录。

commit 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e
Author: 孙金帅 <s_mike@163.com>
Date:   Wed Jun 7 10:17:24 2017 +0800

    add distributed

commit e03098052675e44512f8f2869e2d56636eb2e16b
Author: 孙金帅 <s_mike@163.com>
Date:   Wed Jun 7 10:01:33 2017 +0800

    wrote a readme file

git log 命令显示从最近到最远的提交日志。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

3eb6880960b72a578eb2ee6308d6b3e26bb92e0e add distributed
e03098052675e44512f8f2869e2d56636eb2e16b wrote a readme file

看到的一大串类似3628164…882e1e0的是 commit id (版本号),和 svn 不一样, gitcommit id 不是1,2,3……递增的数字,而是一个 SHA1 计算出来的一个非常大的数字,用十六进制表示,而且你看到的 commit id 和我的肯定不一样,以你自己的为准。为什么 commit id 需要用这么一大串数字表示呢?因为 git 是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

版本回退,首先, git 必须知道当前版本是哪个版本,在 git 中,用 HEAD 表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是 HEAD~1 ,上上一个版本就是 HEAD~2 ,往上100个版本写成 HEAD~100

把当前版本 “add distributed” 回退到上一个版本 “wrote a readme file” ,就可以使用 git reset 命令:

➜  learngit git:(master) git reset --hard head~1
HEAD is now at e030980 wrote a readme file
➜  learngit git:(master)

git log 再看看现在版本库的状态:

commit e03098052675e44512f8f2869e2d56636eb2e16b
Author: 孙金帅 <s_mike@163.com>
Date:   Wed Jun 7 10:01:33 2017 +0800

    wrote a readme file

最新的那个版本 add distributed 已经看不到了。好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个 add distributed 的commit id是3eb6880960b72a578eb2ee6308d6b3e26bb92e0e,于是就可以指定回到未来的某个版本:

➜  learngit git:(master) git reset --hard 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e
HEAD is now at 3eb6880 add distributed
➜  learngit git:(master)

版本号没必要写全,前几位就可以了, git 会自动去找。当然也不能只写前一两位,因为 git 可能会找到多个版本号,就无法确定是哪一个了。

查看 readme.txt 的内容:

➜  learngit git:(master) cat readme.txt
git is a distributed version control system.
git is free software.
➜  learngit git:(master)

git 的版本回退速度非常快,因为 git 在内部有个指向当前版本的 HEAD 指针,当你回退版本的时候, git 仅仅是把 HEAD 从指向 add distributed

· 孙金帅的技术博客

改为指向 wrote a readme file

· 孙金帅的技术博客

然后顺便把工作区的文件更新了。所以你让 HEAD 指向哪个版本号,你就把当前版本定位在哪。

git reflog

假如,你想回退到新版本,但是又找不到新版本的 commit id ,在git中,可以使用 git reflog 找到新版本的 commit id 。然后在使用 git reset 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e ,就可以回退到新版本了。

git reflog 查看命令历史,用来记录你的每一次命令:

3eb6880 HEAD@{0}: reset: moving to 3eb6880960b72a578eb2ee6308d6b3e26bb92e0e
e030980 HEAD@{1}: reset: moving to head~1
3eb6880 HEAD@{2}: reset: moving to head
3eb6880 HEAD@{3}: commit: add distributed
e030980 HEAD@{4}: commit (initial): wrote a readme file

工作区和暂存区

工作区可以理解为,新建或者workingcopy下来的文件夹,可以在文件夹里面,新增删除文件等等。

暂存区可以理解为,当使用 git init 命令初始化 git 仓库里面有一个隐藏的 .git 文件,里面就存放暂存区空间和分支 master 空间,以及指向的一个指针叫 HEAD

· 孙金帅的技术博客

使用 git add 把文件添加 git 仓库,实际上就是把文件修改添加到暂存区;

使用 git commit 提交文件,实际上就是把暂存区的所有内容提交到当前分支。

例如:

修改 readme.txt ,然后在工作区新增一个 LICENSE 文本文件。

然后, 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

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	LICENSE

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

git 非常清楚地告诉我们, readme.txt 被修改了,而 LICENSE 还从来没有被添加过,所以它的状态是 Untracked

现在,使用命令 git add . ,把 readme.txtLICENSE 都添加后,用 git status 再查看一下:

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

	new file:   LICENSE
	modified:   readme.txt

➜  learngit git:(master) ✗

现在,暂存区的状态就变成这样了:

· 孙金帅的技术博客

所以, git add 命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到分支。

➜  learngit git:(master) ✗ git commit -m "understand how stage works"
[master 97bf1a5] understand how stage works
 2 files changed, 3 insertions(+), 2 deletions(-)
 create mode 100644 LICENSE
➜  learngit git:(master)

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:

➜  learngit git:(master) git status
On branch master
nothing to commit, working tree clean
➜  learngit git:(master)

现在版本库变成了这样,暂存区就没有任何内容了:

· 孙金帅的技术博客

撤销修改

场景1:当你改乱了工作区某个文件的内容。

例如,在 readme.txt 改乱了一行代码,但是没有通过 git add 命令把错误文件添加到 git 仓库里面的暂存区。

➜  learngit git:(master) ✗ cat readme.txt
git is a distributed version control system.
git is free software.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN. // 错误代码
➜  learngit git:(master) ✗

既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。如果用git status查看一下:

➜  learngit git:(master) ✗ 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")
➜  learngit git:(master) ✗

git 会告诉你, git checkout -- file 可以丢弃工作区的修改:

git checkout -- readme.txt

命令 git checkout -- readme.txt 意思就是,把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:

一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次 git commitgit add 时的状态。

查看 readme.txt 的文件内容:

➜  learngit git:(master) cat readme.txt
git is a distributed version control system.
git is free software.
➜  learngit git:(master)

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时.

例如,在 readme.txt 改乱了一行代码,并且使用通过 git add 命令把错误文件添加到 git 仓库里面的暂存区。但是在 commit 之前,你发现了这个问题。用 git status 查看一下,修改只是添加到了暂存区,还没有提交:

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

	modified:   readme.txt

➜  learngit git:(master) ✗

git 同样告诉我们,用命令 git reset HEAD file 可以把暂存区的修改撤销掉(unstage),重新放回工作区:

➜  learngit git:(master) ✗ git reset HEAD readme.txt
Unstaged changes after reset:
M	readme.txt
➜  learngit git:(master) ✗

git reset 命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用 HEAD 时,表示最新的版本。

再用 git status 查看一下,现在暂存区是干净的,工作区有修改:

➜  learngit git:(master) ✗ 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")
➜  learngit git:(master) ✗

然后使用 git checkout -- file 可以丢弃工作区的修改:

➜  learngit git:(master) ✗ git checkout -- readme.txt
➜  learngit git:(master) git status
On branch master
nothing to commit, working tree clean
➜  learngit git:(master)

删除文件

git 中,删除也是一个修改操作,我们实战一下,先添加一个新文件 test.txtgit 并且提交:

➜  learngit git:(master) touch test.txt
➜  learngit git:(master) ✗ git add test.txt
➜  learngit git:(master) ✗ git commit -m "add test.txt"
[master 2c26a6d] add test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
➜  learngit git:(master)

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

➜  learngit git:(master) rm test.txt
➜  learngit git:(master) ✗ 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:    test.txt

no changes added to commit (use "git add" and/or "git commit -a")
➜  learngit git:(master) ✗

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令 git rm 删掉,并且 git commit

➜  learngit git:(master) ✗ git rm test.txt
rm 'test.txt'
➜  learngit git:(master) ✗ git commit -m "remove test.txt"
[master 584464a] remove test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt
➜  learngit git:(master)

现在,文件就从版本库中被删除了。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

git checkout -- test.txt

git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

命令 git rm 用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java EE WEB开发与项目实战

Java EE WEB开发与项目实战

李俊青 / 华中科技大学出版社 / 2011-11 / 59.80元

本书采用工程案例的形式,将日常Java EE项目开发所涉及的技术要点进行了解析,系统介绍了Apache的安装、Tomcat的安装、虚拟主机的配置、开发工具的搭配使用、验证码的使用、过滤器的使用、密码的加密与解密、JavaMail邮件发送、Web在线编辑器的使用、文件上传、数据库连接池、Ajax与Servlet的身份认证、Struts框架的应用、JSF框架的应用、Spring框架的应用、Hibern......一起来看看 《Java EE WEB开发与项目实战》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具