git利用 – 潘登同砚的git利用条记
git是目前最盛行的版本控制体系。
- 版本控制体系:纪录文件或代码的变化,以便于追踪、回滚、比较等。
- 分布式:每个开发者都可以有完备的版本库,可以方便地进行协作。
Git的安装与配置
下载Git安装包,并安装。git官网:https://git-scm.com/downloads 一起next即可。
检察是否安装乐成:在下令行中输入git,假如出现git的资助信息,则阐明安装乐成。
当安装完成后,必要进行一些配置,以便利用Git。因为每次提交代码时,Git都必要纪录提交者的姓名和邮箱,所以必要进行配置。
- git config --global user.name "your name"
- git config --global user.email "your email"
复制代码 --global参数表现全局配置,也就是对当前用户起作用。
配置完后,可以利用git config --list下令检察当前的配置信息。大概在.gitconfig文件中检察。
Git根本下令
Git初始化当地堆栈
cd到你要创建堆栈的目录,然后执行:
这将创建一个名为.git的目录,这个目录是Git用来存放版本库的。
Git工作区、暂存区、版本库
- 工作区:就是你在电脑里能看到的目录,好比D:\project\test。
- 暂存区:英文叫stage或index,它是Git的暂存区域,暂时生存你对文件所做的改动。
- 版本库:工作区有一个隐蔽目录.git,这个目录是Git的版本库,用来生存所有版本的历史纪录,包罗提交过的版本和暂存的改动。
Git跟踪文件
起首确定工作区中有文件
假如没有文件,则执行:
跟踪文件后,Git会把文件暂存到暂存区,从而git可以跟工作区、当地堆栈之间进行交互。
- untracked files表现工作区中有文件没有被跟踪。
- to be committed表现暂存区中有文件等待提交。
git提交文件
提交后,执行git status
下令,可以看到nothing to commit, working tree clean表现暂存区已经清空,工作区没有未提交的改动。
Git修改文件
修改文件后,必要先跟踪文件:
检察提交历史:
- git log
- # 可以加上--oneline参数,查看简短的提交历史
- git log --oneline
复制代码 Git删除文件
删除文件有两种方式,第一种是直接删除文件,然后要参加缓存区再提交
- rm 文件名git add .
- git commit -m "删除文件"
复制代码 第二种是利用git直接提交删除操作(减少了一步)
- git rm 文件名
- git commit -m "删除文件"
复制代码 git撤销操作
之前生存了,然后做了修改操作,发现修改不满足,想撤销到上一个版本,可以利用git restore下令。
- # 将文件从暂存区恢复到工作区,用于丢弃本地修改。
- git restoe 文件名
复制代码 git取消暂存
假如做了修改操作并已经将文件暂存到暂存区,但是又不想提交,想规复到上一个暂存区版本,可以利用git restore --staged大概git reset -- file下令。
- git restore --staged . # 用于恢复所有暂存区文件
- git reset -- . # 用于恢复所有暂存区文件 (二选一即可)
- git restore . # 用于恢复所有文件(恢复到工作区)
复制代码 git跳过暂存区
为了简化提交操作,可以利用git commit -a下令,这将自动把所有已经跟踪过的文件暂存起来一并提交,跳过了git add下令。
提示: 利用-a跳过git add步骤的前提是这些待提交的文件必须已经被跟踪过,-a不会自动将未跟踪的文件变为跟踪文件。
为了简化撤销操作,可以利用git checkout HEAD .下令,这将把暂存区的文件撤销掉,回到工作区。
- git checkout HEAD -- 文件名
- git checkout HEAD . # 用于撤销所有文件(回到工作区)
复制代码 git版本回退
- # 回退到上一个版本
- git reset --hard HEAD^
- # 回退到指定版本
- git reset --hard 版本号
复制代码 HEAD表现当前版本,HEAD^表现上一个版本,HEAD^^表现上上一个版本,依次类推。
也可以用数字指定回退版本,好比git reset --hard HEAD~10表现回退到前10个版本。
可以用git reflog下令检察下令历史,以便确定要回退到哪个版本。 版本号只必要前4位即可。
版本回退会使得暂存区和工作区的文件都回到上一个版本,提交纪录也会被删除。
git撤销提交
假如是想回到上一个版本,但是又不想删除提交纪录,可以利用git revert下令。
git revert下令会在版本库中创建一个新的提交,撤销之前的提交,保存提交阐明。
相当于在版本库中创建了一个新的提交,(就好像)回到了之前的版本。
- git revert HEAD # 撤销最后一次提交
- git revert 版本号 # 撤销指定版本的提交
复制代码 Git常用下令
git忽略文件
有些文件不必要纳入版本管理,好比日志文件、缓存文件等。可以创建一个.gitignore文件,列出要忽略的文件。
格式规范
- 所有空行大概以#开头的行都会被忽略。
- 可以利用尺度的glob模式匹配。
- 匹配模式最后跟反斜杠(/)阐明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上感叹号(!)。
glob模式匹配规则:
- *匹配恣意字符串,?匹配单个字符,[abc]匹配a、b、c中的恣意一个字符。
- **匹配多级目录。
- {}匹配括号内的恣意模式。
- # 忽略所有.log文件
- *.log
- # 忽略所有logs文件和目录,包括多级路径下的logs目录,logs目录下的文件也会被忽略
- logs/
- # 忽略当前目录下的 logs 目录
- /logs
- # 忽略 a/foo a/b/foo /foo等 目录下的文件
- **/foo
复制代码 git比较文件差异
- # 比较工作区和暂存区的差异
- git diff
- # 比较暂存区和版本库的差异
- git diff --cached
- # 比较两个版本之间的差异
- git diff 版本号1 版本号2
- # 比较工作区和版本库的差异
- git diff HEAD
复制代码 git代码托管平台
通常进行多人协作开发时,必要一个代码托管平台,好比GitHub、GitLab等。
- GitHub:https://github.com/
- 也可以自己搭建Git服务器,好比GitLab。
git当地添加长途堆栈
- # 先在当地初始化堆栈git init
- # 添加长途堆栈# git remote add <name> <url>git remote add origin https://github.com/username/repository.git# 检察长途堆栈信息git remote# 删除长途堆栈 只是解除当地与长途堆栈的关联# git remote rm <name>git remote rm origin# 推送当地堆栈内容到长途堆栈# git push <remote> <branch>git push origin master# 拉取长途堆栈内容到当地堆栈# git pull <remote> <branch>git pull origin master
复制代码 git克隆与推送
- # 克隆前不要求初始化本地仓库
- # 克隆远程仓库到本地 默认名称为 origin
- # git clone <url>
- git clone https://github.com/username/repository.git
- # 推送本地仓库内容到远程仓库
- # git push <remote> <branch>
- git push origin master
- # 后续直接使用 git push 即可 origin master等信息已经记录了
复制代码 git拉取与合并
- # 拉取远程仓库内容到本地仓库
- # git pull <remote> <branch>
- git pull origin master
- # 后续使用 git pull 即可
- # 使用git pull拉取前确保设置了跟踪信息
- # git branch --set-upstream-to=<remote>/<branch> <current_branch>
- git branch --set-upstream-to=origin/master master
复制代码 git抓取
git fetch下令用于从长途堆栈获取最新数据,但不会自动合并到当地堆栈。当准备好了自己当地堆栈和长途堆栈的同步,就可以利用git merge下令进行合并。
- # 从远程仓库抓取最新数据
- # git fetch <remote> <branch>
- git fetch origin master
- # 后续使用 git fetch 即可
- # 合并远程仓库的最新数据到本地仓库
- # git merge <remote>/<branch>
- git merge origin/master
复制代码 git合并辩论
辩论是指两个或多个分支在同一文件中进行了差别的修改,导致git无法自动合并。
解决方案:
- 先拉取长途堆栈的最新数据,然后手动合并。在辩论的文件中会有HEAD和分支的差别内容,必要手动解决辩论。(把那些多余的符号也要删掉)
所以要养成习惯,在推送代码前先拉取最新数据,然后手动合并辩论。
git分支
git中的分支,本质上是指向提交对象commit的可变指针。git会利用master分支作为默认分支,其他分支都基于master分支。分支在每次提交的时间都会向前移动。在进行若干次提交后,其实已经有了一个指向最后一次提交对象的分支。
- 基于当前分支创建新分支 这会在(当前分支指向的commit对象)上新建一个新的分支指针。
- # git branch <name>
- git branch testing
复制代码
留意:差别分支可以指向同一个commit对象,但不能有相同的提交纪录。
HEAD指针
HEAD指针是一个指向当前工作中的当地分支的指针。假如我们只有一个默认的mater分支,那么HEAD指针指向master分支。
假如有多个分支,切换分支时,HEAD指针会自动移动到目标分支。
- # 切换到testing分支
- git checkout testing
复制代码 当在testing分支上进行了提交,HEAD指针会自动移动到testing分支指向的提交对象。
为什么要利用分支
一般项目中会有三个分支:master分支、dev分支、feature分支。
- master分支:主分支,用于发布稳固版本。经过测试的提交都应该合并到master分支。
- dev分支:开发分支,用于开发新功能。大概仅用于暂时测试,不稳固。
- feature分支:功能分支,用于开发新功能。从dev分支上拉取,开发完成后合并回dev分支。(名称一般由开发的功能名称加上feature前缀构成)
工作场景:开发职员在某个功能分支正在编写代码,突然接到一个电话说线上有个很严重的问题必要紧急修补,这个时间我们面临的问题:当前的功能代码不能提交到线上,所以不能在当前分支进行bug修复。
解决方案:
- 起首,返回到原先已经发布到线上的稳固版本master分支。
- 然后,创建一个新的分支hotfix分支,从master分支上拉取最新代码。
- 然后,在hotfix分支上进行紧急修复。通过测试后,合并回master分支。
- 最后,切换回原先的功能分支,继续开发。
git分支管理
创建分支
- # 创建新分支前 先保证有提交对象git commit -m "提交说明"
- # 此时master分支指向最新提交对象# 创建新分支# git branch <name>
- git branch testing
复制代码 检察分支
其中分支前面带*号表现当前分支。
- # 查看所有分支
- git branch
- # 查看所有分支的最后一次提交
- git branch -v
复制代码 切换分支
- # 切换到testing分支
- git checkout testing
复制代码 留意:切换分支,当地工作区的文件会被暂存区的文件覆盖。
新建并切换到新分支:
- # 创建并切换到新分支
- # git checkout -b <name>
- git checkout -b feature/test
复制代码 删除分支
- # 删除testing分支
- # git branch -d <name>
- git branch -d testing
复制代码 合并分支
- # 切换到新分支git checkout feature/test# 进行代码编辑,在新分支上提交内容git commit -m "提交说明"
- # 切换回master分支git checkout master# 将新分支合并到master分支# git merge <name>git merge feature/test
复制代码
最后删除没用的分支:
- # 删除feature/test分支
- git branch -d feature/test
复制代码 合并分支辩论
有时间合并操作不会如此顺遂。假如在差别分支中都对同一个文件进行了差别的修改,那么git无法自动合并,会出现合并辩论。
- # 切换到master分支
- git checkout master
- # 合并dev分支
- git merge dev
- # 出现合并冲突,需要手动解决冲突
- # 编辑冲突文件,删除多余的符号
- # 解决冲突后,提交
- git commit -am "提交说明"
复制代码 git储藏
有的时间,我们在开发过程中,会有一些暂时性的修改,好比测试代码,大概一些小的改动。这些修改并不一定要提交,但是又不想丢失。这时间,我们就可以利用git stash下令进行储藏。
- # 储藏当前工作区的修改
- git stash
- # 切换到别的分支
- git checkout master
- # 查看储藏列表
- git stash list
- # 切换回原先的分支
- git checkout dev
- # 恢复储藏
- git stash apply
复制代码 git长途分支
长途分支(remote branch )是对长途堆栈中的分支的索引。它们是一些无法移动的当地分支,长途分支就像是书签,提示着你前次毗连长途堆栈时上面各分支的位置。
我们用 (长途堆栈名)/(分支名) 这样的情势表现长途分支。在当地我们只能移动当地master分支,不能移动长途分支origin/master。
- 在当地master分支修改内容,提交后,当地master分支移动,origin/master分支保持不变。
- 只有跟服务器通信,长途分支origin/master分支才会移动,好比其他人往长途堆栈推送了代码,则长途堆栈中,master分支向前移动,我们可以通过 git fetch 获取长途堆栈库的最新数据。
- 通过 git merge orgin/master 将长途分支的变更合并到当地master分支。
创建长途堆栈分支
从当地向长途堆栈推送分支
- 在当地新建分支 feature_user
- 推送当地分支到长途堆栈
- 其他人通过 git fetch 获取长途堆栈库的最新数据
- # 推送本地分支到远程仓库
- # git push <remote> <branch> git push 远程仓库名 本地分支名:远程分支名 远程分支名跟本地分支名相同,可以采用简写
- git push origin feature_user
- # 其他人通过 git fetch 获取远程仓库库的最新数据
- git fetch origin
- # 通过远程分支创建本地分支 (先git fetct)
- # git checkout -b <name> <remote>/<branch>
- git checkout -b feature_user origin/feature_user
复制代码 留意:
- 通过git checkout -b <name> <remote>/<branch>创建当地分支时,当地分支会自动与长途分支建立追踪关系。
- 也可以先在当地新建feature_user分支,然后 git fetch 获取最新数据,再通过 git merge origin/feature_user 手动合并到当地分支,但必要手动跟踪长途分支。设置跟踪分支git branch --set-upstream-to=origin/develop develop
也可以直接在GitHub网站上创建长途分支,然后推送当地分支到长途堆栈。
删除长途分支
当我们的某个分支已经合并到master分支,而且不再必要保存时,我们可以删除长途分支。可以直接在GitHub网站上删除长途分支,也可以利用下令行删除。
- # 删除远程分支
- # git push <remote> --delete <branch>
- git push origin --delete feature_user
复制代码 留意:删除长途分支后,会将当地长途分支这个指针跟服务器上面临应的分支删撤除,当地分支不会被删除。
Git其他下令
SSH协议
SSH协议是一种网络协议,用于在两台计算机之间进行安全的长途登录。与https协议差别,https是通过用户名和密码进行认证,而SSH协议是通过密钥进行认证。
SSH协议是一种网络协议,用于在两台计算机之间进行安全的长途登录。它利用公钥加密技术,允许用户在不安全的网络中安全地进行长途登录。利用SSH协议可以有用防止中间人攻击、数据篡改、数据走漏等安全风险。
- # 在命令行cmd中输入以下命令,生成SSH密钥
- ssh-keygen -t rsa -C "your email"
- # 然后回车,会出现一系列提示,按回车键继续。
- # 最后会在用户目录下生成.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个文件是SSH密钥。
复制代码 然后把公钥id_rsa.pub的内容复制到GitHub、GitLab等代码托管平台的SSH公钥设置中。
然后复制堆栈的SSH地址,利用SSH协议克隆堆栈:
- # 克隆仓库
- # git clone <ssh_url>
- git clone git@github.com:username/repository.git
复制代码 git标签
- 什么是标签?
- 标签可以是一个对象(带注解标签),也可以是一个简单的指针(不带注解标签),用来标注某次提交对象。
- 假如只是一个简单的指针,则它就相当于一个不会移动的分支。
- 假如是一个对象,则除了生存指向的提交对象的信息之外,还会生存是谁打的标签,什么时间,还可以生存注解信息。(推荐利用)
- 为什么要利用标签?
- 我们可以为紧张的版本(某个里程碑)打上标签,相当于为这次提交纪录指定一个别名,方便提取文件。好比人们在发布某个软件版本(好比 v1.0 等等)的时间,经常这么做。
- 标签跟分支的区别?
- 分支会跟着我们的提交移动,指向最新的提交对象,但是标签不会移动,它就是指向某个固定的提交对象
新建标签:git tag -a <name> -m "标签阐明"
默认情况下,标签指向最新提交对象,假如要指定标签指向的提交对象,可以指定提交对象ID。git tag -a <name> <commit_id> -m "标签阐明"
- # 新建一个标签
- git tag -a v1.0 -m "版本1.0"
- # 查看所有标签
- git tag
- # 查看某个标签的详细信息
- git show v1.0
- # 删除标签
- # git tag -d <name>
- git tag -d v1.0
- # 推送标签到远程仓库
- # git push <remote> <tag>
- git push origin v1.0
复制代码 通过标签获取对应版本(检出)git checkout -b 当地分支名 标签名
- # 获取v1.0版本
- git checkout -b test_dev v1.0
复制代码 在VSCode中利用Git
VSCode是微软推出的开源代码编辑器,它内置了Git插件,可以方便地利用Git进行版本控制。
- 安装Git插件
- 初始化堆栈
- 暂存文件 (点击文件右侧的加号)
- 提交文件
- 推送到长途堆栈
推送前先拉取,解决辩论,然后再推送。 在vscode中假如在当地进行了修改,git中会有同步修改的提示。点击同步按钮,可以将当地修改同步到长途堆栈。(同步修改等于先拉取,解决辩论,再推送)
- 分支管理 点击左下角的分支图标,可以检察当前堆栈的分支,切换分支等。
- 一般来说单个开发职员也不直接基于dev分支进行开发,而是基于dev分支创建自己的分支,好比feature分支。
- 写完后,在dev分支上进行分支合并feature分支,然后提交dev分支,最后再合并到master分支。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |