Git
1. Git 简介
Git是一个版本管理控制系统(缩写VCS),它可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来。
Git 有什么特点?简单来说就是:高端大气上档次!
1.1 集中式 VS 分布式
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟,这还不得把人给憋死啊。
那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
1.2 Git 简单说明
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
2. Git 配置
Git
官网:https://git-scm.com/。
在使用 git 前,需要告诉 git 你是谁,在向 git 仓库中提交时需要用到。
# 配置
**
1. 配置提交人姓名:git config --global user.name “提交人姓名” # (对当前系统用户有效)
2. 配置提交人姓名:git config --global user.email “提交人邮箱” # (对当前系统用户有效)
作用:识别开发人员
3. 查看 git 配置信息:git config --list
# 注意
1. 如果要对配置信息进行修改,重复上述命令即可。
2. 配置只需要执行一次
3. 常用命令
-
查看 git 版本
-
git --verson
-
-
初始化 git 仓库
-
git init
-
-
添加文件
-
添加到版本库
-
git add # 可以添加多个文件 git add [file1] [file2] ... ########### git add . # 添加当前目录下的所有文件 ################################### git add -u <==> git add –update 提交所有被删除和修改的文件到数据暂存区 git add . 提交所有修改的和新建的数据暂存区 git add -A <==>git add –all 提交所有被删除、被替换、被修改和新增的文件到数据暂存区
-
-
将文件提交到仓库
-
git commit -m "本次提交的信息,可以输入任意内容,当然最好是有意义的"
-
-
查看仓库状态
-
git status # 红色:文件被修改,未添加到版本库去 # 绿色:文件添加到版本库,未提交 # nothing to commit, working tree clean 表示已经提交到版本库
-
-
查看 git 的历史记录
-
git log git log --pretty=oneline # 一行显示版本信息
-
##### 补充: git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac # 会显示所有关于这个id以及之前的修改记录 git log lfa380b5O2a0Ob82bfc8d84c5ab5el5b8fbf7dac -1 # 加上-1参数表示我们只想看到一行记录 # 而如果想要查看这条提交记录具体修改了什么内容,可以在命令中加入p参数,命令如下: git log Ifa380b502a00b82bfc8d84c5ab5el5b8fbf7dac -1 -p
-
-
回退版本
-
在 Git 中,用
HEAD
表示当前版本,也就是最新的提交29ce...9598a
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上 100 个版本写 100 个^
比较容易数不过来,所以写成HEAD~100
。 -
git reset --hard 版本id ####################完整命令######################## git reset [ --soft | --mixed | --hard] [HEAD] # --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。 $ git reset HEAD^ # 回退所有内容到上一个版本 $ git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本 $ git reset 052e # 回退到指定版本 # --soft 参数用于回退到某个版本: $ git reset --soft HEAD~3 # 回退到上上上一个版本 # --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交: $ git reset --hard HEAD~3 # 回退到上上上一个版本 $ git reset --hard bae128 # 回退到某个版本回退点之前的所有信息。 $ git reset --hard origin/master # 将本地的状态回退到和远程的一样
-
-
查看所有历史记录的版本号
-
git reflog ################ LYJ@DESKTOP-2GF6LRA MINGW64 /d/写代码/Java/LearnGit (master) $ git reflog 29ce87a (HEAD -> master) HEAD@{0}: reset: moving to 29ce c2bdf2f HEAD@{1}: reset: moving to c2bd 29ce87a (HEAD -> master) HEAD@{2}: commit: 第三次修改test.txt文件 686a348 HEAD@{3}: commit: 第二次修改test.txt文件 c2bdf2f HEAD@{4}: commit: 第一次修改test.txt文件 d902b2e HEAD@{5}: commit (initial): 创建test.txt文件
-
-
关联远程仓库
-
git remote add 远程仓库地址别名(可以自定义,一般为origin) 远程仓库地址 ################## 例子 git remote add origin https://github.com/xxxxx.git
-
-
推送到远程仓库
-
git push [-u] 远程仓库地址别名 分支名称 git push origin master # 推送远程分支 git push -u origin master # -u 记住推送地址及分支,下次推送只需要输入git push即可
-
-
拉取远程仓库中最新的版本
-
git pull 远程仓库地址 远程地址分支名称 git pull origin master # 拉取 origin 主机的master分支,与本地当前分支合并 ######################## git clone跟git pull的区别 ######################## git clone是在没有本地仓库的基础上clone别人的东西,而 git pull 则是在有本地仓库的基础上拉取代码到本地。git clone 只是第一次参与开发时用,以后都是用 git pull 命令。
-
-
删除远程仓库
-
git remote remove origin
-
4. 撤销修改
4.1 撤销工作区的修改
即还未执行
git add
操作
git checkout -- 文件名字 #例如 git checkout -- test.txt
4.2 撤销暂存区的修改
即已经执行
git add
操作
# 需要进行两步操作
**
> 暂存区撤回工作区 git reset HEAD 文件名 例如 git reset HEAD test.txt
> 撤回工作区修改 git checkout -- 文件名 例如 git checkout -- test.txt
**
4.3 git 如何修改最近一次的commit信息
**
1. git commit --amend
2. 进入vim操作界面之后, 点击字母键 i 然后进入INSERT模式,然后对commit信息进行修改,然后ESC 然后 :wq 保存退出
3. 然后执行 git log 会发现最近的一次commit信息被修改成功了
4.4 git checkout
的其他用法
**
> 核查工作区相对于版本库修改过的文件: git checkout 后面不加任何参数
> 创建新分支:git branch 分支名
> 切换到新分支:git checkout 分支名
> 上面两个命令也可以合成为一个命令----创建分支并切换到该分支:git checkout -b 分支名
> 以指定的提交节点创建一个临时性分支: git checkout commitID
> 以指定的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样: git checkout -b 分支名 commitID
**
4.5 文件删除
**
1. rm 文件
2. 确定删除
- git rm 文件
- git commit -m ""
3. 取消删除
- git checkout -- 文件
**
开发过程中,不是每个文件都是有必要交给git管理的,使用这个命令可以从暂存区删除没用的文件,不交给git管理,此时文件在工作目录依然存在,只是没在暂存区而已.
5. Git 分支
-
创建分支
-
git branch 分支名 ############################# git branch 表示查看存在哪些分支
-
-
切换分支
-
git checkout 分支名 git checkout -b 分支名 #创建分支并切换到该分支
-
-
合并分支
-
git merge 来源分支 # 例如:将dev分支合并到主分支 git checkout master # 切换到主分支 git merge dev # 将dev分支合到主分支
-
-
删除分支
-
git branch -d 分支名称 # 删除分支(分支被合并后才允许删除)(-D 强制删除) # 注意: 如果某分支没有合并,则该分支不可以直接被删除,解决办法就是把小d改为大D即可。
-
-
暂时保存更改
-
git stash # 存储临时改动 git stash pop # 恢复改动 ####################################### 应用场景(分支临时切换): 正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug, 需要马上解决,但是新功能做到了一半你又不想提交。这时就可以使用 git stash 命令先把当前进度保存起来,然后切换到另一个分支去修改bug; 修改完提交后,再切回 dev 分支,使用 git stash pop 来恢复之前的进度继续开发新功能。 # 保存当前未commit的代码 git stash # 保存当前未commit的代码并添加备注 git stash save "备注的内容" # 列出stash的所有记录 git stash list # 删除stash的所有记录 git stash clear # 应用最近一次的stash git stash apply # 应用最近一次的stash,随后删除该记录 git stash pop # 删除最近的一次stash git stash drop
-