目录
版本控制器Git
安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,点击鼠标右键选择“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
$ mkdir learngit
$ cd learngit
$ pwd
/d/DOM_AND_BOM_CODES/Git/learngit
pwd
命令用于显示当前目录
如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
第二步,通过git init
命令把这个目录(learngit)变成Git可以管理的仓库(操作前进入到learngit这个文件夹右键选择“Git Bash”):
$ git init
Initialized empty Git repository in D:/DOM_AND_BOM_CODES/Git/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git
目录,那是因为这个目录默认是隐藏的,用ls -ah
命令就可以看见。
接下来
编写一个hello.js
文件
一定要放到learngit
目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
和把大象放到冰箱需要3步相比,把一个文件放到Git仓库只需要两步。
第一步,用命令git add
告诉Git,把文件添加到仓库:
$ git add hello.js
执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。
第二步,用命令git commit
告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
简单解释一下git commit
命令,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
疑难解答
Q:输入git add readme.txt
,得到错误:fatal: not a git repository (or any of the parent directories)
。
A:Git命令必须在Git仓库目录内执行(git init
除外),在仓库目录外执行是没有意义的。
Q:输入git add readme.txt
,得到错误fatal: pathspec 'readme.txt' did not match any files
。
A:添加某个文件时,该文件必须在当前目录下存在,用ls
或者dir
命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。
初始化一个Git仓库,使用git init
命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
时光机穿梭
$ git status
git status
命令可以让我们时刻掌握仓库当前的状态
每次在hello.js文件中的操作
console.log("hello");
console.log("第一次");
console.log("第二次");
console.log("第三次");
console.log("第四次");
第四次修改了,但是没有add 和 commit
通过git status 可以查看状态
查看仓库状态:git status
查看仓库状态(具体改变内容):git diff
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git diff
再在上面的hello.js中加一句
console.log("hello");
console.log("第一次");
console.log("第二次");
console.log("第三次");
console.log("第四次");
console.log("第五次");
然后输入git diff 可以看到
知道了对hello.js
作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add
同样没有任何输出。在执行第二步git commit
之前,我们再运行git status
看看当前仓库的状态
git status
告诉我们,将要被提交的修改包括hello.js
,下一步,就可以放心地提交了:
$ git commit -m "add distributed"
提交后,我们再用git status
命令看看仓库的当前状态:
$ git status
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
小结
-
要随时掌握工作区的状态,使用
git status
命令。 -
如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
版本回退
查看历史版本:git log
查看历史版本:git log --pretty=oneline(干净)
回到历史版本:git reset --hard HEAD^(用HEAD
表示当前版本,也就是最新的提交。 上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
)
回到历史具体版本:git reset --hard 版本号(截取一部分就行,当然也不能只写前一两位)
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD
指针
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到最新
版本的下一个版本时(关掉了电脑,第二天早上就后悔了),再想恢复到最新版本
,就必须找到最新版本
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: 第一天的最新版本
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file
现在我们可以知道 第一天的最新版本 的commit id是1094adb,
,现在,你又可以乘坐时光机回到未来了。(相对于旧版本,这次回来的版本是未来)
现在总结一下:
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
工作区和暂存区
版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
删除文件
工作区删除:rm test.js
版本库删除:
git rm test.js
git commit -m '删除文件'
找回文件:(在工作区删除,没有在版本库里删除,删错了)
git checkout -- test.js
从来没有被添加到版本库就被删除的文件,是无法恢复的!
命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删(找回来=> git log => git reset --hard 274a25f15e 就可以发现test.js 文件 回来了!!! ),但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
Git分支管理
- 创建与并切换分支:git checkout -b <name>
- 查看分支:git branch
- 创建分支:git branch <name>
- 切换分支:git checkout <name>
- 合并某分支到当前分支:git merge <name>
- 删除分支:git branch -d <name>
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git checkout -b wzmlearngit
Switched to a new branch 'wzmlearngit'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)
$ git branch
master
* wzmlearngit
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)
$ git add hello.js
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)
$ git commit -m '子分支'
[wzmlearngit 786c55f] 子分支
1 file changed, 1 insertion(+)
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)
$ git checkout master
Switched to branch 'master'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git checkout wzmlearngit
Switched to branch 'wzmlearngit'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)
$ git checkout master
Switched to branch 'master'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git merge wzmlearngit
Updating 274a25f..786c55f
Fast-forward
hello.js | 1 +
1 file changed, 1 insertion(+)
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git branch -d wzmlearngit
Deleted branch wzmlearngit (was 786c55f).
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git branch
* master
Git解决冲突
当在子分支上修改内容,没有合并到主分支
而又在主分支修改了内容,此时合并会有冲突(vscode 自带一键解决)
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git branch dev
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git checkout dev
Switched to branch 'dev'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (dev)
$ git add hello.js
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (dev)
$ git commit -m 'change'
[dev 2e722a4] change
1 file changed, 3 insertions(+)
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (dev)
$ git checkout master
Switched to branch 'master'
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git add hello.js
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git commit -m '主分支'
[master 54dcd89] 主分支
1 file changed, 3 insertions(+)
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git merge dev
Auto-merging hello.js
CONFLICT (content): Merge conflict in hello.js
Automatic merge failed; fix conflicts and then commit the result.
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master|MERGI NG)
$ git add hello.js
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master|MERGI NG)
$ git commit -m '解决冲突'
[master cd78203] 解决冲突
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git branch -d dev
Deleted branch dev (was 2e722a4).
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$ git branch
* master
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)
$
Git关联远程仓库-github
1.生成ssh
打开已经完成各种操作的learngit 文件夹右键控制台输入
ssh-keygen -t rsa -C "iwen@iwenwiki.com" => 一直回车
在C盘中找到这个文件夹(C:\Users\Administrator\.ssh)
2.关联github
点击头像 => Settings => ssh and GPG keys => New SSH key
3.创建仓库
点击头像旁边的 + 号 选择New repository
4.把本地仓库的代码推送到远程仓库
第一次推送:
git remote add origin https://github.com/Geekiwen/web1811.git
git push -u origin master(现在Github默认改成了main)
而且要用token才能push成功!!!
报错:Support for password authentication was removed on August 13, 2021
以后:
git push
这里需要注意的是token 这个字符串 会输入一个Note
再次输入密码的时候用Note,是不能登陆的,所以,我们应该要保存一下这个token字符串
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
Git关联远程仓库-gitee
一开始的全局配置什么的和Github相似
ssh公钥:
SHA256:OzjsvAjD6wp1IxJCL2HeJ6kiFFCH5m/+i9EnkALzTvY
gitee平台:
1.克隆仓库: git clone https://gitee.com/wzm_love_coding/web1811.git
2.上传操作
3.多人协作:
协同开发人员之间相互 git pull 就可以看到对方的修改的内容
8.远程仓库的命令:
git clone url
git push
账号是@后面的字符串
可以看到push成功了!!!
git pull
---------------------------------------------------------------------------------------------------------------------------------
上传一个项目到Gitee流程:
在gitee 上面建立仓库,控制台输入git init 进行初始化操作
设置成开源
成功后,首先执行clone操作,如下 依次执行下面三条代码
- $ git clone https://gitee.com/wzm_love_coding/js.git
- $ git remote add origin https://gitee.com/wzm_love_coding/js.git
- $ git push -u origin "master"
然后再git add 文件名 (可以add完所有的文件,再commit)
最后再git push
看效果,文件已经上传到gitee
下面一部分代码是错误操作的情况
比如,一开始没有初始化仓库 git init 就直接add
没有关联到远程仓库就在commit后执行git push,报错如下
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository usinggit remote add <name> <url>
and then push using the remote name
git push <name>
解决:控制台输入下面代码
- $ git remote add origin https://gitee.com/wzm_love_coding/js.git
- $ git push -u origin "master"
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点
$ git clone https://gitee.com/wzm_love_coding/js.git
Cloning into 'js'...
fatal: unable to access 'https://gitee.com/wzm_love_coding/js.git/': Unknown SSL protocol error in connection to gitee.com:443
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点
$ git clone https://gitee.com/wzm_love_coding/js.git
Cloning into 'js'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点
$ git add 1.html
fatal: Not a git repository (or any of the parent directories): .git
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点
$ git add index.html
fatal: Not a git repository (or any of the parent directories): .git
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点
$ git init
Initialized empty Git repository in D:/DOM_AND_BOM_CODES/DOM_CODES/Text节点/.git/
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add 1.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add index.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add insertBefore\(\).html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add JavaScript_CSS操作.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add Node节点属性_childNodes.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add Node节点属性_nextSibling.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add removeChild\(\).html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add replaceChild\(\).html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git add 闭包概念.html
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git commit -m 'js 部分代码'
[master (root-commit) 98af8ec] js 部分代码
9 files changed, 246 insertions(+)
create mode 100644 1.html
create mode 100644 "JavaScript_CSS\346\223\215\344\275\234.html"
create mode 100644 "Node\350\212\202\347\202\271\345\261\236\346\200\247_childNodes.html"
create mode 100644 "Node\350\212\202\347\202\271\345\261\236\346\200\247_nextSibling.html"
create mode 100644 index.html
create mode 100644 insertBefore().html
create mode 100644 removeChild().html
create mode 100644 replaceChild().html
create mode 100644 "\351\227\255\345\214\205\346\246\202\345\277\265.html"
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using
git remote add <name> <url>
and then push using the remote name
git push <name>
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git remote add origin https://gitee.com/wzm_love_coding/js.git
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push -u origin "master"
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 4.04 KiB | 0 bytes/s, done.
Total 11 (delta 0), reused 0 (delta 0)
remote: Powered by GITEE.COM [GNK-6.3]
To https://gitee.com/wzm_love_coding/js.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push
fatal: unable to access 'https://gitee.com/wzm_love_coding/js.git/': Unknown SSL protocol error in connection to gitee.com:443
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)
$ git push
Everything up-to-date
总结:
# 新建一个文件夹作为本地仓库,右键git bash打开,初始化为本地仓库
git init
# 将要推送的文件复制到该文件夹,将文件提交到暂存区
git add 文件名
# 将暂存区的文件提交到本地分支master,并添加备注
git commit -m "备注"
# 关联远程仓库
git remote add origin https://gitee.com/个人空间地址/仓库名.git
# 将本地master分支的文件推送到远程master分支,第一次推送时需加 -u
git push -u origin master