在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始右键菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
//每个机器都必须自报家门:你的名字和Email地址
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库(repository)
- 通过git init命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in F:/gitLearn/.git/
如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository)
- 用命令git add告诉Git,把文件添加到仓库:
$ git add readme.txt
- 用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "提交readme.txt"
[master (root-commit) 70324e1] 提交readme.txt
1 file changed, 1 insertion(+)
create mode 100644 readme.txt
- 用命令 $ cat readme.txt 查看
$ cat readme.txt
第一个提交到git的文件。
- 继续添加 文件
a.txt
,src/b.txt
,提交
//继续添加
$ git add a.txt src/b.txt
//提交
$ git commit -m "提交a.txt,src/b.txt"
[master 5c480ec] 提交a.txt,src/b.txt
2 files changed, 2 insertions(+)
create mode 100644 a.txt
create mode 100644 src/b.txt
解释:
-m后面输入的是本次提交的说明
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件
- 修改 src/b.txt 文件 ;使用命令 git status 查看 ;
在src目录下回出现 2个文件 ,.bak文件是上一次的缓存文件
$ 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: src/b.txt
Untracked files:
//没有版本记录的文件
(use "git add <file>..." to include in what will be committed)
//添加到将要提交的内容中
src/b.txt.bak
no changes added to commit (use "git add" and/or "git commit -a")
- 需要使用命令git diff这个命令文件对比
$ git diff src/b.txt
diff --git a/src/b.txt b/src/b.txt
index 19acdd8..bf06994 100644
--- a/src/b.txt
+++ b/src/b.txt
@@ -1 +1,2 @@
-b.txt
\ No newline at end of file
+b.txt
+change++
\ No newline at end of file
添加并提交
$ git add src/b.txt
$ git commit -m"修改了src/b.txt 内容为change++"
[master e5f1f31] 修改了src/b.txt 内容为change++
1 file changed, 2 insertions(+), 1 deletion(-)
小结
- 初始化一个Git仓库,使用
git init
命令。 - 添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
- 使用命令
- 要随时掌握工作区的状态,使用
git status
命令 - 如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容
版本回退
在Git中,我们用git log 或者 git show命令查看:
一大串类似f718…的是commit id
(HEAD -> master) 表示当前的 版本
- 查看日志 git log ,相同功能的还有 git show
$ git log
commit e5f1f31e6674a8bfe92e6c9c915f4f6d5d728a1c (HEAD -> master)
Author: wuyihao <592132035@qq.com>
Date: Tue Apr 21 21:12:23 2020 +0800
修改了src/b.txt 内容为change++
commit 7c0b0f1bd72820a3a4f0c2fc9b4a8bbafffdd7fb
Author: wuyihao <592132035@qq.com>
Date: Tue Apr 21 20:47:46 2020 +0800
提交 a.txt src/b.txt
commit 70324e11216ad96e14c38b039c0713099fb87d16
Author: wuyihao <592132035@qq.com>
Date: Tue Apr 21 17:07:03 2020 +0800
提交readme.txt
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数:
$ git log --pretty=oneline
e5f1f31e6674a8bfe92e6c9c915f4f6d5d728a1c (HEAD -> master) 修改了src/b.txt 内容为change++
7c0b0f1bd72820a3a4f0c2fc9b4a8bbafffdd7fb 提交 a.txt src/b.txt
70324e11216ad96e14c38b039c0713099fb87d16 提交readme.txt
- 使用命令 git reset --hard HEAD^ 返回上一版本
用HEAD表示当前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^ ,上上一个版本就是HEAD^^,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
$ git reset --hard HEAD^
HEAD is now at 7c0b0f1 提交 a.txt src/b.txt
//对于了第二个版本
如果我们想撤回怎么做?和时间一样git没有撤回的功能, 再次使用git log 已经找不到之前的了。
$ git log
commit 7c0b0f1bd72820a3a4f0c2fc9b4a8bbafffdd7fb (HEAD -> master)
Author: wuyihao <592132035@qq.com>
Date: Tue Apr 21 20:47:46 2020 +0800
提交 a.txt src/b.txt
commit 70324e11216ad96e14c38b039c0713099fb87d16
Author: wuyihao <592132035@qq.com>
Date: Tue Apr 21 17:07:03 2020 +0800
提交readme.txt
但是git有每个版本的记录的 这个记录对于的id 就是commit 那段长长的编码
可以找到 它 使用 命令git reset --hard e5f1f3(这里可以使用部分,只需和其他的记录区分即可) 如果已经关闭git bash
可以使用命令用git reflog查看命令历史,以便确定要回到未来的哪个版本。
操作一下:
$ git reflog
7c0b0f1 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
e5f1f31 HEAD@{1}: commit: 修改了src/b.txt 内容为change++
7c0b0f1 (HEAD -> master) HEAD@{2}: commit: 提交 a.txt src/b.txt
70324e1 HEAD@{3}: reset: moving to 70324
5c480ec HEAD@{4}: reset: moving to 5c480e
ba6a390 HEAD@{5}: commit: 修改src/b.txt
5c480ec HEAD@{6}: commit: 提交a.txt,src/b.txt
70324e1 HEAD@{7}: commit (initial): 提交readme.txt
$ git reset --hard e5f1f3
HEAD is now at e5f1f31 修改了src/b.txt 内容为change++
$ git log --pretty=oneline
e5f1f31e6674a8bfe92e6c9c915f4f6d5d728a1c (HEAD -> master) 修改了src/b.txt 内容为change++
7c0b0f1bd72820a3a4f0c2fc9b4a8bbafffdd7fb 提交 a.txt src/b.txt
70324e11216ad96e14c38b039c0713099fb87d16 提交readme.txt
小结:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
git删除文件夹/文件(不删除本地文件)
先声明一点,如果要同时删除本地的和github上的文件,直接删除本地的再push就行了,比较简单。这里的要求是不能删除本地的文件,而要删除github里,就是网页上的文件。
其实质就是删除缓冲区里的文件,再提交给服务器端。
-
首先进入要删除的文件夹或文件的根目录下,如F:\myprojects\supermarketmanager111
-
执行下面的语句”some-directory”是相对于本地根目录下的文件夹/文件路径
$ git rm -r --cached some-directory
$ git commit -m 'Remove the now ignored directory "some-directory"'
$ git push origin master
版本库(Repository)
工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
1.第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
2.第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
管理修改
首先这里的修改包括:文件和及其内容的增删改。
在a.txt 后面添加一行 : Git tracks changes.
//先添加
$ git add a.txt
//再查看
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
再修改Git tracks changes of files. 然后git commit提交
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: a.txt
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: a.txt
回忆一下修改过程:
第一次修改 -> git add
-> 第二次修改 -> git commit
结果
只提交 add 进入 stage的那个版本
你可以发现,Git会告诉你,git checkout – file可以丢弃工作区的修改:
!!!注意!!!
1.一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
$ git checkout -- a.txt
//git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。
Git同样告诉我们,用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区:
$ git reset HEAD a.txt
Unstaged changes after reset:
M readme.txt
再丢弃已经 修改的部分
$ git checkout -- a.txt
$ git status
On branch master
nothing to commit, working tree clean
删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了
$ rm readme.txt
$ 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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择:
- 一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
$ git rm readme.txt
rm 'readme.txt'
$ git commit -m "删除readme.txt"
[master b09dade] 删除readme.txt
1 file changed, 1 deletion(-)
delete mode 100644 readme.txt
$ git log --pretty=oneline
b09dade6b6dee32abb876cc8459f1ddebc0b614e (HEAD -> master) 删除readme.txt
e5f1f31e6674a8bfe92e6c9c915f4f6d5d728a1c 修改了src/b.txt 内容为change++
7c0b0f1bd72820a3a4f0c2fc9b4a8bbafffdd7fb 提交 a.txt src/b.txt
70324e11216ad96e14c38b039c0713099fb87d16 提交readme.txt
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
这里先恢复到删前版本 再操作
$ rm readme.txt
$ 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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- readme.txt
//成功,注意:
//-- 后面的空格不能漏