教程目录
01_版本控制概述
02_Git概述
03_Git下载和安装
04_Git底层原理解析
05_Git命令详解 - CRUD
06_Git命令详解 - 分支
07_Git命令详解 - 后悔药
08_Git远程仓库
Git高层命令 - CRUD
初始化仓库
# 命令
git init
解析:要对现有的某个项目开始用 Git管理,只需到此项目所在的目录,执行:git init
作用:初始化后,在当前目录下会出现一个名为 .git的目录,所有Git需要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边所有的文件和目录,但我们还没有开始跟踪管理项目中的任何一个文件。
记录每次更新到仓库
工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是已提交,已修改或者已暂存。
所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。
初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为已提交;在编辑过某些文件之后,Git将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件。
使用 Git时的文件状态变化周期如下图所示:
检查当前文件状态
命令:git status
作用:确定文件当前处于什么状态
初始化仓库后的文件
如果在初始化仓库之后立即执行此命令,会看到类似这样的输出:
On branch masternothing to commit, working directory clean
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪的新文件,否则 Git会在这里列出来。最后,该命令还显示了当前所在的分支是 master,这是默认的分支名称,实际是可以修改的,现在先不用考虑。
未跟踪文件
如果创建一个新文件 README,保存退出后运行 git status会看到该文件出现
echo '使用之前请先阅读我' > README
在未跟踪文件列表中:
On branch masterNo commits yetUntracked files:(use "git add <file>..." to include in what will be committed)READMEnothing added to commit but untracked files present (use "git add" to track)
在状态报告中可以看到新建的 README文件出现在“Untracked files”下面。未跟踪的文件意味着 Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”,因而不用担心把临时文件什么的也归入版本管理。
跟踪新文件(暂存)
# 命令:
git add 文件名/目录名
作用:跟踪一个新文件
再次运行 git status命令,会看到 README文件已被跟踪,并处于暂存状态:
On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: README
只要在 “Changes to be committed”这行下面的,就说明是已暂存状态。
如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中。在git add后面可以指明要跟踪的文件或目录路径。如果是目录的话,就说明要递归跟踪该目录下的所有文件。(译注:其实 git add的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area,同时未曾跟踪过的文件标识为已暂存。
修改已暂存文件
现在 README文件都已暂存,下次提交时就会一并记录到仓库。假设此时,你想要在 README里再加点注释,重新编辑存盘后,准备好提交。不过且慢,再运行 git status看看:
On branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: READMEChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: README
README文件出现了两次!一次算已修改,一次算已暂存,这怎么可能呢?好吧,实际上 Git只不过暂存了你运行 git add命令时的版本,如果现在提交,那么提交的是添加注释前的版本,而非当前工作目录中的版本。所以,运行了 git add之后又作了修订的文件,需要重新运行 git add把最新版本重新暂存起来:
# 重新运行,把最新版本暂存起来
git add README# 查看状态
git statusOn branch masterNo commits yetChanges to be committed:(use "git rm --cached <file>..." to unstage)new file: README
查看已暂存和未暂存的更新
实际上 git status的显示比较简单,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,可以用 git diff命令.这个命令它已经能解决我们两个问题了:当前做的哪些更新还没有暂存?有哪些更新已经暂存起来准备好了下次提交?
1.当前做的哪些更新还没有暂存?,
命令:git diff(不加参数直接输入 git diff)
2.有哪些更新已经暂存起来准备好了下次提交?
命令: git diff --cached 或者 git diff --staged(1.6.1以上)
提交更新
当暂存区域已经准备妥当可以提交时,在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用 git status看下,是不是都已暂存起来了,然后再运行提交命令 git commit。
# 命令:
git commit
注意:这种方式会启动文本编辑器以便输入本次提交的说明默认的提交消息包含最后一次运行 git status的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。
另外也可以用 -m参数后跟提交说明的方式,在一行命令中提交更新:
# 命令:
git commit –m “message xxx”
提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,
可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目作一次快照,
乱码解决:
直接右键,选择Options…-->Text-->Locale里面选择zh_CN,Character set选择UTF-8;
window -->UI language-->zh_CN;
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8/gbk
Git解决中文乱码问题
跳过使用暂存区域
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit加上 -a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add步骤
# 命令
git commit -a
移除文件
常规删除
手动删除(或rm命令)工作区文件,删除相对于git来说是修改操作,但是它不会删除本地库的对象,反而在本地库进行了新增(添加了一个tree对象和commit对象)
注:如果想要通过git重新得到删除的文件,后续再讲
git命令删除
要从 Git中移除某个文件,就必须要从已跟踪文件清单中注册删除(确切地说,是在暂存区域注册删除),然后提交。可以用 git rm命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
1、运行 git rm删除工作目录文件,并记录此次移除文件的操作(将修改添加到暂存区)
2、提交的时候,该文件就不再纳入版本管理了
文件改名
常规改名
git命令改名
# 改名命令
git mv newDemo.txt new.docx# 相当于
mv newDemo.txt new.docx
git add new.docx
其实,运行git mv就相当于运行了下面三条命令:
$ mv README.txt README
$ git rm README.txt
$ git add README
查看历史记录
# 命令
git log
在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。
完成这个任务最简单而又有效的工具是git log命令
$ git log
commit d86d577311a7fb263f1594d81c783bafe0f396a7 (HEAD -> master)
Author: jingerbo <jingerbo@newcapec.net>
Date: Sun Aug 23 20:56:44 2020 +0800修改了文件名commit 8a3d0fbcdc691e96448b1c664089242c0111597f
Author: jingerbo <jingerbo@newcapec.net>
Date: Sun Aug 23 20:52:56 2020 +0800提交new.txtcommit aa97d21c663f1588515fa3de4c15c2083c9d75d5
Author: jingerbo <jingerbo@newcapec.net>
Date: Sun Aug 23 20:38:57 2020 +0800删除READMEcommit d80c4c1d201c52411c8545e628cc1ec037ca411a
Author: jingerbo <jingerbo@newcapec.net>
Date: Sun Aug 23 20:23:32 2020 +0800跳过使用暂存区域commit eb8e6ced6854f2834e7d581d4eeec1df56c77881
Author: jingerbo <jingerbo@newcapec.net>
Date: Sun Aug 23 19:15:19 2020 +0800提交修改的数据
默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面。正如你所看到的,这个命令会列出每个提交的 SHA-1校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
# git log参数git log --pretty=onelinegit log --oneline
多屏显示控制方式:
空格:向下翻页
b:向上翻页
上箭头/下箭头:向上一行/向下一行
q:退出
总结
# 新增命令
在工作目录中新增文件
git add ./
git commit -m "msg" # 修改命令
在工作目录中修改文件
git add ./
git commit -m "msg" # 查询命令
git status : 查看工作目录中文件的状态(已跟踪(已提交 已暂存 已修改) 未跟踪)
git diff : 查看未暂存的修改
git diff --cache : 查看未提交的暂存
git log --oneline : 查看提交记录# 删除 & 重命名
git rm 要删除的文件 git mv 老文件 新文件
git status git status
git commit -m "msg" git commit -m "msg"