工作中,对于新手来说,Git 操作容易给代码的版本库带来一些不必要的混乱,所以我们就必须得在代码版本库上狠下一番功夫了,毕竟要多多人协作。
一、创建仓库
仓库,也就是 repository,可以简单理解为一个目录,这个目录里面的所有文件都将被 Git 管理起来,每个文件的任何操作,都将被 Git 记录下来,以便在任何时刻进行追踪和回滚。
新建一个文件夹,比如说 testgit,然后使用 git init
命令就可以把这个文件夹初始化为 Git 仓库了。
初始化Git 仓库成功后,可以看到多了一个 .git 的目录。
接下来,我们来新增一个文件 readme.txt,内容为“aaaaaaaaaa”,并将其提交到 Git 仓库。
第一步,使用 git add .
命令将新增文件添加到暂存区。
第二步,使用git commit –m ‘提交说明’ 命令告诉 Git,把文件提交到仓库。
可以使用 git status
来查看是否还有文件未提交。
也可以在文件中新增一行内容“bbbbbbbbb”,再使用 git status
来查看结果。
如果想查看文件到底哪里做了修改,可以使用 git diff
命令:
确认修改的内容后,可以使用 git add .
和 git commit –m ‘提交说明’
再次提交。
二、版本回滚
再次对文件进行修改,追加一行内容为:“ccccccccc”,并且提交到 Git 仓库。
现在我已经对 readme.txt 文件做了三次修改了。可以通过 git log
命令来查看历史记录:
也可以通过 gitk
这个命令来启动图形化界面来查看版本历史。
每提交一个新版本,实际上Git就会把它们自动串成一条时间线。
当前版本的上一个版本就是HEAD^,
上上一个版本就是HEAD^^,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
如果想回滚的话,比如说回滚到上一个版本,可以执行以下两种命令:
1)git reset --hard HEAD^
,上上个版本就是 git reset --hard HEAD^^
,以此类推。
2)git reset --hard HEAD~100
,如果回滚到前 100 个版本,用这个命令比上一个命令更方便。
那假如回滚错了,想恢复,不记得版本号了,可以先执行 git reflog
命令查看版本号:
然后再通过 git reset --hard
命令来恢复:
git版本回滚步骤
- 查看版本号
版本控制系统设定需要某个命令来告诉我们提交的历史记录
git log
可以查看版本的历史记录;显示从最近到最远的提交日志
如果嫌输出信息太多,可以试试加上–pretty=oneline参数
git log --pretty=oneline
看到的一大串类似f9dcadb…的是commit id(版本号)
输入 Ctrl + Z 就可以退出列表展示
.
- 版本回退到上一个版本
git reset --hard HEAD^
回退到上一个版本
在Git中,用HEAD表示当前版本,也就是最新的提交f9dcadb…
这就是按当前版本回退到上一个版本
- git回滚到指定版本
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
git reset --hard 1078f
这里的1078f表示的是版本号,commit id
.
总结
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
三、工作区和暂存区的区别
1)工作区,比如说前面提到的 testgit 目录就属于工作区,我们操作的 readme.txt 文件就放在这个里面。
2)暂存区,隐藏目录 .git 不属于工作区,它(Git 仓库)里面存了很多东西,其中最重要的就是暂存区。
Git 在提交文件的时候分两步,第一步 git add
命令是把文件添加到暂存区,第二步 git commit
才会把暂存区的所有内容提交到 Git 仓库中。
“为什么要先 add 才能 commit 呢?”
最直接的原因就是Linus 搞了这个“暂存区”的概念。那为什么要搞这个概念呢?没有暂存区不行吗?
在 Git 之前, SVN 是代码版本管理系统的集大成者。SVN 比之前的 CVS 更优秀的一点是,每次的提交可以由多个文件组成,并且这次提交是原子性的,要么全部成功,要么全部失败。
原子性带来的好处是显而易见的,这使得我们可以把项目整体还原到某个时间点。
Git 作为逼格最高的代码版本管理系统,自然要借鉴 SVN 这个优良特性的。但不同于 SVN 的是,Git 一开始搞的都是命令行,没有图形化界面,如果想要像 SVN 那样一次性选择多个文件或者不选某些文件,还真是个问题。
对于像 Linus 这种天才级选手来说,图形化界面无疑是 low 逼,可命令行在这种情况下又实在是麻烦~
这就想到一个完美的解决方案——搞个暂存区
暂存区可以随意地将各种文件的修改放进去,只需要通过 git add
这种简单的命令就可以精心地挑选要提交哪些文件了,然后再一次性(原子性)的 git commit
到版本库,所有的问题都迎刃而解嘛。
我们在 testgit 目录下再新增一个文件 readyou.txt,内容为“ffffff”;并且在 readme.txt 文件中再追加一行内容“点赞、retrgdf~”。
我们先用 git status
命令查看一下状态,再用 git add
将文件添加到暂存区,最后再用 git commit
一次性提交到 Git 仓库。
四、撤销修改
现在,我在 readyou.txt 文件中追加了一行内容:“ytuytuyt~~~”。在我想要提交的时候,突然发现追加的内容有误,我得恢复到以前的版本,该怎么办呢?
1)我知道要修改的内容,直接修改,然后 add 和 commit 覆盖。
2)我忘记要修改哪些内容了,通过 git reset -- hard HEAD
恢复到上一个版本。
还有其他办法吗?
答案当然是有了,其实在我们执行 git status
命令查看 Git 状态的时候,结果就提示我们可以使用 git restore
命令来撤销这次操作的。
那其实在 git version 2.23.0 版本之前,是可以通过 git checkout
命令来完成撤销操作的。
checkout 可以创建分支、导出分支、切换分支、从暂存区删除文件等等,一个命令有太多功能就容易让人产生混淆。2.23.0 版本改变了这种混乱局面,git switch 和 git restore 两个新的命令应运而生。
switch 专注于分支的切换,restore 专注于撤销修改。
五、远程仓库
Git 是一款分布式版本控制系统,所以同一个 Git 仓库,可以分布到不同的机器上。一开始,只有一台机器和一个原始版本库,往后去,别的机器就可以从这台机器上拷贝原始版本,就像黑客帝国里的那个特工史密斯一样,没有任何区别。
这也是 Git 比集中式版本控制系统 SVN 特别的地方之一。
我们可以自己搭建一台每天 24 小时可以运转的 Git 服务器,然后其他人就从这台“服务器”中拷贝就行了。不过,因为 GitHub 的存在,自主搭建 Git 服务器这个步骤就可以省了。
从名字上就可以看得出来,GitHub 是用来提供 Git 仓库托管服务的,我们只需要注册一个 GitHub 账号,就可以免费获取一台每天可以运转 24 小时的 Git 远程服务器。
那其实在 GitHub 上有对应的中文帮助文档,来介绍如何通过 SSH 协议将本机和 GitHub 链接起来,从而不必在每次访问时提供用户名和密码。
https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/about-ssh
第一步,通过 ls -al ~/.ssh
命令检查 SSH 密钥是否存在
如果没有 id_rsa.pub、id_ecdsa.pub、id_ed25519.pub 这 3 个文件,表示密钥不存在。
第二步,生成新 SSH 密钥
执行以下命令,注意替换成你的邮箱:
ssh-keygen -t ed25519 -C "your_email@example.com
然后一路回车:
记得复制一下密钥,在 id_ed25519.pub 文件中:
第三步,添加 SSH 密钥到 GitHub 帐户
在个人账户的 settings 菜单下找到 SSH and GPG keys,将刚刚复制的密钥添加到 key 这一栏中,点击「add SSH key」提交。
Title 可不填写,提交成功后会列出对应的密钥:
为什么 GitHub 需要 SSH 密钥呢?
因为 GitHub 需要确认是“你本人”在往你自己的远程仓库上提交版本的,而不是别人冒充的。
第四步,在 GitHub 上创建个人仓库
点击新建仓库,填写仓库名称等信息:
第五步,把本地仓库同步到 GitHub
复制远程仓库的地址:
在本地仓库中执行 git remote add
命令将 GitHub 仓库添加到本地:
当我们第一次使用Git 的 push 命令连接 GitHub 时,会得到一个警告⚠️:
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
这是因为需要你手动确认,输入 yes 即可。
接下来,我们使用 git push
命令将当前本地分支推送到 GitHub。加上了 -u 参数后,Git 不但会把本地的 master 分支推送的远程 master 分支上,还会把本地的 master 分支和远程的master 分支关联起来,在以后的推送或者拉取时就可以简化命令(比如说 git push github master
)。
此时,我们刷一下 GitHub,可以看到多了一个 master 分支,并且本地的两个文件都推送成功了!
从现在开始,只要本地做了修改,就可以通过 git push
命令推送到 GitHub 远程仓库了。
还可以使用 git clone
命令将远程仓库拷贝到本地。比如说我现在有一个 3.4k star 的仓库 JavaBooks,
然后我使用 git clone
命令将其拷贝到本地。
git常使用的命令
1、git init —在当前目录新建一个代码库。
2、 git config user.name=””git config user.email=””—设置代码提交时候的信息。
3、 git clone 需要clone 远程地址 ––从服务器端克隆项目到本地
4、 git status —查看文件修改状态。
5、 git diff 文件路径 ––查看该文件与上次提交修改代码的差别。
6、 git diff –-cached 文件路径 ––查看本地缓冲和上次提交的差别。
7、 git checkout –b 分支名称 ––新建一个临时分支。
8、 git checkout 分支名称 ––切换分支。
9、 git branch —查看所有的分支。
10、 git branch –D temp —强制删除一个分支
11、 git pull —将服务端代码更新到本地。
12、 git add 文件路径 —提交文件到暂冲区。
13、 git add –A —提交所有的需要add 的文件到缓冲区。
14、 git commit –m ‘提交说明’—将缓冲区的文件提交到本地库中。提交说明尽量将提交内容简单明了的表达清楚。
15、 git push origin master —将已经提交到本地的仓库的代码push到远程服务器。
16、 git log —显示提交的日志。
17、 git show [commit 的Id] — 显示某次提交的元数据和内容变化。
18、 git show [commit Id] –-stat —-显示提交的文件名称
19、 git checkout —恢复暂存区的所有文件。
20、 git reset [file/commit ID] – 重置暂存区的指定文件。用来撤销git commit
21、 git reset –hard [commit 的Id] —将本地版本退回到提交之前的版本。这个操作会将自己新写的代码全部撤销没了。
22、 git cherry-pick temp —-合并临时分支到当前分支。
23、 git commit –amend —修改最近一次提交说明的内容同时可以合并提交。对已经Push 的无效。
24、git rm <删除的本地仓库中文件路径(前提已经提交到远程仓库)> git commit -m “delete file” 分两步执行,可以删除远程仓库对应的文件
git提交步骤
首先你先通过git init git clone 基本环境准备好后,你写完自己的代码想要提交到远程服务器。
git status 查看改动的文件有哪些
分别git diff 改动文件路径 看看有没有空格之类。检查格式,改动具体代码
确认无误后 git add 需要提交的文件路径 也可以加入改动的都是需要提交可以git add .
git pull
git commit -m “提交备注” 切记commit 之前 先git pull
git push origin master
提交完成