Git 使用笔记
参考链接:
创建版本库 - Git教程 - 廖雪峰的官方网站
Git使用教程,最详细,最傻瓜,最浅显,真正手把手教 - 知乎
命令使用
cd f: 切换目录到 F 盘
cd gitCxl 切换目录到 gitCxl 文件夹
mkdir gitCxl 创建新文件夹 gitCxl
pwd 打印当前目录
git init 将当前目录设置为git可管理的仓库
git add readme.txt 将 readme.txt 添加到暂存区
git commit -m "提交说明" 把暂存区内的所有文件提交到仓库
常用的
git commit
参数和选项:
-m <message>
或--message=<message>
- 直接在命令行上指定提交信息(commit message)。这是最常用的参数之一,因为它允许你快速附加一条描述性消息来解释更改。
-a
或--all
- 自动将所有已跟踪文件的更改(包括那些没有被
git add
明确添加到暂存区的文件)提交。这通常用于快速提交所有更改,但请注意,它不会添加新文件到仓库中。-v
或--verbose
- 在提交时显示差异(diff)和提交信息。这有助于在提交前再次确认更改。
--amend
- 修改最近的提交。这允许你更改最近的提交信息或添加更多更改到该提交中,而不是创建一个新的提交。
--signoff
或-s
- 在提交信息中添加一个签名行(Signed-off-by),这通常用于表示你同意某些开发准则或协议。
--no-verify
- 绕过提交前的钩子(hook)脚本。Git 允许你在提交前运行自定义脚本以检查代码风格、测试等。使用此选项可以跳过这些检查。
--allow-empty
- 允许创建一个空的提交(即没有更改的提交)。这通常用于记录项目状态或触发某些构建/部署流程。
--allow-empty-message
- 允许提交一个空的提交信息(即不附带任何描述)。通常,Git 会阻止这种提交以防止无意义的提交记录。
--template=<file>
- 使用指定的文件作为提交信息的模板。这可以帮助你遵循特定的提交信息格式或包含额外的信息。
--author=<author>
- 指定提交的作者信息。这通常用于修复错误的作者信息或代表其他人提交更改。
--date=<date>
- 指定提交的日期和时间。这可以用于调整提交的时间戳,但通常不建议这样做,因为它可能会混淆项目的历史记录。
git status 查看是否还有文件未提交(状态)
git diff readme.txt 查看readme.txt文件内的改动
git log 查看从近到远的提交日志(历史记录)
git log --pretty=oneline 只查看提交说的注释信息
————
回退到上一个版本:git reset --hard HEAD^
回退到上上个版本:git reset --hard HEAD^^
回退到前100个版本:git reset --hard HEAD~100
注:
--hard
会回退到上个版本的已提交状态,
--soft
会回退到上个版本的未提交状态,
--mixed
会回退到上个版本已添加但未提交的状态。————
cat readme.txt 查看readme.txt的内容(实验发现是本地文件的内容,不是仓库中文件的内容)
git reflog 获取版本号;
git reset --hard 版本号 回退到版本号对应的那个版本
git diff HEAD -- readme.txt 查看工作区和版本库里面最新版本的区别
初始创建版本库
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。
注意:git config --global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
cd
是 "change directory" 的缩写,意为“切换目录”;
mkdir
是 "make directory" 的缩写,用于创建新目录(文件夹);
pwd
是 "print working directory" 的缩写,意为“打印当前工作目录”,用于显示当前的目录;git init 把当前的这个目录变成 git可以管理的仓库。
git add readme.txt 将版本库gitCxl目录下的记事本文件 readme.txt添加到暂存区里面去(没有任何提示,则说明已经添加成功)。
git commit 告诉Git,把文件提交到仓库 (-m后" "里的内容为本次提交的注释说明)。
git commit
命令执行成功后会告诉你:
1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
git status 来查看是否还有文件未提交。
- 黄色:说明没有任何文件未提交;
- 蓝色:告诉我们 readme.txt 文件已被修改,但是未被提交的修改。
git diff readme.txt 查看readme.txt文件到底改了什么内容,如下:
如上可看到,readme.txt文件内容从二行改成 三行 添加了一行22222222内容。
知道了对readme.txt文件做了什么修改后,我们可以放心的提交到仓库了,提交修改和提交文件是一样的2步(第一步是git add 第二步是:git commit)。
输入
git add readme.txt
,报错1:
fatal: not a git repository (or any of the parent directories)
。原因:Git命令必须在Git仓库目录内执行(
git init
除外),在仓库目录外执行是没有意义的。报错2:
fatal: pathspec 'readme.txt' did not match any files
。原因:添加某个文件时,该文件必须在当前目录下存在,用
ls
或者dir
命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。
- 总结:
初始化一个Git仓库,使用
git init
命令。添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,(可反复多次使用,添加多个文件);- 使用命令
git commit -m <message>
,完成。
版本管理
查看提交日志
git log 查看历史记录,显示从最近到最远的提交日志。
文件修改内容:
初始:(版本一) Git is a version control system. Git is free software. 第一次修改后:(版本二) Git is a version control system. Git is free software. 22222222 33333333 第二次修改后:(版本三) Git is a version control system. Git is free software. 22222222
如果嫌输出的信息太多,则可加上
--pretty=oneline
参数。即,使用命令 git log --pretty=oneline 演示:
黄色一大串类似
1094adb...
的是commit id
(版本号)。和SVN不一样,Git的
commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。commit id以
自己的为准。
commit id
需要用这么一大串数字表示是因为:Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线。
版本回退
若想把当前的版本回退:
回退到上一个版本:git reset --hard HEAD^
回退到上上个版本:git reset --hard HEAD^^
回退到前100个版本:git reset --hard HEAD~100
注:
--hard
会回退到上个版本的已提交状态,
--soft
会回退到上个版本的未提交状态,
--mixed
会回退到上个版本已添加但未提交的状态。使用示例:(回退到上一个版本,也就是版本二)
cat readme.txt 查看readme.txt的内容。
cat 是“concatenate”的缩写,意为“连接”或“串联”。其原意是用来将文件内容连接并输出到标准输出设备(通常是屏幕),被广泛用于查看文件内容。
(此时查看文件内容发现,确实已经回退到上一个版本了。)
此时,再用 git log 查看历史记录信息,看下现在版本库的状态:
发现第二次修改的那个 “删除内容333333,只剩222” 看不到了。
若现在想回退到最新的版本(版本三),也就是刚刚看不到的那个版本,则可通过版本号进行回退。
git reflog 可获取版本号;
git reset --hard 版本号,用于回退到版本号对应的那个版本。
(版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,否则Git可能会找到多个版本号,就无法确定是哪一个了。)
到此,已经又回到了最新那个版本(版本三)。
————
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的
HEAD
指针。当你回退版本的时候,Git仅仅是把HEAD从指向(版本三),改为指向(版本二)。
然后顺便把工作区的文件更新了。所以你让
HEAD
指向哪个版本号,你就把当前版本定位在哪。
- 总结:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。- 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本(利用其版本号)。
工作区和暂存区
工作区:就是在电脑上能看到的目录。比如:
- 目录下gitCxl里的文件(.git隐藏目录版本库除外)。
- 以后需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,而是Git的版本库。
- 其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
我们前面说过使用Git提交文件到版本库有两步:
- 第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。
- 第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。
因为创建Git版本库时,Git自动为我们创建了唯一一个
master
分支,所以现在,
git commit
就是往master
分支上提交更改。可以简单理解为,需要提交的文件修改通通放到暂存区,然后一次性提交暂存区的所有修改。
- demo演示如下:
修改 readme.txt 的内容,新增加 addnew.txt 文件。
1、先用命令 git status来查看下状态:
Git非常清楚地告诉我们:
readme.txt
被修改了;test.txt
还从来没有被添加过,所以它的状态是Untracked
。2、使用git add 命令把2个文件都添加到暂存区中,再使用git status来查看下状态:
add之后,此时两个文件皆处于暂存区中。
所以,
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行
git commit
就可以一次性把暂存区的所有修改提交到分支。3、执行
git commit
就可以一次性把暂存区的所有修改提交到分支:
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的,如上。
管理修改
Git跟踪并管理的是修改,而非文件。
- 举个例子:
1、修改内容后使用 git add 添加到暂存区中;
2、在暂存区中 的前提下,再修改内容;
3、使用 git commit 提交到仓库。
也就是说,过程是【第一次修改 ->
git add
-> 第二次修改 ->git commit】 。
提交后会发现,第二次的修改并没有被提交。
- 因为:
Git管理的是修改。
当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交。但是,在工作区的第二次修改并没有放入暂存区。
所以,
git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
拓展
git的命名窗口关闭之后,继续使用之前创建的仓库
无需重新创建。
在你创建仓库文件夹内鼠标右键有个 Git Bash Here打开就好,
或者按住shift加鼠标右键有个 `在此处打开Powershell窗口`,都可以直接 使用git命令。