缘起
为什么博主会写这样一篇博客呢?因为博主今天把一个git仓库给搞坏了,需要回退一下仓库。但是博主由于长期依赖vscode的图形化工具,导致除了git init
命令之外几乎不会别的git命令了…所以博主就写了这篇博客复习一下。如有不妥之处,还清大佬斧正。
这篇博客参考了廖雪峰的git教程。
git的安装
git安装
没啥好说的,在Linux上一行命令就装上了,网上教程一抓一大把。
安装以后需要配置用户名
和邮箱
。
git config --global user.name "name"
git config --global user.email "email"
# name改为自己的名字,email改为自己的邮箱地址
创建git仓库
创建git仓库
只需要cd
进入一个目录(最好是空目录),然后git init
即可。(这是博主用的最熟的命令了…)
例如,我们要在learngit目录下创建一个空的git仓库,只需要这样:
mkdir learngit
cd learngit
git init
创建git仓库后当前目录下会多一个名叫.git
的目录,git仓库的所有内容都在这个目录下。
在git仓库中添加文件
首先我们在learngit
仓库下创建一个readme.txt
。readme.txt里就写个Hello World!
吧。
然后git status
一下,输出了个这:
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
readme.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
运行结果显示我们新增了一个readme.txt文件但是还没有提交,并且提示我们用git add
来把文件添加到仓库。
然后键入命令git add readme.txt
,再次键入git status
,又输出了一个这:
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: readme.txt
git add
将文件放在了暂存区,我们还需要用git commit -m "message"
提交。message
是我们对此次提交的说明,但是博主比较阑,每次只写update
…建议大家还是好好写这个"message",比如添加了什么功能,修复了什么bug等等。
NOTE:git commit
将暂存区所有的文件都提交,所以可以多次git add
然后git commit
一口气提交所有的更改。
git diff
现在我们修改一下readme.txt,在Hello World!
后添加一行Hello Git!
,然后键入git diff
,回车,输出为:
diff --git a/readme.txt b/readme.txt
index 980a0d5..f7fad3a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,3 @@
Hello World!
+Hello Git!
git diff
显示了我们对readme.txt的修改。需要注意的是,如果我们git add
后就不能查看readme.txt的修改了。
git log
git log
可以查看我们的修改:
commit a30c0c0e9a8c93036974131e3a49a6debbcc0a94 (HEAD -> master)
Author: name <email>
Date: Sat Mar 27 20:02:52 2021 +0800
modify readme.txt
commit fd8fe24704ed00d966e2bdf6e7247e3a75fdb15e
Author: name <email>
Date: Sat Mar 27 19:48:43 2021 +0800
add readme.txt
输出内容有提交时间,作者,邮箱,提交时写的message等,如果我们把message都写成update,那恐怕要眼花缭乱了吧。
我们还可以在git log
后加上--pretty=oneline
这样可以简短地显示提交日志。
版本回退
在git log输出的第二次commit中,有一个(HEAD -> master),说明git仓库的当前版本就是第二次提交对应的版本。那如果我们要回到第一次提交后的状态怎么办呢。在git中,回退到上一个的命令是git reset --hard HEAD^
。回退到上一次的上一次是git reset --hard HEAD^^
。那如果回退100次呢?总不能写100个^
吧。如果将仓库回退100次,可以简写为git reset --hard HEAD~100
。
人是一种喜欢后悔的动物。如果我回退之后后悔了怎么办呢?git回到未来版本的命令是git reset --hard
+ commit版本号的一部分
。从git log的输出可以看到,每个commit都对应了一个长长的hash值,这就是这次提交的id。我们想要切换到某个版本,可以用git reset --hard
指定commit id
。当然我们不可能(主要是懒)把这么长的hash都写出来,所以我们只需要写几位让git能确定是哪个版本就行了。
如果忘记了某个版本的hash值呢(这可比电话号码难记多了)。我们只需要运行git reflog
命令查看我们每一次输入的命令。这样就可以找到以前的commit id了。
撤销修改
对与工作区中的修改,我们可以用git checkout -- 文件名
来撤销修改。
当我们git add
发现修改有些不妥,那我们应该怎么撤销修改呢。如果你在git add
后在git status
,会发现git提示你如果你要撤销修改,可以使用git restore --staged <文件名>
来撤销修改。如果是新添加的文件,可以用git rm --cache <文件>
来撤销。当然,我们还可以用git reset HEAD <文件>
来将暂存区的修改回退到工作区。
在git仓库中删除文件
当我们用rm
命令删除一个文件时,运行git status
命令就可以看到git发现我们在git仓库中删除了文件。如果我们确实要删掉这个文件,就用git em <文件>
和git commit
来删除。如果我们删错了,就可以用git checkout <文件>
来还原误删的文件。
远程仓库
我们可以把我们的本地仓库与远程仓库相关联,然后推送到远程仓库。这样就不用担心自己电脑的硬盘哪天挂掉了。
关于github的注册、ssh的设置以及如何在github上创建远程仓库详见廖雪峰的git教程以及网上的其他教程。
关联远程仓库
假设我们已经在github上创建了一个远程仓库learngit
。现在我们需要将本地的learngit仓库与github上的远程仓库相关联。要关联远程仓库,我们只需要键入以下命令:
git remote add git@github:name/learngit.git
然后我们就可以向远程仓库推送代码了。
第一次向远程仓库推送需要输入命令git push -u origin master
,以后推送就不需要-u
参数了。
如果我们想要取消本地仓库与远程仓库的关联怎么办呢?只需要一行命令即可:git remote rm origin
克隆远程仓库
如果我们不小心将本地仓库删除了,我们可以将远程仓库克隆到本地。或者如果我们在github上看到一些好的项目想要学习一下,也可以克隆下来。
例如,如果我们想要将learngit仓库克隆下来,可以使用命令git clone git@github:name/learngit.git
。注意需要将name改为远程仓库所有者的名字。
git分支管理
创建git分支
创建git分支使用git branch
命令。比如如果我们要创建一个dev分支,只需执行命令:git branch dev
。如果我们不仅需要创建dev分支还要切换到dev分支,则需要执行命令:git checkout -b dev
。此外,还可以用git branch
来查看所有分支,其中当前分支前有一个*
。
切换分支
假如说我们在dev分支,现在想要切换到master分支应该怎么做呢?在git中,切换分支的命令是git checkout <分支>
。在新版本的git中,也可以用git switch
来切换分支。例如git switch dev
切换到dev分支。还可以用git switch -c <分支名>
来切换并创建分支。
合并分支
假设我们要将dev分支
合并到master分支
,首先我们应该先切换到master分支
,然后执行git merge dev
即可。
关于分支和标签的知识随后补充。