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 checkout -- readme.txt 丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,有两种情况:(其实就是检出)(也可以把checkout换成resrore)
- 若自修改后未放到暂存区,则回退到版本库的状态;
- 若修改后已经放入暂存区,则回退到添加暂存区后的状态。
- 注意:命令git checkout -- readme.txt 中的 -- 很重要,若没有 -- 的话,则命令变成创建分支(切换都另一个分支)。
git reset HEAD <file> 把暂存区的修改撤销掉(unstage),重新放回工作区
git restore <file> 丢弃工作区的更改
git restore --staged <file> 撤销暂存区提交(只会删除暂存区的文件,不会影响工作目录)
rm b.txt 删除工作区的b.txt文件
git rm b.txt 从版本库中删除 b.txt 文件(删除后记得 git commit 提交)
👉初始创建版本库
$ 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>
,完成。
👉版本管理
1、查看提交日志
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历史,就可以更清楚地看到提交历史的时间线。
2、版本回退
若想把当前的版本回退:
回退到上一个版本: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
查看命令历史,以便确定要回到未来的哪个版本(利用其版本号)。
3、工作区和暂存区
工作区:就是在电脑上能看到的目录。比如:
- 目录下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
就可以一次性把暂存区的所有修改提交到分支:
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的,如上。
4、管理修改
Git跟踪并管理的是修改,而非文件。
- 举个例子:
1、修改内容后使用 git add 添加到暂存区中;
2、在暂存区中 的前提下,再修改内容;
3、使用 git commit 提交到仓库。
也就是说,过程是【第一次修改 ->
git add
-> 第二次修改 ->git commit】 。
提交后会发现,第二次的修改并没有被提交。
- 因为:
Git管理的是修改。
当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交。但是,在工作区的第二次修改并没有放入暂存区。
所以,
git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
————
提交后,
git diff HEAD -- readme.txt
可以查看工作区和版本库里面最新版本的区别,如上。若提交第二次修改,可以:
【第一次修改 ->
git add
-> 第二次修改 ->git add
->git commit】
即可把第二次修改提交。
所以,每次修改,若不用
git add
到暂存区,则不会加入到commit
中。
5、撤销修改
git checkout -- readme.txt 丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,有两种情况:(其实就是检出)(也可以把checkout换成resrore)
- 若自修改后未放到暂存区,则回退到版本库的状态;
- 若修改后已经放入暂存区,则回退到添加暂存区后的状态。
总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。————
撤销修改还有另外两种方法:
- 若知道要删掉哪些内容,可直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
- 可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^
使用示例:
1、在readme.txt文件里面增加一行内容为5555,通过cat命令查看文件内容,并用git statue查看下当前的状态如下:
2、用git checkout -- readme.txt 丢弃工作区的修改,把readme.txt文件在工作区做的修改全部撤销,并用cat查看文件内容,如下:
会发现工作区的修改 “增加的一行5555” 没了,也就是文件在工作区的修改已被撤销。(情况一)
再测试下情况二:
会发现撤销后,文件内容是回退到了暂存区中的状态,也就是情况二。
注意:命令git checkout -- readme.txt 中的 -- 很重要,若没有 -- 的话,则命令变成创建分支(切换都另一个分支)。
————
git reset HEAD readme.txt 把暂存区的修改撤销掉(unstage),重新放回工作区。
git reset 命令既可回退版本,也可把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
- 总结:
- 场景1:当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
- 场景2:当改乱了工作区某个文件的内容,且添加到了暂存区时,想丢弃修改,分两步:
- 第一步用命令git reset HEAD <file>,就回到了场景1,
- 第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节(回退到上一个版本:git reset --hard HEAD^),不过前提是没有推送到远程库。
6、删除文件
假如我现在版本库testgit目录添加一个文件b.txt,然后提交。如下:
直接在文件目录中把文件删了,或者使用如上rm命令:rm b.txt,此时工作区的b.txt文件已被删除。
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,
git status
命令会立刻告诉你哪些文件被删除了,如下:
此时有两个选择:
- 一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
- 情况一:将版本库中的对应也删除。
git rm b.txt 从版本库中删除 b.txt 文件,然后 git commit 提交,如下图:
注:
‘删除’也是一种‘修改’操作,先手动删除文件,然后使用 git add <file> 或者使用 git rm<file> 效果都是一样的。
- 情况二:删错了,需从版本库中将对应文件恢复。
git checkout -- b.txt 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
👉远程仓库
1、添加远程库
拓展
git的命名窗口关闭之后,继续使用之前创建的仓库
无需重新创建。
在你创建仓库文件夹内鼠标右键有个 Git Bash Here打开就好,
或者按住shift加鼠标右键有个 `在此处打开Powershell窗口`,都可以直接 使用git命令。