“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!设置用户名和邮箱相当于“自报家门”,提交的时候让中控机知道是谁提交的 $ git config --global user.name "Your Name" $ git c..._git 规范">
赞
踩
去Git官网进行下载
按默认选项进行安装
安装完成后可以在开始菜单里找到"Git"->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
设置用户名和邮箱
相当于“自报家门”,提交的时候让中控机知道是谁提交的
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --list
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
$ mkdir repository
$ cd repository
$ pwd
/g/repository
如果使用的是windows系统,为了避免一些问题,请确保目录名(包括父目录)不包含中文。
$ git init
Initialized empty Git repository in G:/repository/.git/
可以发现该目录下出现了一个 .git 目录
如果没有看到 .git 目录,那可能是因为这个目录是隐藏的,使用 ls -ah 命令可以看见
把文件添加到版本库
所有版本控制系统只能跟踪文本文件的改动,但图片、视频这种二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能知道文件的大小变了,但无法知道具体修改了哪里。
使用windows系统的时候要注意,不能用windows自带的记事本编辑任何文本文件,因为会产生编码问题,建议使用Notepad++来代替,并且把NotePad++的默认编码修改为UTF-8 without BOM
编写一个 readme.txt 文件,内容如下:
Git is a version control system
Git is free software
使用 git add 告诉Git,把文件提交到仓库 :
$ git add readme.txt
执行完之后没有任何显示,就表示添加成功
$ git commit -m "A readme file"
[master (root-commit) 2a00c8b] A readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
其中的内容是 1 file changed ,一个文件被修改, 2 insertions(+) ,插入了两行内容
继续工作,修改 readme.txt 中的内容
Git is a distributed version control system.
Git is free software.
运行 git status 命令查看状态
$ git status
On branch master
Changes not staged for commit:
(use “git add …” to update what will be committed)
(use “git checkout – …” to discard changes in working directory)
modified: readme.txt
no changes added to commit (use “git add” and/or “git commit -a”)
上面的命令输出告诉我们, readme.txt 被修改过了,但是没有提交。
如果想查看提交的具体内容,可以使用 git diff 命令
$ git diff
diff --git a/readme.txt b/readme.txt
index 09e8d4d..d5512c0 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system
+Git is a distributed control system
Git is free software
\ No newline at end of file
$ git add readme.txt
依然没有任何输出,在提交之前使用 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 distributd"
[master 8a282b1] add distributd
1 file changed, 1 insertion(+), 1 deletion(-)
一种较为简单的方法是,在工作区对文件修改之后运行 git commit -am " " 命令 或 git commit -a -m " " 命令 来将 git add filename 和 git commit -m " "合二为一、一步到位。
$ git status
On branch master
nothing to commit, working tree clean
当前没有药提交的需求,且工作目录是干净的
Git is a distributed control system
Git is free software distributed under the GPL..
$ git add readme.txt
$ git commit -m "add GPL"
[master 5573b4f] add GPL
1 file changed, 1 insertion(+), 1 deletion(-)
到目前我们已经提交了三次记录,可以利用 git log 来查看提交的历史记录
$ git log commit 5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master) Author: xmh <609692132@qq.com> Date: Mon Mar 18 18:48:54 2019 +0800 add GPL commit 8a282b123b2661f553fc7c49274cbc95ab4e4887 Author: xmh <609692132@qq.com> Date: Mon Mar 18 18:32:19 2019 +0800 add distributd commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada Author: xmh <609692132@qq.com> Date: Mon Mar 18 16:50:05 2019 +0800 A readme file
还有一种查看记录的方式是 git log --pretty=oneline
$ git log --pretty=oneline
5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master) add GPL
8a282b123b2661f553fc7c49274cbc95ab4e4887 add distributd
2a00c8b6367b225f472550e4e36905e0d4ef1ada A readme file
前面一大串的内容是 commit id (版本号),版本号用16进制表示,且每次都不同。
HEAD
在Git中,使用HEAD表示当前版本,用HEAD表示上一个版本,用HEAD^表示上上一个版本
正式开始版本穿梭
现在我们要把当前版本( add GPL )穿梭到上个版本( add distributd ),使用 git reset 命令
$ git reset --hard HEAD^
HEAD is now at 8a282b1 add distributd
git reset 命令有三个参数
–mixed 参数: 这个参数可以省略,在直接输入 git reset commit_id 的时候即代表 git reset --mixed commit_id 。该参数可以回退版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件
–soft 参数:不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件
–hard 参数:清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
使用 git log 查看提交历史记录,会发现因为回退了版本,所以少了最新的一条记录。
$ git log
commit 8a282b123b2661f553fc7c49274cbc95ab4e4887 (HEAD -> master)
Author: xmh <609692132@qq.com>
Date: Mon Mar 18 18:32:19 2019 +0800
add distributd
commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada
Author: xmh <609692132@qq.com>
Date: Mon Mar 18 16:50:05 2019 +0800
A readme file
其实相较于“撤销回退”来说,还是用“穿梭”更为合适,因为这步操作不是前进了一步之后向后退了一步,而是向前进一步之后再进一步,但是为了与上一步形成对比,暂用“撤销回退”。
\1. 使用 commit id 撤销回退
这种方法只建立在当前 Git Bash 窗口没有关闭的情况下,我们可以通过上下翻看命令和命令的输出内容来找到被回退的版本( add GPL )的 commit id ,然后就可以指定回到原来的那个版本
$ git reset --hard 5573b4
HEAD is now at 5573b4f add GPL
再次查看提交历史
$ git log commit 5573b4fd56ef86cc836924098d99f1968b81c531 (HEAD -> master) Author: xmh <609692132@qq.com> Date: Mon Mar 18 18:48:54 2019 +0800 add GPL commit 8a282b123b2661f553fc7c49274cbc95ab4e4887 Author: xmh <609692132@qq.com> Date: Mon Mar 18 18:32:19 2019 +0800 add distributd commit 2a00c8b6367b225f472550e4e36905e0d4ef1ada Author: xmh <609692132@qq.com> Date: Mon Mar 18 16:50:05 2019 +0800 A readme file
查看 readme.txt 中的内容,发现再次改变
$ cat readme.txt
Git is a distributed control system
Git is free software distributed under the GPL..
\2. 使用 git reflog 查看到 commit id 之后撤销版本回退
当关闭了Git Bash窗口之后,如果还想回退到 add GPL 版本的话,就必须找到 add GPL 的 commit id ,Git提供了一个 git reflog 来记录你的每次命令
$ git reflog
5573b4f (HEAD -> master) HEAD@{0}: reset: moving to 5573b4
8a282b1 HEAD@{1}: reset: moving to HEAD^
5573b4f (HEAD -> master) HEAD@{2}: commit: add GPL
8a282b1 HEAD@{3}: commit: add distributd
2a00c8b HEAD@{4}: commit (initial): A readme file
我们可以看到add GPL的 commit id 为5573b4
小结:
1. HEAD指向的版本就是当前版本
2. 穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。
3. 撤销回退时,用 git reflog 查看命令历史,以便确定要穿梭到的哪个版本。
工作区就是你在电脑中看到的目录,比如我的 repository 文件夹就是工作区,
工作区有一个隐藏的目录 .git ,这个就是Git的版本库。
版本库中存了很多东西,其中最重要的就是称为 stage (或者叫 index )的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD 。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个 master 分支,所以,现在 git commit 就是往 master 分支上提交更改。
其三者的关系如下图所示
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE.txt
nothing added to commit but untracked files present (use "git add" to track)
可以看到此时出现了一个未跟踪的(Untracked)的文件 LICENSE.txt
但此时的暂存区是空的
$ git add LICENSE.txt
查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE.txt
Git is a distributed control system
Git is free software distributed under the GPL..
Git has a mutable index called stage.
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE.txt
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
此时可以看到有两种分类:
5.将 readme.txt 文件提交到暂存区
$ git add readme.txt
查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE.txt
modified: readme.txt
可以看到这两个文件都被归类为“修改即将被提交”的文件,此时三者的状态也变为:
所以 git add 命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "To kown how stage works"
[master 07c1400] To kown how stage works
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 LICENSE.txt
查看状态
$ git status
On branch master
nothing to commit, working tree clean
提交之后,如果没有对工作区再进行修改的话,那么此时工作区就是干净的,而且于此同时,三者的状态也变为:
在这个章节,我们首先只要知道,Git跟踪并管理的是修改,而非文件。
Git is a distributed control system
Git is free software distributed under the GPL..
Git has a mutable index called stage.
Git tracks changes.
$ git add readme.txt
查看状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
Git is a distributed control system
Git is free software distributed under the GPL..
Git has a mutable index called stage.
Git tracks changes of files.
$ git commit -m "第二次修改未提交"
[master dc74f03] 第二次修改未提交
1 file changed, 2 insertions(+), 1 deletion(-)
$ 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")
在以前,我们每次提交之后,工作区都是干净的,然而这次却提示我们 readme.txt 文件被修改,可以有两个选择,一个是添加到暂存区,另一个是撤销工作区的修改。
回顾一下我们此次操作:
第一次修改 -> git add -> 第二次修改 -> git commit
我们添加到 master 节点的,仅仅是被 git add 操作放到暂存区的内容,而非是 readme.txt 文件
所以这就是Git管理的只是修改的原因
小结:
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
此章节类似于版本穿梭,但不同的是,版本穿梭时仅利用 commit id 就可以在多个版本之间来回穿梭,撤销修改只能一步一步的回退,是真正意义上的回退。
未提交到暂存区
在 readme.txt 文件的末尾随便添加一行,如果你发现这句话不合时宜,那么你可以选择手动删除,或者Git给了我们提示: 查看状态 ``` $ 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") ```
!!#ff0000 use "git checkout – … " to discard changes in working directory !!==> 使用"git checkout – "命令来放弃工作区中的修改
$ git checkout -- readme.txt
查看是否撤销
$ cat readme.txt
Git is a distributed control system
Git is free software distributed under the GPL..
Git has a mutable index called
文档果然恢复了原样。
命令 git checkout – readme.txt 意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。
已提交到暂存区
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
Git同样告诉我们使用“git reset HEAD ”可以把暂存区的修改撤销掉,重新放回工作区
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
$ git checkout -- readme.txt
已提交到本地版本库
提交到版本库之后就要利用版本穿梭,来进行修改。
已提交到远程版本库
无法再本地进行修改
首先在工作区创建一个 test.txt 的文件,添加到工作区后再提交到版本库
为了模拟删除文件的场景,我们首先把工作区中的 test.txt 文件删除,此时将面临两个情况
查看一下状态
$ 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")
Git提示我们:
使用 git add/rm filename 命令
$ git add test.txt
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: test.txt
Git告诉我们,如果提交的话,就会删除 test.txt 文件
$ git commit -m "delete test.txt"
[master ba751d5] delete test.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 test.txt
使用 git checkout – test.txt 命令就可以将被删除的 test.txt 文件恢复到工作区
git checkout – filename 命令就相当于将版本库中的内容同步到工作区
关于使用 git log --graph --oneline 命令时,所输出内容的括号中的信息,即下图红色框选择的部分
括号中的分支名表示这个分支停留在对应的commit_id,可以看到我们当前在dev分支下,如果我们切换到master分支:
可以看到mater分支仍然指向 919086c 提交点,而dev分支却不见了,这是因为dev分支超前master分支一个提交,所以自然看不到dev分支的状态
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。