版本控制器Git

版本控制器Git,第1张

目录

版本控制器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 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添加文件需要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 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 
  •         查看分支: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 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

具体看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.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  

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.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
 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/563891.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)

保存