文章目录
- 前言
- git安装
- Linux
- Windows
- git配置
- 创建版本库
- 将文件添加到版本库
- 一次添加一个文件
- 一次添加多个文件
- 查看git状态
- 查看修改的差异
- 查看历史记录
- 当前版本
- 回退
- 回退到上一个版本
- 回退到某个版本
- 如果关闭当前窗口
- 如果关闭了当前窗口
- 工作区与版本库关系
- 查看工作区和版本库里面最新版本的区别
- 撤销修改
- 删除版本库中的文件
- 恢复误删文件
- 远程仓库(以GitHub为例)
- 创建并连接SSH Key
- 连接远程仓库
- 第一次将本地推送到远程库
- 第二次以后推送
- SSH警告
- 查看远程库
- 删除远程库
- 一些常见问题
- 推送的时候需要输入密码
- 解答
- 参考
前言
由于之前做项目的时候发现自己学过的git知识很多都忘记了,因为之前没有记录笔记,考虑到后面也会经常使用,所以闲来无事重新记录一下。
由于git的普遍性,所以不会讲git的作用,只是记录git相关命令的作用和使用。
git安装
Linux
Debian或Ubuntu Linux
sudo apt-get install git
如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:
./config
,make
,sudo make install
Windows
下载地址
git配置
安装完成后需要进行配置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
使用下面命令可以查看所有设置
git config --list
创建版本库
进入一个需要建立版本库的目录(即.git仓库)中,通过git init
命令把这个目录变成Git可以管理的仓库:
将文件添加到版本库
一次添加一个文件
需要三个步骤,比如改动的文件是readme.txt
- 把文件添加到仓库
git add
git add readme.txt
- 把文件提交到仓库
git commit -m "wrote a readme file"
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
一次添加多个文件
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
查看git状态
运行git status
命令查看git状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
查看修改的差异
需要用git diff
这个命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
查看历史记录
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800
append GPL
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800
add distributed
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800
wrote a readme file
git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
e475afc93c209a690c39c13a46716e8fa000c366 add distributed
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
当前版本
在Git中,用HEAD
表示当前版本
上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
回退
回退到上一个版本
现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed
此时本地中的文件就还原到上一个版本了
回退到某个版本
如果关闭当前窗口
通过查看历史版本,输入id的前几位(只要不与别的版本重复的几位即可,一般用5位)
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL
如果关闭了当前窗口
Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
此时再次执行git reset --hard 1094a
即可
工作区与版本库关系
工作区(Working Directory):就是你在电脑里能看到的目录
版本库(Repository):工作区有一个隐藏目录.git
查看工作区和版本库里面最新版本的区别
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
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 tracks changes of files.
撤销修改
1.没有git add
时,用git checkout -- file
,表示撤销file在工作区的所有修改,此时file为版本库一模一样的状态
2.已经git add
时,先git reset HEAD <file>
把暂存区的修改撤销掉回退到1. ,再按1.操作,
3.已经git commit
并没有推送到远程时,用git reset --hard id
回退版本
4.推送到远程库,GG?
删除版本库中的文件
先在工作区中删除文件,再使用git rm file
删除版本库中的文件,并使用git commit
提交修改
恢复误删文件
此时只能返回版本库中的文件,即最近的修改会丢失
$ git checkout -- test.txt
远程仓库(以GitHub为例)
创建并连接SSH Key
第1步:在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“Add Key”,你就应该看到已经添加的Key:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
连接远程仓库
在GitHub上创建好一个仓库后,在本地上连接远程仓库
$ git remote add origin git@github.com:michaelliao/learngit.git
请千万注意,把上面的michaelliao
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
第一次将本地推送到远程库
把当前分支master推送到远程。
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
由于远程库是空的,我们第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
这样我们就可以发现远程库和本地库同步了
第二次以后推送
后面进行推送的时候就不需要-u
这个参数了。
$ git push origin master
把本地master
分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
SSH警告
当你第一次使用Git的clone
或者push
命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes
回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes
前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
查看远程库
git remote -v
查看远程库信息:
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)
删除远程库
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
命令。使用前,建议先用git remote -v
查看远程库信息,比如删除origin
:
$ git remote rm origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
一些常见问题
推送的时候需要输入密码
$ git push -u origin main
fatal: 发送请求时出错。
fatal: 无法连接到远程服务器
fatal: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 140.82.113.3:443
这个问题怎么解决啊,我配置了github的hosts也能正常登录,但是就是没法推送远程库
解答
2021年8月开始改成只能由token登录了。ssh配置没用。
参考这篇博客吧:
以下是chatgpt的回答:
这个错误提示是因为在2021年8月13日,GitHub停止支持使用密码进行身份验证,这是为了提高安全性。相反,您需要使用访问令牌(access token)或SSH密钥进行身份验证。
要解决此问题,您可以按照以下步骤:
-
在GitHub上创建一个访问令牌。您可以在GitHub的设置页面中创建令牌。在页面的左侧菜单中选择“Developer Settings”,然后选择“Personal access tokens”。在此页面上,选择“Generate new token”按钮,然后按照页面中的说明进行操作。请确保仅授予令牌所需的最小权限。
-
用访问令牌替换密码。在您的本地存储库中,使用以下命令将远程URL更改为使用访问令牌进行身份验证:
git remote set-url origin https://@github.com/WeC9/my_first_reposity.git
请将<access-token>
替换为您的访问令牌。
- 现在您可以尝试再次进行操作,Git应该会使用访问令牌进行身份验证,而不是使用密码。
如果您仍然遇到问题,可以尝试使用SSH密钥进行身份验证,或者查看GitHub文档以获取更多帮助。
参考
https://www.liaoxuefeng.com/wiki/896043488029600
git命令查询表:git-cheat-sheet