Git版本控制系统
0.相关linux命令
ls ` ls -a ls -al查看当前目录文件
ls -ah`命令 查看当前文件夹的隐藏文件
cat 显示文件内容
pwd 查看当前文件路径
rm -rf 删除命令 删除某个目录及其下属的所有目录和子文件
-d:直接把欲删除的目录的硬连接数据删除成0,删除该目录; -f:强制删除文件或目录; -i:删除已有文件或目录之前先询问用户; -r或-R:递归处理,将指定目录下的所有文件与子目录一并处理; --preserve-root:不对根目录进行递归操作; -v:显示指令的详细执行过程。
1.配置git
git config --global user.name "名字"
git config --global user.email "邮箱地址"
填写用户名和邮箱作为一个标识,提交等权限识别通过ssh文件。
2.创建版本库
Q:理解工作区、版本库、暂存区的几个概念?
工作区:简单理解就是需要进行版本的某个文件夹(假设为demo),这个文件夹有一些特殊之处——多了
.git这个隐藏的文件夹版本库:demo文件夹下的
.git文件夹就是版本库暂存区:暂存区可以理解为一个虚拟工作区,这个虚拟工作区会跟踪工作区的文件变化(增删改等操作)。这个工作区的位于
.git文件夹下的index目录下
git init 把一个目录变成git可以管理的仓库
注意:所有的版本控制工具只能跟踪文本文件的变化 但是不能跟踪图片视频等二进制文件的变化
.gitignore文件可以配置不需要被git追踪的文件:
# 一个常见的配置文件
vscode
.idea
/node_modules
.DS_Store
**/.DS_Store
package-lock.json
npm-debug.log*
yarn-debug.log*
yarn-error.log*
git add . 暂存更改,将文件更改添加到暂存区(包括文件删除操作)。
git commit -m "提交附加信息" 提交更改,表示将暂存区的内容提交到当前本地分支。
3.版本回退
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的
HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
git log # 显示由近及远的提交记录
git relog # 版本回退后,查看已经提交过的全部版本
git log --pretty=oneline # 精简显示内容
git diff 文件名 # 查看文件修改内容
git diff HEAD -- 文件名 # 查看工作区文件和版本库里面最新版本的区别
git reset --hard HEAD^ # 回退到上一个版本
git reset --hard HEAD^^ # 回退到两个版本前
git reset --hard HEAD~23 # 回退到23个版本之前
git reset --hard '版本号' # 回退到对应版本号的版本,而且版本号太长不必写全。
4.管理撤销修改和删除文件
撤销修改
在文件中增加内容,但是没有提交, 发现有错误 需要马上恢复之前版本。
1.git checkout -- file 撤销工作区的修改(–不能少)
2.git reset HEAD file 撤销暂存区修改回到工作区 (unstage)
删除文件
1.git add ./git rm file —-> git commit -m"" 提交删除
2.git checkout --file 从工作区恢复删除的文件
5.远程仓库
1.创建github账号
2.配置ssh 查看主目录下有没有.ssh目录 查看有没有id_rsa 和 id_rsa.pub
mac下文件路径为/users/zl/.ssh
ssh-keygen -t rsa -C "邮箱名" # 生成ssh秘钥
3.登录github 在setting中ssh keys页面add ssh key
粘贴id_rsa.pub内容
github允许你有多个Key只要把每台电脑的key都添加到github 就可以在每台机器上进行推送了
将本地仓库和远程仓库关联起来:
git remote add origin git@gitee.com:superman66/gittest.git
Q:从本地仓库往远端仓库推送代码出现readme.m文件导致的冲突问题?
处理方法1:
远程库的名字就是origin(默认叫法)
1.github手动创建的仓库包含README.md二进制文件,本地仓库没有这个文件所以会报错
git pull --rebase origin master
git pull = git fetch +git merge 此时可以看到本地仓库多了README.md这个文件
2.git push -u origin master 推送
处理方法2:
1.清空远程仓库
2 git remote add origin + git@github.com
3.git push -u origin master
4.正常使用
Q:git push -u origin master 的作用?
把本地库的内容推送到远程,用
git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送
master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,通过git push进行推送。
把远端版本库克隆到本地
```sh gsh g git clone ssh地址
#### 6.分支管理
**git无论创建、切换和删除分支都可以在一秒钟内完成,无论新版本是一个文件或者一万个文件**
`HEAD`严格来说不是指向提交,而是指向`master`, `master`才是指向提交的,所以`HEAD`指向当前分支:
当我们创建新的分支,例如`dev`时,Git新建了一个指针叫`dev`,指向`master`相同的提交,再把`HEAD`指向`dev`,就表示当前分支在`dev`上:
**创建分支并切换**
```shell
git checkout -b dev
# 相当于两条命令依次执行
git branch dev # 创建
git checkout dev # 切换
查看当前分支
git branch
# *dev *号代表当前分支
# master
合并分支
git checkout master # 切换分支
git merge dev # 合并指定分支到当前分支
删除分支
git branch -d dev
解决冲突 git 无法自动合并分支时,必须首先解决冲突,解决冲突后再提交合并完成 查看分支合并图
git log --graph
查看精简分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
git合并分支的时候如果可能会采用fast forward模式
禁用fast forward模式 git会在merge时生成一个新commit 这样从分支历史就可以看到分支信息
7.Bug分支
工作区和暂存区是一个公开的工作台,任何分支都会用到,并能看到工作台上最新的内容,只要在工作区、暂存区的改动未能够提交到某一个版本库(分支)中,那么在任何一个分支下都可以看得到这个工作区、暂存区的最新实时改动。 使用git stash就可以将暂存区的修改藏匿起来,使整个工作台看起来都是干净的。所以要清理整个工作台,那么前提是必须先将工作区的内容都add到暂存区中去。之后在干净的工作台上可以做另外一件紧急事件与藏匿起来的内容是完全独立的
1.将当前分支dev上修改过的被追踪的文件和暂存区的文件保存,把工作现场储存起来
git stash
2.创建切换分支
git checkout master # 切换到主分支
git checkout -b debug # 创建bug处理分支 处理完合并分支 并删除debug分支
3.返回dev分支,恢复工作现场
git checkout dev
git stash list
git stash apply # 恢复工作区 不删除stash内容
git stash drop # 删除stash
git stash pop # 恢复同时删除
git stash apply stash@{} # 恢复指定的stash
8.Feature分支
开发新功能建立新分支,开发完成后分支合并即可
删除本地分支
git branch -d feature1
强行删除
git branch -D feature1
9.多人协作
查看远程库信息
git remote 查看远程库信息
git remote -v 显示更详细信息
git branch -a 查看本地仓库和远程仓库的所有分支
提交前:
git merge origin 远程分支
创建tag
git tag tag-dev-initial 创建tag
git push origin tag-dev-initial 推送到远程仓库
指定本地分支,git把该分支推送到远程库对应的远程分支上
git push origin master # 推送master到远程master
git push origin dev # 推送dev到远程dev,若远端没有dev分支则创建,此时创建的远程分支没有关联本地分支
git push --set-upstream origin/branch-name # 手动建立本地和远程关联
git push -u origin master # 推送到远端并且建立远程本地关联,简化提交步骤只需要git push
# 推送的话本地分支推送到对应的远程分支 建立连接 local/dev -- origin/dev local/master --origin/master
# 创建一个本地新分支feature后可以推送到远端 创建对应的远程分支
master 和 dev分支都往远程推送,其他的看心情
远程删除git 服务器上的分支
git push origin -d dev
本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
从远程抓取分支
git pull # 如果有冲突 先处理冲突