文章目录
- 简介
- git的安装配置
- git的安装
- git的配置
- git使用的基本流程
- 创建版本库
- 时光机穿梭
- 版本回退
- 工作区和暂存区
- 管理修改
- 撤销修改
- 删除文件
- 远程仓库
- 添加远程库
- 从远程库克隆
- 总结
简介
本文主要记录了我在学习git操作的过程,以及如何使用GitHub。建议先参考廖雪峰的git教程实操练习一遍,再利用Learning Git Branching进行巩固。下文内容是对廖雪峰git教程的实践
git的安装配置
git的安装
我们可以直接下载GitHub Desktop:https://desktop.github.com/,下载自带了git bash,我们无需重复安装git,GitHub Desktop提供了详细的新手指引,我们根据指引提交我们的项目。
也可以下载git:https://git-scm.com/
git的配置
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git使用的基本流程
创建版本库
mkdir learngit
cd learngit
通过git init
命令把这个目录变成Git可以管理的仓库:
git init
window里面可能无法显示.git文件,我们可以设置显示隐藏的项目。
现在我们编写一个readme.txt文件,内容如下:
Git is a version control system.
Git is free software.
第一步,用命令git add
告诉Git,把文件添加到仓库:
git add readme.txt
第二步,用命令git commit
告诉Git,把文件提交到仓库:
git commit -m "wrote a readme file"
git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
git commit
命令执行成功后会告诉你,1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
添加某个文件时,该文件必须在当前目录下存在,file4.txt
文件不存在,因此报错。
时光机穿梭
版本回退
修改readme.txt文件如下
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后进行提交:
git add readme.txt
git commit -m "append GPL"
在Git中,我们用git log
命令查看历史记录:
git log
git log命令显示从最近到最远的提交日志,我们可以看到3次提交。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
git log --pretty=oneline
你看到的一大串类似59a9fdd...
的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号可能发生冲突。
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD
表示当前版本,也就是最新的提交599fdd...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上1000个版本写1000个^比较容易数不过来,所以写成HEAD~1000。
可以使用git reset
命令进行版本回退:
git reset --hard HEAD^^
我们发现回退到了未修改readme.txt的那个版本。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针。
那我们如何对版本进行恢复呢?这里有两种方法:
- 情形一:直接利用
commit id
指定回到未来某个版本
- 情形二:当我们不知道
commit id
时,Git提供了一个命令git reflog
用来记录你的每一次命令,下面例子我们可以看出指针上一次指向59a9fdd
。
工作区和暂存区
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的learngit
文件夹就是一个工作区:
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
下面举一个例子:
- 先对readme.txt做个修改,比如加上一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
2. 在工作区新增一个LICENSE
文本文件
用git status
查看状态
使用两次命令git add
,把readme.txt
和LICENSE
都添加
git add readme.txt
git add LICENSE.txt
git status
现在,暂存区的状态就变成这样了:
执行git commit
就可以一次性把暂存区的所有修改提交到分支
git commit -m "understand how stage works"
git status
现在版本库变成了这样,暂存区就没有任何内容了:
管理修改
Git跟踪并管理的是修改,而非文件。
现在我们加上一行内容:
Git is a distributed version 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
然后再修改readme.txt文件:
Git is a distributed version 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 "git tracks changes"
git status
我们发现第二次的修改没有被提交,这是因为第二次的修改没有通过git add
放入缓存区,我们可以通过git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:
git diff HEAD -- readme.txt
可见第二次修改没有被提交,我们可以git add
后进行git commit
进行提交。
撤销修改
情形一:还未git add
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
使用git status
查看一下,Git会告诉你,git restore
可以丢弃工作区的修改:
git restore readme.txt
情形二:已经git add
到暂存区
git restore --staged readme.txt #暂存区回退
git restore readme.txt #工作区回退
情形三:已经git commit
,还没有推送到远程库中
git add readme.txt
git commit -m "fallback version"
git reflog
git reset --hard 389d734
删除文件
情况一:直接删除
这里删除file1.txt
文件
情况二:删错了,利用版本库对工作区文件进行还原。
这里删除file2.txt
文件
最后我们发下file1.txt文件被删除了,file2.txt文件还原了。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
远程仓库
添加远程库
git remote add origin https://github.com/liuxu-manifold/learngit.git
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
git push -u origin master
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
删除与远程库的关联
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
命令。使用前,建议先用git remote -v
查看远程库信息:
git remote -v
git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
从远程库克隆
如何解决 git@github.com permission denied (publickey). fatal could not read from remote repository
:https://zhuanlan.zhihu.com/p/454666519
git clone git@github.com:liuxu-manifold/liuxu-manifold.git
总结
本文记录了我在学习git过程中的一些常用命令,当我们对git有一个整体而全面的认识之后,我们后面可以通过查文档,或者GPT来完成任务。