ArkShen 2020-07-05
首先安装 git ,安装过程很简单,省略。
安装完git之后需要配置git
$ git config --global user.name "Your Name" $ git config --global user.email ""
切换到你想要当作仓库的目录使用命令:
git init
如图所示,git分为工作区和版本仓库两个部分
其中版本仓库里边包含暂存区(stage)和【主】分支(master)
当我们编辑好一个文件想要将它加入到版本控制/版本仓库中去,第一步是要将文件提交到版本仓库的暂存区(stage),使用命令 git add <filename>
·:
$ git add file.txt
如果想把当前目录下的所有文件和文件夹都添加到暂存区
$ git add .
tips:.
表示当前目录
一般情况下,我们将文件提交到暂存区之后,接下来的一步就是将文件提交至仓库分支上,这样才能达到版本控制的目的。使用命令git commit -m "some commit messages"
$ git commit -m "first commit message"
查看详细提交记录使用命令:
$ git log # 我们会看到像这样的输出 commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: 。。。作者信息 Date: Fri May 18 21:06:15 2018 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366 Author: 。。。作者信息 Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: 。。。作者信息 Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
有些场景下需要过滤掉一些不需要的信息,可以添加一些参数:
$ git log --pretty=oneline $ git log --oneline # 这两句都是可以的 上面一句显示的commit id更长 更全一点
什么是 commit id?
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: 。。。作者信息 Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
如上所示,这是git log 的其中一条 commit eaadf4e...
commit 后边跟的这一串就是 commit id,注意commit 是很重要的一个东西 接下来我们还会用到这个。
如果我们忘记了我们提交的状态,可以使用命令:
$ 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: afile no changes added to commit (use "git add" and/or "git commit -a")
可以看到,git 为我们提供了友好的提示 git checkout -- <file>
可以丢弃工作区的修改。
$ git checkout -- afile
上边命令的意思就是 把 afile
文件在工作区的修改全部撤销掉.
第二种情况,我们已经把文件放到暂存区了,但还没有commit提交到分支上, 同样的我们先查看仓库状态:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: afile
可以看到 git 给我们的提示,使用git reset HEAD <file>
可以将暂存区的修改撤销掉(unstage), 重新放回到工作区:
$ git reset HEAD afile Unstaged changes after reset: M afile
当我们用HEAD
时,表示最新的版本。
当我们再用 git status
查看发现暂存区试干净的,工作区有修改:
$ 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: afile
这样我们就又回到了第一种情况,使用同样的操作git checkout -- file
可以丢弃工作区修改。
首先 我们需要回忆一下两个知识点:
使用 git log 可以查看提交日志,每一条提交日志里边都包含 commit id 即版本号。
还拿我们之前的例子来说,假设,我们查看 git 日志是下面的情况:
$ git log commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: 。。。作者信息 Date: Fri May 18 21:06:15 2018 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366 Author: 。。。作者信息 Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: 。。。作者信息 Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
可以看到,apend GPL 即有(HEAD -> master)
标注的提交版本是最新版本(当前版本),现在我们有某些需求,想要回退到 上一个版本即add distributed 版本。
我们只需要使用命令:
$ git reset --hard HEAD^
上边我们说到 HEAD
版本是最新版本, 那我们要回退一个版本可以使用 HEAD^
做标记,回退两个也就是上上一个版本可以使用HEAD^^
,那假如说要回退50个或者 100甚至更多版本写100个^
也不太好数,所以git 就为我们提供了另外一种方式(波浪号后边跟数字)即HEAD~100
运行完上边的命令,我们又后悔了怎么办?
查看一下日志:
$ git log commit e475afc93c209a690c39c13a46716e8fa000c366 (HEAD -> master) Author: 。。。作者信息 Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: 。。。作者信息 Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
回退真的成功了,我们后悔了,怎么回去,git 还是有给我们留了后悔药的。
我们上边提到的第二个概念 commit id 可以帮助我们回到未来时刻。
如果没有关掉命令窗口,网上翻旧可以找到append GPL
的commit id是1094adb...
,它就是我们回到未来的钥匙。
$ git reset --hard 1094ad HEAD is now at 83b0afe append GPL
看提示,我们已经回来了。可以使用 git log
自己验证一下。
同样的 commit id 可以用来回退版本。
总结一下:三种方式
git reset --hard HEAD^ # 回退两个版本可以使用 HEAD^^ git reset --hard HEAD~13 # 13 是你想回退13个版本 git reset --hard 1094ad # 1094ad 表示某一次提交的 commit 前几位
需要解释一下两个点:
--hard
参数是什么意思,这里我们学习期间先直接用就行了,后边会说到。
版本号commit id 当我们使用的时候不需要给完整的 commit id,因为 git 很聪明的会帮我们区匹配。一般情况下 会取版本号前几位,注意不能取1-2位这种的,相似性太高了,git会无法确定是那个版本。
在开发过程中,避免不了删除文件,通常我们会通过文件管理器,或者rm命令删除文件
这里准备一个文件 gitrm.txt 并将它提交到了代码仓库
$ git add gitrm.txt $ git commit -m "add gitrm.txt" [master b84166e] add gitrm.txt 1 file changed, 1 insertion(+) create mode 100644 gitrm.txt
现在将它删除掉
$ rm gitrm.txt
此时,工作区和版本库已经不一致了,git会知道你删除了一个文件 git status
查看一下
$ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: gitrm.txt no changes added to commit (use "git add" and/or "git commit -a")
正如上边 git 给我们的提示一样,我们现在有两个选择:
git rm <file>
然后commit 删除掉仓库里边的文件。git checkout -- <file>
可以将版本库中的文件放到工作区注意:git checkout
使用版本库中的版本替换工作区版本,所以无论工作区是修改还是删除都会被替换掉。另外没有被添加到过版本库的文件是没办法恢复的。