常用命令 在git窗口可以使用

ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all)

mkdir 创建目录

cd 切换目录

touch 创建空文件

echo 创建带有内容的文件。

cat 查看文件内容

vim 编辑文件内容

cp 拷贝

mv 移动或重命名

rm 删除文件

-r 递归删除,可删除子目录及文件

-f 强制删除

find 在文件系统中搜索某文件

rmdir 删除空目录

pwd 显示当前目录

终端常用快捷键

1、历史命令信息:上下键

2、清屏命令:ctrl + l | clear

3、中断取消命令执行过程 : ctrl + c

4、快速移动光标到行首尾:ctrl + a/e

5、将光标到行首信息剪切:ctrl + u

6、将剪切的内容进行粘贴:ctrl + y

7、将光标到行尾信息剪切:ctrl + k

8、锁定系统窗口信息状态:ctrl + s

9、解锁系统窗口信息状态:ctrl + q

10、命令行中快速移动光标:ctrl + 方向键

11、系统命令信息补全功能:tab

12、复制:ctrl + insert 或 ctrl + shift + c 或 鼠标选中

13、粘贴:shift + insert 或 ctrl + shift + v 或 鼠标滚轮(三指点击)


在桌面或者一个文件夹下右键选择Git Bash Here

配置用户名和邮箱

  1. 当安装Git后首先要做的是设置用户名和邮箱地址,这是非常重要的,因为每次Git提交都会使用该信息,它被永远的嵌入到你的提交中。(不需要真实邮箱)
  2. 远程仓库里需要记录这些提交记录是由谁来完成的;所以我们需要给本地的git设置用户名和邮箱,用于从本地仓库向远程仓库提交记录时,在远程仓库记录下这些操作是由谁来完成的。
  3. 只需要做一次这样的设置,因为你传递了–global选项,Git将总是使用该信息来处理你系统中所做的一切操作。会被写入到 C:/Users/用户名文件夹/.gitconfig 文件中。但如果你希望在不同的项目中使用不同的用户名和邮箱地址,你可以在该项目中运行上面命令时不加–global选项。总之–global为全局配置,不加为某个特定项目的配置。
#配置用户名
git config --global user.name "xiaoluobei"

#配置邮箱
git config --global user.email  123@qq.com

#查看系统的config
git config --system --list

#查看当前用户(global)配置
git config --global --list

#查看指定的全局配置项 
git config user.name

(这里之前配置过 只写了设置邮箱 和查看命令)


git工作流程

Git本地有三个工作区域:工作目录(Working Directory),暂存区(Stage/Index),资源库(Repository或Git Directory)。如果再加上远程的git仓库(Remove Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是平时存放项目代码的地方
  • Index/Stage:暂存区,用于临时存放你的改动,事实上它是一个文件,保存即将提交的列表信息
  • local Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里有你提交到所有版本的数据,其中HEAD指向最新放入仓库的版本
  • Remote Repository:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

git的工作流程一般是这样的:

  1. 在工作中添加,修改文件
  2. 将需要进行的版本管理的文件放入暂存区域
  3. 将暂存区域文件提交到本地仓库因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)


创建本地仓库

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

创建全新的仓库

1.新建一个文件夹

2.进入文件夹右键git bash here

3.通过git init 命令把这个目录变成Git可以管理的仓库:

瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。(这个目录默认是隐藏的)

4. 编码(程序员的日常工作)

在这个目录下(此例中git01目录下)正常做开发:创建文件,修改文件内容.... 例如: 添加 hello.txt,并写入一些内容(任意内容均可)

克隆远程仓库

另一种方式是克隆远程仓库,是将远程服务器上的仓库完全镜像一份至本地

  1. 在你想要保存到的目录下git bash here打开命令窗口 输入git clone 链接地址
  2. 以gitee为例,进入gitee官网注册登录后,在里面随便找一个开源项目点进去会有克隆/下载,复制HTTPS下面的链接粘贴到命令的链接地址

(ps:也成功克隆了 但是出现了警告 搜了一些资料后说是缺少了安全认证,所以解决方法是重启安全认证。输入这条命令git config --global http.sslVerify true 执行后确实没有再警告,

可以在目录下看到多出一个文件夹


 远程仓库

基本介绍

  1. 什么是远端仓库

远端(远程)仓库其实就是远程的git服务器,帮我们存储代码的服务器。

本地git存储:一旦你电脑丢了或者硬盘损坏,直接扑街

远程git存储:如果你电脑坏了换了一个新的,只需要从网上重新下载即可

  1. 常见的远程仓库有哪些?

(1)github:免费。国外服务器,访问不稳定 。"全球最大的同性交友网站"学习时候可以用,工作中有的小公司为了省钱也会用

(2)码云:免费。国内服务器。

(3)gitlab

(4)私服:公司自己机房的服务器(工作中遇到)

以上远程仓库使用流程几乎一致。

  1. 远程仓库的作用: 多人协作
  2. 远程仓库的使用流程
  • leader(仓库的创建者,有最高的权限)
  • 登录远程仓库,建立空项目; 给成员添加权限
  • 成员
  • 登录远程仓库
  • 把代码拉到本地
  • 本地编辑,保存,提交代码
  • 同步到远程

远程仓库SSH配置

两种访问方式

远程仓库有两种访问方式,分别是HTTPS与SSH

HTTPS:零配置;但是每次访问仓库时,需要重复输入的账号和密码才能访问成功(现在不需要了)

SSH:需要进行额外的配置;但是配置成功后,每次访问仓库时,不需重复输入账号和密码。公司中也实际开发推荐使用SSH方式访问远程仓库

SSH 介绍

加密通讯协议 SSH key 的作用:实现本地仓库和 Github 之间免登录的加密数据传输。 SSH key 的好处:免登录身份认证、数据加密传输。 SSH key 由两部分组成,分别是:

id_rsa(私钥文件,存放于客户端的电脑中即可)

id_rsa.pub(公钥文件,需要配置到远端服务器 中)

SSH配置流程

打开 Git Bash在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,

输入命令:ssh-keygen -t rsa -C '邮箱'

这里的邮箱要与 全局配置 (git config --global user.email) 以及 码云上的登记邮箱一致

连续敲击 3 次回车,即可在 C:\Users\用户名文件夹.ssh 目录中生成 id_rsa 和 id_rsa.pub 两个文件

使用记事本打开 id_rsa.pub 文件,复制里面的文本内容

在你的远程仓库网址, 点击头像 -> 设置 -> SSH 公钥 -> 粘贴

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.

这个警告只会出现一次,后面的操作就不会有任何警告了。

新建远程仓库

(初始化按需选择 可以不选)

克隆远程仓库

git clone 仓库网址

将整个远程仓库克隆到本地

  • 这个命名相当于拉取所有的代码(将整个远程仓库文件夹copy到你的本地)
  • 这个命令一般只会在项目开始的时候执行一次

它会在本地创建目录。

仓库网址可以复制https地址也可以是ssh地址但ssh协议速度最快。

关联远程仓库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在远程创建一个Git仓库,并且让这两个仓库进行远程同步,这样,远程上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

git remote add origin 远程仓库地址 关联远程仓库

远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

下一步,就可以把本地库的所有内容推送到远程库上:

PS:这里报错了 以下为原因和解决方案

提示:更新被拒绝,因为远程包含您所做的工作
提示:不要在本地使用。这通常是由另一个存储库推送引起的
提示:对于相同的ref。您可能需要首先集成远程更改
提示:(例如,“git pull…”)然后再次按下。
提示:有关详细信息,请参阅“git推送-帮助”中的“关于快进的说明”

首先它的出现是因为在你上传的时候,远程仓库中有着本地仓库没有的文件造成的,我们首先想到的就是,既然没有那就把它拉取下来我不就有了吗?
试试,当我们pull命令输完,以为结束了,没想到它又报错了,refusing to merge unrelated histories(拒绝合并不相关的历史)。

这时我们需要在pull命名后加入一行参数就可以解决了。--allow-unrelated-histories (该选项可以合并两个独立启动仓库的历史)

我们再次对它产生的原因分析一波发现,首先它的出现是因为在你上传的时候,远程仓库中有着本地仓库没有的文件,及导致本地仓库和远程有不同的开始点,也就是两个仓库没有共同的 commit 出现的无法提交。

推送完毕后可以在远程库看到新添了本地仓库的hello.txt文件

文件操作

文件的状态

版本控制就是对文件的版本控制,要对文件进行修改,提交等操作,首先要知道文件当前什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上

三种状态

1、Untracked files

即未跟踪的状态,这是文件的初始状态,也就是在工作区中的状态,就是说git不知道你这个文件的信息,没有生成快照

2、Changes to be committed

即文件在暂存区中生成了快照等待被提交(commit)

3、Changes not staged for commit

即文件生成过快照,但是又有了新的修改,并且没有生成新的快照

文件状态转换

1)Untracked files --> Changes to be committed

使用:git add 文件名 或者 git add .

含义:将工作区的某个文件、某些文件、或者是所有文件,所作出的修改(新建、删除也算的),添加至暂存区,此时文件就可以被git commit了。

2)Changes to be committed --> Untracked files

使用:git rm --cached 文件名

含义:将文件从暂存状态转换为未暂存状态

3)Changes to be committed --> Changes not staged for commit

使用:当某个文件已经git add过了,此时如果再进行修改,使用git status查看文件状态的时候,就处于Changes not staged for commit,意思是修改的部分没有生成快照,不能提交。

文件操作

#查看指定文件状态
git status 文件名

#查看所有文件状态
git status

#添加所有文件到暂存区
git add . 

#添加指定文件到暂存区
git add 文件名

#提交暂存区中的内容到本地仓库 -m:提交的信息
git commit -m "信息"

#查看修改内容
git diff 文件名

进入上文创建的本地仓库git01文件夹git bash here(创建有hello.txt文件来观察文件的状态)

执行 git status 查看状态

此时hello.txt文件状态为 untracked

执行git add . 命令,将文件添加到暂存区,再执行git status

此时hello.txt文件状态为 Changes to be committed

hello.txt已经放入暂存区了,等待提交,这时候再执行git commit -m ,最后再一次执行git status查看

文件已提交,工作区没有待提交文件了

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

忽略文件

  1. 有的时候, 我们某些文件/文件夹, 不想让git进行跟踪管理
  2. 这种场景下, 我们需要在.git文件夹隔壁, 创建.gitignore(固定名字)的忽略文件, 并写入忽略规则(也可以通过在git命令窗口touch .gitignore)
  3. 可以编写如下这些规则

# 井号表示注释

# 忽略某个指定文件

password.txt

# 忽略文件夹

css

# 忽略文件夹下的某个文件

css/index.js

# 忽略文件夹下某类文件

css/*.js

注意:一定是Untracked files才能被忽略,如果不是该状态,需先转换到该状态

可以看到状态里忽略了password.txt文件和css文件夹


撤销

Git在每次 git add 即将内容添加到 缓存区 时会进行一次快照,快照 就像给当时的整个目录及文件照了一张相,在任何时候通过快照就能将目录及文件恢复到发起快照点的状态。Git 是这样生成快照的,对于没有变化的文件,会生成一个引用指向原文件的位置以节省空间提高效率,对于变化了的文件则将整个文件存储。git每个版本存储的是一个快照。

1、场景:将该文件在工作区中的修改,全部撤销,返回到最近一次git commit或者git add时的状态

git checkout -- 文件名

1)如果,文件没有被git add过,即没有生成过快照,那么使用此命令就撤销到了和版本库一致的状态了

2)如果,文件被git add过后,又修改了,即曾经生成过快照,那么使用此命令撤销到之前git add后的暂存区时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

git restore 文件名 (同 git checkout -- 文件名)

撤消工作区的修改返回到最近一次add(缓存区)的版本或者最近一次commit(当前版本库)的版本

2、场景:撤销暂存区的修改,将文件重新放回工作区

git reset HEAD 文件名 (只是放回工作区)

git reset既可以用在版本回退,也可以用在撤销暂存区的修改,将文件重新放回工作区,HEAD代表此前的最新版本

接下来就可以使用1、中撤销工作区的方法,将工作区中的修改撤销了。

git restore --staged 文件名 ( 也是将暂存区的修改重新放回工作区)

3、提交到本地分支上的回退(版本回退)

不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

#查看提交记录
git log

#只会显示版本号和提交时的备注信息
git log --oneline 等价于 git log --pretty=oneline

#git reflog命令可以查看所有分支的所有操作记录信息
#(包括已经被删除的 commit 记录和 reset 的操作)。
#例如:执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,这样我们就可以买后悔药,恢复到被删除的那个版本。
git reflog 

#回退到上一个版本
git reset --hard HEAD^

#回退到指定版本
git reset --hard 版本号

git log 命令可以查看提交的历史记录

你看到的一大串类似087407a...的是commit id(版本号)

git log --pretty=oneline 可以简化显示的信息只显示版本号和提交说明

如果,修改的文件已经使用了git commit提交到了本地分支,那么可以采用版本回退,回到之前的版本

1)git reset --hard HEAD^回退到上一个版本(HEAD为当前版本、HEAD^为上一个版本、HEAD^^为上上个版本,以此类推当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100)

此时还原到了add a版本 最新的那个版本add b已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个add b的commit id是087407a...,于是就可以指定回到未来的某个版本:

git reset --hard 版本号

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到add a版本时,再想恢复到add b,就必须找到add b的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:


删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

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

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:

先手动删除文件,然后使用git rm <file>和git add<file>效果是一样的。

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

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

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

使用git restore 文件名 或git checkout -- 文件名 可以撤销删除操作

注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

参考资料

https://www.liaoxuefeng.com

Git push命令报hint: Updates were rejected because the remote contains work that you do问题_二哥别秀了的博客-CSDN博客

Git的基本使用方法教程(入门级)_只昂张327的博客-CSDN博客

Git教程(快速上手,超详细)_小蓝的江湖的博客-CSDN博客


Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐