安装Git和git命令使用

文章目录

安装Git

在Windows上安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到"Git"->"Git Bash",蹦出一个类似命令行窗口的东西,就说明Git安装成功!

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

powershell 复制代码
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

可以再输入$ git config user.name然后回车,如果设置成功了就会显示你刚刚设置的用户名,同理,可以用$ git config user.email来查看你设置的邮箱

创建版本库

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

首先,选择一个合适的地方,创建一个空目录:

powershell 复制代码
$ mkdir learngit
$ cd learngit
$ pwd

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

powershell 复制代码
$ git init

当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。(如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见)

把文件添加到版本库
windows注意

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个"?",明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。

现在我们编写一个HelloWorld.txt文件,内容如下:Hello World

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

第一步,用命令git add告诉Git,把文件添加到仓库:

powershell 复制代码
$ git add HelloWorld.txt

第二步,用命令git commit告诉Git,把文件提交到仓库:

powershell 复制代码
$ git commit -m "this is a .txt file"

-m后面输入的是本次提交的说明

执行成功后,1 file changed:1个文件被改动(我们新添加的HelloWorld.txt文件);1 insertions:插入了1行内容(HelloWorld.txt有两行内容)。

为什么Git添加文件需要两步呢?

因为commit可以一次提交很多文件,所以你可以多次add不同的文件。

版本回退

修改HelloWorld.txt文件如下:

Hello World

Hello ZhangSan

然后尝试提交:

powershell 复制代码
$ git add HelloWorld.txt
$ git commit -m "append ZhangSan"

用git log命令查看:

powershell 复制代码
$ git log

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

powershell 复制代码
$ git log --pretty=oneline

现在我们准备把readme.txt回退到上一个版本

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交。

上一个版本就是HEAD^

上上一个版本就是HEAD^^

当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本append zhangsan回退到上一个版本,就可以使用git reset命令:

powershell 复制代码
$ git reset --hard HEAD^

使用cat查看内容

powershell 复制代码
$ cat HelloWorld.txt

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

powershell 复制代码
$ git log

最新的那个版本append ZhangSan已经看不到了。

想要回答最新的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append ZhangSan的commit id是c674ddd,于是就可以指定回到未来的某个版本:

$ git reset --hard c674ddd

此外Git提供了一个命令git reflog用来记录你的每一次命令:

powershell 复制代码
$ git reflog

可以看到commit id

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

工作区和暂存区

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

我们再练习一遍,先对HelloWorld.txt做个修改:

Hello World

Hello ZhangSan

chat GPT

然后,在工作区新增一个LICENSE文本文件。

先用git status查看一下状态:

powershell 复制代码
$ git status

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

现在,使用两次命令git add,把readme.txt和LICENSE都添加后,用git status再查看一下:

powershell 复制代码
$ git status

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

powershell 复制代码
$ git commit -m "understand how stage works"

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

powershell 复制代码
$ git status

管理修改

为什么Git比其他版本控制系统设计得优秀?

因为Git跟踪并管理的是修改,而非文件。

第一步,对HelloWorld.txt做一个修改,比如加一行内容:

Hello World

Hello ZhangSan

chat GPT

Gpt is Generative Pre-Trained Transformer

然后,添加:

shell 复制代码
$ git add HelloWorld.txt
$ git status

再修改HelloWorld.txt:

Hello World

Hello ZhangSan

chat GPT

Gpt is Generative Pre-Trained Transformer,The AI big model is more like the human brain.

提交:

powershell 复制代码
$ git commit -m "GPT Readme"

再看看状态:

shell 复制代码
$ git status

怎么第二次的修改没有被提交?

第一次修改 -> git add -> 第二次修改 -> git commit

当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

提交后,用git diff HEAD -- HelloWorld.txt命令可以查看工作区和版本库里面最新版本的区别:

powershell 复制代码
$ git diff HEAD -- HelloWorld.txt 

注意:+后面是版本库缺少的。

撤销修改

git checkout -- file可以丢弃工作区的修改:

powershell 复制代码
$ git checkout -- HelloWorld.txt

git checkout -- file命令中的--很重要,没有--,就变成了"切换到另一个分支"的命令。

如果已经git add到暂存区了,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交:

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

powershell 复制代码
$ git reset HEAD HelloWorld.txt

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

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

####### 删除文件

先添加一个新文件test.txt到Git并且提交:

如果你直接用rm命令删了:

powershell 复制代码
$ rm test.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

powershell 复制代码
$ git status

要确实从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

powershell 复制代码
$ git rm test.txt
$ git commit -m "remove test.txt"

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

小结:

git rm test.txt 相当于是删除工作目录中的test.txt文件,并把此次删除操作提交到了暂存区。

使用git checkout -- test.txt相当于是让工作目录test.txt恢复到暂存区中test.txt的状态,但是工作目录中test.txt已经被删除,无法找到文件来再次删除所以报错,必须先使用git reset head test.txt在暂存区中将删除操作丢弃,然后在git checkout -- test.txt就是直接将工作目录中test.txt恢复到版本库中的状态。

相关推荐
码农君莫笑3 分钟前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
mubeibeinv13 分钟前
项目搭建+图片(添加+图片)
java·服务器·前端
苏三有春23 分钟前
五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)
git·go·github
无为之士23 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
秋名山小桃子32 分钟前
Kunlun 2280服务器(ARM)Raid卡磁盘盘符漂移问题解决
运维·服务器
与君共勉1213833 分钟前
Nginx 负载均衡的实现
运维·服务器·nginx·负载均衡
岑梓铭40 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
努力学习的小廉40 分钟前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
MZWeiei43 分钟前
Zookeeper的选举机制
大数据·分布式·zookeeper
MZWeiei44 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper