Git 的工作就是创建和保存项目的快照及与之后的快照进行对比。
本章将对有关创建与提交你的项目快照的命令作介绍。
Git 常用命令:
git clone
git push
git add
git commit
git checkout
git pull
创建仓库命令
命令 | 说明 |
---|---|
git init | 初始化仓库 |
git clone | 拷贝一份远程仓库,也就是下载一个项目 |
提交与修改
命令 | 说明 |
---|---|
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件 |
git diff | 比较文件的不同,即暂存区和工作区的差异 |
git commit | 提交暂存区到本地仓库 |
git reset | 回退版本 |
git reflog | 查看命令历史 |
git rm | 将文件从暂存区和工作区中删除 |
git mv | 移动或重命名工作区文件 |
git checkout | 分支切换 |
git switch (Git 2.23 版本引入) | 更清晰地切换分支 |
git restore (Git 2.23 版本引入) | 恢复或撤销文件的更改 |
提交日志
命令 | 说明 |
---|---|
git log | 查看历史提交记录 |
git blame <file> | 以列表形式查看指定文件的历史修改记录 |
远程操作
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
实战
git reset
命令
先用git log
查看一下已有版本
$ git log --pretty=oneline
b65a6a5df0d0e5ddf4da1cccc641927eb3224b60 (HEAD -> master) Merge branch 'dev'
3f3bdf2adbefaa2595eb77cc0aa101ce925b3c17 修改代码
6b789116122f54f78987de07b339e13f6ce4a760 changed the text.txt
405fb585eb82853f878fa3381f2decd2572f1dc8 add text.txt
f7295fbd3e0f67be6a3264e9b8e58350649ae16c (tag: v1.0) 第一次版本提交
现在,我们要把当前版本Merge branch 'dev'
回退到上一个版本修改代码
,就可以使用git reset
命令:
$ git reset --hard HEAD^
HEAD 现在位于 3f3bdf2 修改代码
看看text.txt
的内容是不是优快云@keduo感谢你的关注
:
$ cat text.txt
优快云@keduo感谢你的关注
我们发现text.txt
被还原了。
还可以继续回退到上一个版本changed the text.txt
,不过且慢,让我们用git log
再看看现在版本库的状态:
$ git log --pretty=oneline
3f3bdf2adbefaa2595eb77cc0aa101ce925b3c17 (HEAD -> master) 修改代码
405fb585eb82853f878fa3381f2decd2572f1dc8 add text.txt
f7295fbd3e0f67be6a3264e9b8e58350649ae16c (tag: v1.0) 第一次版本提交
最新的那个版本Merge branch 'dev'
已经看不到了!
如果还想再回去最新的版本,该怎么办呢?
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到那个最新版本Merge branch 'dev'
的commit id
是b65a6a5···
,于是就可以指定回到未来的某个版本:
$ git reset --hard b65a6a5
HEAD 现在位于 b65a6a5 Merge branch 'dev'
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再小心翼翼地看看text.txt
的内容:
$ cat text.txt
欢迎关注优快云@keduo
优快云@keduo感谢你的关注
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向Merge branch 'dev'
改为指向修改代码
所以你让HEAD
指向哪个版本号,你就把当前版本定位在哪个版本
那如果上面的命令行窗口已经被关掉了,但你想恢复到新版本却找不到新版本的commit id
了怎么办?
当你用$ git reset --hard HEAD^
回退到修改代码
版本时,再想恢复到Merge branch 'dev'
,就必须找到Merge branch 'dev'
的commit id
。Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
3f3bdf2 HEAD@{1}: reset: moving to HEAD^
b65a6a5 (HEAD -> master) HEAD@{2}: commit (merge): Merge branch 'dev'
3f3bdf2 HEAD@{3}: commit: 修改代码
终于舒了口气,从输出可知,Merge branch 'dev'
的commit id
是b65a6a5
,现在,你又可以回到最新版本了。
撤销修改
今年除夕夜大家都放假了,但老板点名要你留在公司值班,这使的你十分气愤,于是在text.txt
文件中抱怨了几句,在还git add
到暂存区了。一段时间后,你的气消了,打算删掉之前的抱怨。
先查看一下文件内容:
$ cat text.txt
欢迎关注优快云@keduo
优快云@keduo感谢你的关注
过年还要加班,真命苦啊!!!
用git status
查看一下,修改只是添加到了暂存区,还没有提交:
$ git status
位于分支 master
要提交的变更:
(使用 "git restore --staged <文件>..." 以取消暂存)
修改: text.txt
Git告诉我们,用命令git restore --staged <文件>
可以把暂存区的修改撤销掉,重新放回工作区:
$ git restore --staged text.txt
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: text.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
Git同样告诉我们,使用 git restore <文件>
可以丢弃工作区的改动:
$ git restore text.txt
$ git status
位于分支 master
无文件要提交,干净的工作区
我们再来查看一下文件内容:
$ cat text.txt
欢迎关注优快云@keduo
优快云@keduo感谢你的关注
文件内容恢复了,现在我们就完成了文件撤销操作。
删除文件
先添加一个新文件junk.txt
到 Git 并提交:
$ touch junk.txt
$ git add junk.txt
$ git commit -m "add junk.txt"
[master 8f43abc] add junk.txt
1 file changed, 1 insertion(+)
create mode 100644 junk.txt
在 Ubuntu 中创建文件有多种方法。
- 使用命令行创建文件
打开终端,输入以下命令来创建一个空白文件:
touch 文件名
例如,要创建一个名为
test.txt
的文件,可以输入以下命令:touch test.txt
- 使用文本编辑器创建文件
Ubuntu 自带了许多文本编辑器,例如 Gedit 和 Nano。你可以使用这些编辑器来创建和编辑文件。
例如,要使用 Gedit 创建一个新文件,可以输入以下命令:
gedit 文件名
例如,要创建一个名为
test.txt
的文件,可以输入以下命令:gedit test.txt
这将打开 Gedit 编辑器并创建一个新文件。
- 使用图形界面创建文件
如果你喜欢使用图形界面,也可以使用文件管理器(Nautilus)来创建文件。在文件管理器中,右键单击空白区域,选择“新建文档”然后选择所需的文件类型。
在文件管理器中文件删除文件junk.txt
,或者用rm
命令删除文件:
$ ls
junk.txt README text.txt
$ rm junk.txt
$ ls
README text.txt
这个时候,工作区和版本库就不一致了,使用git status
命令就可以知道文件的变动了:
$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: junk.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
此时,我们有两个选择:
-
一是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并且git commit
$ git rm junk.txt rm 'junk.txt' ubuntu@ubuntu:~/keduo$ git commit -m 'remove junk.txt' [master 813a93c] remove junk.txt 1 file changed, 1 deletion(-) delete mode 100644 junk.txt
-
另一种情况是删错了,可以使用
git checkout -- <filename>
从版本库中把误删的文件恢复到最新版本:$ git checkout -- junk.txt ubuntu@ubuntu:~/keduo$ ls junk.txt README text.txt
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
恢复文件只能恢复到最新版本,即丢失最近一次提交后修改的内容。