> 文档中心 > 版本控制器Git

版本控制器Git

目录

版本控制器Git

安装Git

创建版本库

疑难解答

 时光机穿梭

小结

版本回退

工作区和暂存区

        删除文件

Git分支管理

 Git解决冲突

Git关联远程仓库-github

Git关联远程仓库-gitee

上传一个项目到Gitee流程:


版本控制器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 initInitialized 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添加文件需要addcommit一共两步呢?因为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仓库,分两步:

  1. 使用命令git add ,注意,可反复多次使用,添加多个文件;
  2. 使用命令git commit -m ,完成。

 时光机穿梭

$ 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 statusOn branch masternothing 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 refloge475afc HEAD@{1}: reset: moving to HEAD^1094adb (HEAD -> master) HEAD@{2}: commit: 第一天的最新版本e475afc HEAD@{3}: commit: add distributedeaadf4e 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 
  •         查看分支:git branch
  •         创建分支:git branch 
  •         切换分支:git checkout 
  •         合并某分支到当前分支:git merge 
  •         删除分支:git branch -d 
Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git checkout -b wzmlearngitSwitched to a new branch 'wzmlearngit'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)$ git branch  master* wzmlearngitAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)$ git add hello.jsAdministrator@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 masterSwitched to branch 'master'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git checkout wzmlearngitSwitched to branch 'wzmlearngit'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (wzmlearngit)$ git checkout masterSwitched to branch 'master'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git merge wzmlearngitUpdating 274a25f..786c55fFast-forward hello.js | 1 + 1 file changed, 1 insertion(+)Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git branch -d wzmlearngitDeleted 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 devAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git checkout devSwitched to branch 'dev'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (dev)$ git add hello.jsAdministrator@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 masterSwitched to branch 'master'Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git add hello.jsAdministrator@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 devAuto-merging hello.jsCONFLICT (content): Merge conflict in hello.jsAutomatic 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.jsAdministrator@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 devDeleted branch dev (was 2e722a4).Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/Git/learngit (master)$ git branch* masterAdministrator@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

具体看token 和 解决2

                以后:

                    git push

 

 这里需要注意的是token 这个字符串 会输入一个Note 

再次输入密码的时候用Note,是不能登陆的,所以,我们应该要保存一下这个token字符串

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

Git关联远程仓库-gitee

一开始的全局配置什么的和Github相似

参考地址:git推送文件到gitee_m0_46704635的博客-CSDN博客_git推送到gitee注册gitee账号设置姓名、个人空间地址点击头像旁边的加号,新建仓库安装git# 设置姓名和邮箱,姓名是注册gitee时设置的姓名,邮箱是注册gitee的邮箱git config --global user.name "chny"git config --global user.email "xxxxx@163.com"# 查看git config user.namegit config user.email添加SSH公钥打开githttps://blog.csdn.net/m0_46704635/article/details/118151527?utm_source=app&app_version=5.3.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

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操作,如下 依次执行下面三条代码

  1. $ git clone https://gitee.com/wzm_love_coding/js.git
  2. $ git remote add origin https://gitee.com/wzm_love_coding/js.git
  3. $ 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 using

    git remote add

and then push using the remote name

    git push

解决:控制台输入下面代码

  1. $ git remote add origin https://gitee.com/wzm_love_coding/js.git
  2. $ 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.gitCloning into 'js'...fatal: unable to access 'https://gitee.com/wzm_love_coding/js.git/': Unknown SSL protocol error in connection to gitee.com:443Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点$ git clone https://gitee.com/wzm_love_coding/js.gitCloning 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.htmlfatal: Not a git repository (or any of the parent directories): .gitAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点$ git add index.htmlfatal: Not a git repository (or any of the parent directories): .gitAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点$ git initInitialized 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.htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add index.htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add insertBefore\(\).htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add JavaScript_CSS操作.htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add Node节点属性_childNodes.htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add Node节点属性_nextSibling.htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add removeChild\(\).htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add replaceChild\(\).htmlAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git add 闭包概念.htmlAdministrator@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 pushfatal: No configured push destination.Either specify the URL from the command-line or configure a remote repository using    git remote add  and then push using the remote name    git push Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git remote add origin https://gitee.com/wzm_love_coding/js.gitAdministrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git pushfatal: 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 masterAdministrator@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 -> masterBranch master set up to track remote branch master from origin.Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git pushfatal: unable to access 'https://gitee.com/wzm_love_coding/js.git/': Unknown SSL protocol error in connection to gitee.com:443Administrator@XTZJ-20220214GY MINGW64 /d/DOM_AND_BOM_CODES/DOM_CODES/Text节点 (master)$ git pushEverything up-to-date