git 版本控制器 初学习,工作中的问题及其解决方法
one day
1. 下载安装git控制器
>>>>>>(测试环境 window10)Git下载地址https://git-scm.com/downloads
>>>>>>>>>>>>>>>>>>>软件的安装:按照提示步骤一步安装,安装完成
目前我只用到了 Git Bash
①这里安装成功需要配置一下个人的用户名user.name个人电子邮件地址user.email,每次提交的时候都会引用这两条信息,说明是谁提交的,是谁更新的,这个将被纳入历史history
- $ git config --global user.name "zhang"
- $ git config --global user email "zhang@example.com"
- 如果使用了--global以后的配置都默认在这个用户下,如果需要修改就重新配置一下不加--global就可以了
②可以配置自己喜欢的的外部文件编辑器比如Emacs,Git默认使用Vi或Vim 就是linux常用的编辑器
- $ git config --global core,editor emacs
③查看配置信息 | 也可以直接查看某个环境变量的配置信息
- $ git config --list | $ git config user.name
2. git简介
git是世界上最先进的版本控制器(没有之一),版本控制器就是假设你想找回被删除的文件,一个个找又会很麻烦,像我之前用的保存文件副本,这样也是不可行的这样会经常搞忘记这个文件是第一版本还是另外一个是了
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
说明一下版本控制器作用范围
- 只能追踪文本的变化,for example 页面,js ,css程序代码等
- 可以告诉你在哪行删了什么文字,文段,而视频,图片等二进制文件还是不行的,无法跟踪其变化
- 只能告诉你二进制每次改动串起来,比如100kb变为了120KB等
- word就是二进制文件所以-------
- 建议使用utf-8的编码模式,使用Notepad++文本编辑器,以为Microsoft开发的记事本会在文本之前自动添加0xefbbbf(十六进制)的字符,比如网页打开可同文件头多一个"?"
Git的诞生 1991年linus创建linux,从此,linux系统不断发展,已经成为了最大的服务器系统软件
2002年<-linux的壮大都是靠众多志愿者,志愿者为linux编写代码,再发给linus本人手动方式合并代码
为啥不linus不把linux放在CVS,SVN等免费的版本控制器上了,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
曾经BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。当被linux社区的牛人玩坏了。BitMover公司回收linux社区的免费使用权限
linus花了两周用C自己写了一个分布式版本管理系统 ---Git
Git迅速成为最流行的分布式版本管理系统,尤其是2008年,GitHub的出现
3. 创建版本库
>>>>>>看着廖老师的博客试着操作一下
>>>>>>>>>>>>>>>>>>>创建一个来测试用的文件夹
①打开 Git Bash
②创建一个版本库 $ mkdir learnGit
③到自己创建的版本库下 $ cd learnGit
④查看当前路径 $ pwd
>>>>>>>>>>>>>>>>>>>使用命令件创建的文件夹 learnGit文件夹变成Git仓库
① $ git init --------------------------------瞬间Git仓库就建好了,而且还是个空仓库(empty Git repository 清空Git存储库)
- 此时会发现文件夹下多了一个.git目录 $ ls -ah
>>>>>>>>>>>>>>>>>>> 创建文件,模拟版本更新事故现场真实还原
①创建一个readme.txt文件夹----->第一步$ git add 添加到仓库的暂存区(后面会介绍什么叫)------>第二步 $ git commit 把文件提交到仓库
- 通过图形化操作也就是自己在window系统创建一个readme.txt添加以下字段-------------------最好是在learnGit文件下,放在别处Git再厉害也是不可能找到的
Git is a version control system.
Git is free software.
- 使用 $ git add告诉Git将文件放到暂存区
- 使用 $ git commit -m “this is one”-----------------------
-m
后面输入的是本次提交的说明,最好有意义,方便后面的提示 - add,commit可以一次提交多个文件
-
$ git add file1.txt $ git add file2.txt file3.txt $ git commit -m "add 3 files.
- 提示信息:
1 file changed
:1个文件被改动(我们新添加的readme.txt文件);2 insertions
:插入了两行内容(readme.txt有两行内容)。
②对readme.txt 进行多次修改
- 再一次修改readme.txt文件加入如下字段------------------使用 $ git status命令查看掌握当前库的状态 ---------------使用 $ git diff 查看文件到底修改了些什么
Git is a distributed version control system.
Git is free software.
- $ git status (地位。身份。情形。状态)
- $ git diff (difference 不同的。不一样的)
- 提示消息:
- On branch master 在分支系统上
- Changes not staged for commit 未提交的更改
- (use "git add <file>..." to update what will be committed) 使用 “git add <file>...”更新将要提交的内容
- (use "git checkout -- <file>..." to discard changes in working directory) 使用"git checkout -- <file>..."放弃工作目录中的修改
- modified: readme.txt 被改进的
- no changes added to commit (use "git add" and/or "git commit -a") 没有添加要提交的内容 使用 "git add" and/or "git commit -a"
- 提示消息
- 第一行表示 diff --git a/readme.txt b/readme.txt 表示git格式的diff 进行比较的是a版本的readme.txt(变动前)版本的readme.txt(变动后的)
- 第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限).
- 第三四行表示进行比较的两个文件.---表示变动前的版本 +++表示变动后的版本
- @编号是隔断起始和结束。-表示第一个文件(变动前)+表示第二个文件(变动后的)
- 绿色表示更改过的增加的内容
- 红色表示删除的内容 -Git is free sortware Git是一个免费的软件
③提交到库
- 提交到暂存器 $ git add---------------------------将修改提交到库 $ git commit -m "this is two"
- 添加到暂存器 $ git add readme.txt
- 提交到库之前我们先看看库状态 $ git status
- 将修改提交到库 $ git commit -m "this is two"
- 提示消息
- Changes to be committed: 要提交的更改
- use "git reset HEAD <file>..." to unstage) 使用“git reset HEAD<file>…”进行版本回退
- 1 file changed, 3 insertions(+), 1 deletion(-) 一个文件改变,3处插入,1处删除
>>>>>>>>>>>>>>>>>>> 版本回退
- 和上文一样的步骤在提交一个版本的readme.txt
- $ git log命令查看历史记录,最多可以可以看到3次提交,最近的一次是
append GPL
,上一次是add distributed
,最早的一次是wrote a readme file
。 - 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上$git log--
pretty=oneline
参数:
- 首先,Git必须知道当前版本是哪个版本,在Git中,用
HEAD
表示当前版本,append GPL 8e10e6......,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。 - 当前版本
append GPL
回退到上一个版本add distributed
,就可以使用git reset
命令:
3.还可以继续回退到上一个版本wrote a readme file
,不过且慢,然我们用git log
再看看现在版本库的状态:
4.最新的那个版本append GPL
已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL
的commit id
是 8e10e6...
,于是就可以指定回到未来的某个版本:
5.$ git reset --hard 8e10e6
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
再小心翼翼地看看readme.txt
的内容:
6.在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^
回退到add distributed
版本时,再想恢复到append GPL
,就必须找到append GPL
的commit id。Git提供了一个命令git reflog
用来记录你的每一次命令:
>>>>>>>>>>>>>>>>>>>>工作区和暂存区
①其实把提出这个概念,就是为了说明文件成文版本被记录需要经过三个过程
- 就是自己对文件内容的修改
- 使用git add Git判断是否有内容的修改并放到stage(暂存区),暂存区可以放很多文件,你可以一次性提交也可以,分开提交到库
- 第三部就是使用git commit 将存放在暂存区的文件提交到 库里面(这里得注意没提交到暂存区的文件不会提交到库,通过这个命令),这里面的是可以进行版本返回的 参照版本退回章节
- Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指针叫HEAD
。
-
Git非常清楚地告诉我们,
readme.txt
被修改了,而LICENSE
还从来没有被添加过,所以它的状态是Untracked
。现在,使用两次命令git add
,把readme.txt
和LICENSE
都添加后,用git status
再查看一下:
- 一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
>>>>>>>>>>>>>>>>>>>>>>>>>>>.撤销修改
可能出错的地方 需要还原到先前(上一个)版本
①还未提交还在自己的文件夹里,准备提交的时候发现错误,这个简单可以通过手动删除新添加的东西
- 也可以是使用git checkout -- readme.txt(其中--和重要没有--就是另外一个命令了)
-
git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
②提交了 在暂存区了已经
-
$ git reset HEAD readme.txt
-
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。 - 再使用 git s'tatus 看见 暂存区干净了就是工作区还有东西
-
$ git checkout -- readme.txt
以下是我遇到的问题以及解决方法
创建库
1. git config --global user.name "your name"
2. git config --global user.email "815842080@qq.com"
echo "# vue" >> README.md
3. git init
4. git add test.txt
5. git commit -m "项目介绍"
6. git remote add origin https://github.com/520Girl/vue.git
6. git push -u origin master(dev) -u第一次提交需要这个,origin表示远程库默认名,master表示主分支名
7. git remote 查看远程仓库名称
7.git remote rm origin
9.$ git clone git@github.com:michaelliao/gitskills.git 克隆下来
8.origin/dev 表示origin远程库,dev分支提交的
版本回退
1. git log |git log --pretty=oneline 后者简要显示, 按英文状态下的q
2. git reset --hard HEAD^ 回退到上一版本 HEAD^^ HEAD~100 1094a
3. git reflog 记录每一次命令
撤销修改
情况分析:
工作区修改:
1.知道修改的内容自己直接删除
2.通过 $ gti checkout -- readme.txt 回到版本库一摸一样的状态
提交到了暂存区后修改了:
1.通过 $ git checkout --readme.txt 回到暂存区修改的状态[注意-- 没有这个符号表示切换到另一个分支]
2.通过 git reset HEAD readme.txt将在暂存区的修改回退到工作区(将修改带到工作区),之后通过 $git checkout 删除工作区的修改
删除文件:
1.rm 提示将要删除文件
2.git status 查看删除的内容
3.git rm 确认删除
4.git checkout -- 回退到版本库中最新
分支创建-- 分支上可创建分支
--------分支可以上传push后,只有上传后才能在github 上看到branches,就和master一样dev
--------远程库可以改通过git remote add $ git push jiang bug
1.git checkout -b dev 创建并切换到dev
2. git branch 查看当前分支
3.git merge dev 分支合并 合并dev分支到master上 Fast-forward为快速模式(弊端 删除分支后,会丢掉分支信息。)所以合并分支merge时使用
--no-ff 取消快速模式,可以在 log下看到分支提交信息
4. git branch -d dev 删除分支(-D强行删除)
5.git log --graph --pretty=oneline --abbrev-commit 查看分支提交情况
分支冲突问题
描述:在dev分支上修改的文件提交成功(commit),master分支修改的文件提交成功(commit),合并,出现问题,
git status查看,<<<===>>>中是错误,进行增删改查,之后再次提交add-commit ,最后删除分支
Bug分支:
描述:在dev上工作还没完成,现在需要处理一个bug,你想新建一个分支来处理,但dev工作还没提交---解决方案
git stash 当前工作现场存储起来,status查看不了,需要git stash list查看,恢复:
1.git stash apply stash内容并不删除, 可以通过git stash drop删除
2.git stash pop 恢复的同时吧stash内容删了
3. git stash apply stash@{0} 根据指定的stash恢复(stash提交多次)
feature分支,新功能分支,需要添加新功能需要通过在dev分支上新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
多人协作之抓取分支:
问题描述:也就是一个仓库通过不同的远程库名提交的内容会报错,解决方法如下,需要确认远程库名/分支名git config 在同一仓库添加不同库名(以及用户)
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
vscode
git pull命令用于从另一个存储库或本地分支获取并集成(整合)。git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂
D表示删除文件,U表示新增文件,M表示修改过的文件,点击可查看修改内容
git clone 与 git pull的区别
git clone 从远程服务器克隆一个一摸一样的版本库到本地
eg:$ git clone #版本库网址# #本地目录名#
$ git clone git://github.com/schacon/grit.git mygrit
git pull 从远程服务器获取一个分支的更新内容,更新到本地,取回远程主机某个分支的更新,再与本地的指定分支合并
eg:$ git pull ##远程主机(origin) #远程分之(next)#:#本地分之(master)#
cat test.txt 查看文件中的内容
cd..
cd ~
①②③④⑤⑥⑦⑧