git的基本操作
初始化项目
- git init
- git add .(.代表所有文件所有文件) git add 文件路径 将文件添加到暂存区
- git commit -m ‘你的提交信息’ 将暂存区的东西提交到版本库中的默认master分支
查看仓库的修改状态
- git status
- git diff 查看具体的状态
如果有修改要提交 就执行git commit -m ‘消息内容’
版本回退
- git log 用来查看历史commit的版本记录
- git log --pretty=online 简略的查看历史版本 只显示出16进制的git id
- git reset --hard HEAD^ 表示回退一个版本,HEAD^^ 回退两个版本以此类推 ,HEAD~100表示回退100个版本
- git reset --hard (commit id) 恢复到指定的版本
- git reflog 可以查看命令历史,以便恢复指定版本。
工作区和暂存区
-
工作区就是我们的电脑里能看到的目录结构
-
工作区里面有个隐藏文件.git 这个是版本库 这里面有很多东西其中有一个叫做stage(暂存区)和git默认创建的master分支这个分支指向HEAD
假如修改文件readme和LICENSE后
提交后
撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
当你误删除了一个文件可以用git checkout – 文件名 找回
当你删除一个文件并且确定要删除它 先删除暂存区的文件然后再次提交
git rm 文件名 => git commit -m ‘你的修改提示信息’
添加远程仓库- 在码云或者GitHub上创建仓库
- 关联远程仓库 git remote add origin https://gitee.com/IT_Ruan/learngit.git
- 将本地的推送到远程库上 git push -u origin master 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从远程克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
创建于合并分支 - 鼓励使用分支进行开发
- 查看分支情况 git branch
- 创建分支 git branch 分支名称
- 切换分支 git checkout 分支名称
- 合并指定分支到当前分支 git merge 指定分支
- 删除指定分支 git branch d 分支名称
解决冲突
如果分支合并产生冲突可以通过 git status查看哪些文件发生冲突 并且通过 git diff 查看冲突的具体情况。手动解决冲突然后再次提交。再次提交后完成合并。
用git log --graph 可以查看分支的合并图。
分支管理策略
- 启用普通模式合并分支 git merge --no-ff -m ‘合并提价的信息’ dev
- 查看提交的分支情况:git log --graph
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并
bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
多分协作
并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
通过远程抓取分支
远程抓取分支一般只有master分支 如果需要在远程添加分支执行以下命令:git checkout -b dev origin/dev
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用git push origin推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
- 查看远程库信息,使用git remote -v;
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
- 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
- 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
创建标签
- 命令 git tag tagname 用于新建一个标签,默认HEAD,也可以指定一个commit id
- 命令 git show tagname 用来展示某个标签的具体信息。
- 命令 git tag -a tagname -m ‘blablaball…’ 可以指定标签信息
- 命令 git tag 可以查看所有标签。
操作标签
命令 git push origin tagname 可以推送一个本地的标签;
命令 git push origin --tags 可以将本地未推送的标签全部推送到远程;
命令 git tag -d tagname 可以删除本地的一个标签
命令 git push origin :refs/tags/tagename 可以删除远程的一个标签;