一、创建版本库
https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576
首先,选择一个合适的地方,创建一个空目录
$ mkdir learngit
$ cd learngit
如果不知道自己当前目录,使用pwd命令,pwd命令用于显示当前目录
第二步,通过git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in C:/Users/me/learngit/.git/
当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见
$ ls -ah
./ ../ .git/
把文件添加到版本库
首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
强烈建议使用标准的UTF-8编码
首先在learngit目录下,创建一个readme.txt文件
然后把文件放入git仓库
把文件添加到仓库(这步可以添加多个文件,到下面提交的时候可以一起提交)
git add readme.txt
把文件提交到仓库
$ git commit readme.txt -m"add a txt file"
[master (root-commit) 870702a] add a txt file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
加上-m是对本次提交的解释说明
总结:
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
使用命令git add ,注意,可反复多次使用,添加多个文件;
使用命令git commit -m ,完成。
二、版本回退,修改回退,删除文件
如果我们对文件进行了错误修改,怎么回到历史版本呢
那我们先把刚才的readme文件改一下内容,通过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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在可以看到文件被修改了,与仓库里面的版本不一致了
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index d8036c1..7c6c723 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,4 @@
Git is a version control system.
-Git is free software.
\ No newline at end of file
+Git is free software.
+This is mine.
+Git is free software2.
\ No newline at end of file
通过git diff可以看到我改了啥,+就是新增的,-就是删掉的
下面为了给版本回退创造条件,我把我随便改的这个先提交了
值得提醒的是,实际使用中,我们可能会忘了前几天提交过文件,所以我们提交的步骤应该为
git add 文件名
git status
git commit -m“”
git status
看下目前的状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
嗯!没有其他我不想提交的文件,我可以commit了
$ git commit -m "modify readme add new lines"
[master c546e91] modify readme add new lines
1 file changed, 3 insertions(+), 1 deletion(-)
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
版本回退
通过git log命令我们可以查看文件的提交日志
如果更改比较多,需要更清晰,则可以使用git log --pretty=oneline
$ git log --pretty=oneline
d542df742bf4a5bc2e613aaf75795c0d7fee2879 (HEAD -> master) add dis
c546e91e260f81afe5590e259656f5986c5c1962 modify readme add new lines
870702a99f4ddaf1a9b56a036720f04705bb820a add a txt file
前面字符串是commit id,也就是版本号
为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了
下面我们进行版本回退
回退到上一版命令git reset --hard HEAD^
注:用HEAD表示当前版本,
则上一版本为HEAD^
上上版本为HEAD^^
再往前例如100个版本为HEAD~100
$ git reset --hard HEAD^
HEAD is now at c546e91 modify readme add new lines
现在我们看下是不是真的回退到上一个版本了
$ cat readme.txt
Git is a version control system.
Git is free software.
This is mine.
Git is free software2.
嗯!我刚才加的distributed已经被回退了
如果我想再找回刚才的版本
可以输入git reset --hard 加上commitid,如下,我的版本已经找回来了
注意,这里的版本号没必要和我一样写全,只要写前几位,让git能找到即可,当然写全是最保险的,不会出现找出来多个的情况
$ git reset --hard d542df742bf4a5bc2e613aaf75795c0d7fee2879
HEAD is now at d542df7 add dis
可以看下文件内容,distributed已经被找回
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
This is mine.
Git is free software2.
如何找到commitId?
git reflog可以记录你的每一次命令,只要你曾经输入过git log,就可以找到对应的commitId
$ git reflog
d542df7 (HEAD -> master) HEAD@{0}: reset: moving to d542df742bf4a5bc2e613aaf75795c0d7fee2879
c546e91 HEAD@{1}: reset: moving to HEAD^
d542df7 (HEAD -> master) HEAD@{2}: commit: add dis
c546e91 HEAD@{3}: commit: modify readme add new lines
870702a HEAD@{4}: commit (initial): add a txt file
总结
版本之前回退 git reset --hard commit_id
回退到上一版本git reset --hard HEAD^
查看命令历史 git reflog
工作区&暂缓区
- git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git
commit就可以一次性把暂存区的所有修改提交到分支。 - git管理的是修改而不是文件,如果没有通过git add将修改放到暂缓区,那么即使执行了git commit,修改也不会生效
撤销修改
这个部分是帮助我们写错代码时,能够去掉错误修
当然错误也有一些阶段
阶段一、只是在本地写错,还未提交到暂缓区
阶段二、写错了并且提交到了暂缓区,但是没有commit到仓库
阶段三、已经提交到了git仓库,但是还没有提交到远程版本库
阶段四、已经提交到了远程版本库
- 如果处于阶段一
我们可以手动删除写错的代码,但是有可能你改了很多地方,忘记了改了哪里,此时git checkout – file可以丢弃工作区的修改
举个例子
这里我加了一行新的代码进来,但是这个是我不想添加的内容,假设我改了很多地方,忘记了具体在哪里,我们先用git status filename看下文件状态
$ git status readme.txt
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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看到修改还没提交到暂缓区,提示我们可以使用git checkout – …丢弃修改
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销
$ cat readme.txt
Git is a distributed version control system.
Git is free software.
This is mine.
Git is free software2.
可以看到我的工作区回到了修改前状态
- 如果处于阶段二
我们通过git status查看下现在文件的状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
提示使用*git reset HEAD …*可以把暂存区的修改撤销,重新放回工作区
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
现在查一下状态
$ git status readme.txt
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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
可以看到目前修改只存在于工作区,暂缓区已经没有修改
此时如果想清掉工作区的修改请看阶段一
- 阶段三
到了这个阶段,你需要看下版本回退,回退到上一版本喽~往上滑有版本回退详解^ ^ - 阶段四
如果你已经推到远端了,那么。。。。手动改吧,要是忘了改了哪里,请参加祭天仪式
总结:
阶段一:丢弃工作区的修改,用命令git checkout – file
阶段二:修改添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,第二步用命令git checkout – file。
阶段三:参考版本回退一节
阶段四:千万别到这个阶段哦
删除文件
看下我工作区有哪些文件
$ ls
readme.txt test.txt
如果我想删除test文件,rm test.txt可以删掉工作区的文件,现在查看下状态
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: test.txt
由于仓库中还存着test文件,所以git会提示我们可以完全删除该文件,或者恢复该文件
删除使用git rm filename…,然后commit修改即可完全删除此文件。
到此已经基本入门,如有需要请继续看进阶版本~