git常用操作(续)
文件的修改、回退、删除等
远程仓库的相关操作
分支管理
标签管理
文件的修改、回退、删除等
创建版本库
GitBash中 cd 到需要作为版本库的目录,执行git init,创建成功后会生成.git文件夹
添加文件到版本库
首先,文件必须放在在版本库对应的目录下,
添加文件到版本库步骤:
git add 文件.文件类型,将文件放进暂存区(暂存区,工作区概念详见第4小节)
git commit -m “本次提交的说明”,添加到版本库
备注:
git status 随时掌握工作状态,提示信息分析:
Changes to be committed: 已进入暂存区,但还未提交到版本库,需要commit
Changes not staged for commit:更改了,但是还未进入暂存区
Untracked files:表示该文件还从来没有被添加进版本库
版本回退
git log 显示从最近到最远的提交日志,git log –pretty=oneline 使每个日志单独成行。
git中,用HEAD表示当前版本
回退到上一个版本:git reset –hard HEAD^,一个“^”表示回退1个版本,“~100”回退100个版本。
返回新版本:git reset –hard 新版本的Id
git reflog查看命令历史,以便确定要回到未来的哪个版本
工作区和暂存区
工作区:在电脑里能看到的目录; 版本库:在工作区有一个隐藏目录.git,是Git的版本库。 Git的版本库中存了很多东西,其中最重要的就是称为stage(或者称为index)的暂存区,还有Git自动创建的master,以及指向master的指针HEAD。
git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别
Git是跟踪修改的,而不是跟踪文件,每次修改,如果不用git add到暂存区,那就不会加入到commit中。
撤消修改
当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file就回到了场景1,第二步按场景1操作。
已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
提交到版本库的文件,可以先 rm file删除文件
确实要从版本库中删除该文件,那就用命令git rm file删掉,并且git commit
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本git checkout – file
备注:git checkout – file就是将版本库的文件替代工作区的文件
删除文件夹
git rm -rf 文件夹名
git add -A
远程仓库的相关操作
在GitHub上添加公钥
创建GitHub账号
创建SSH Key,GitBash执行
ssh-keygen -t rsa -C “youremail@example.com“,在用户主目录(在Bash先后中执行 cd ~/.ssh 、pwd即可找到主目录路径)下检查是否有.ssh目录,里面有id_rsa(私钥)和id_rsa.pub(公钥)两个文件,这两个就是SSH Key的秘钥对。
打开GitHub,在个人主页找到setting,找到SSH and GPG keys,然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
将本地仓库与远程仓库关联
本地仓库为git,在GitHub上同样新建一个仓库为git,此时远程git仓库为空.
创建远程仓库后,在GitBash中,在本地的gitm目录里,执行命令git remote add origin git@github.com:用户名/仓库名.git实现关联
执行git push -u origin master本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程(执行完后在GitHub上就可看到内容)。以后每次本地提交后,使用命令git push origin master推送最新修改
从远程仓库克隆
首先确保远程仓库有需要克隆的仓库,然后cd到本地仓库目录的上一级目录,执行:git clone git@github.com:用户名/仓库名.git,就会发现克隆到本地了。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
分支管理
创建与合并分支
创建分支1 dev: git branch dev;切换至div分支:git checkout dev,一句话:git checkout -b dev
用git branch命令查看当前分支,当前分支前面会标一个*号
合并分支 ,先git checkout master切换到主分支,然后执行git merge dev进行合并。然后可以再执行git branch -d dev删除分支
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
解决分支冲突
当Git无法自动合并分支时2,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log –graph命令可以看到分支合并图。
备注: 进入log后直接按 Q就可以退出。
分支管理策略
合并分支时3,默认采取的为Fast farword模式,这种合并看不到合并历史,但是这种模式下,删除分支会丢掉分支信息。
1.禁用Fast farword模式时,合并分支会产生一个commit, git merge –no-ff -m “merge with no-ff” dev 其中,–no-ff参数,表示禁用Fast forward。
采用git log –graph –pretty=oneline –abbrev-commit查看分支历史。
备注:不用–no-ff,实际上只是将master的指针update成dev分支而已,用的还是dev的commit ID,而使用之后,则是重新commit了一哈,有了新的commit ID
在这里插入图片描述
Bug分支
我个人觉得场景是这样的。设A为游戏软件
master 上面发布的是A的1.0版本
dev 上开发的是A的2.0版本
这时,用户反映 1.0版本存在漏洞,有人利用这个漏洞开外挂
需要从dev切换到master去填这个漏洞,正常必须先提交dev目前的工作,才能切换。
而dev的工作还未完成,不想提交,所以先把dev的工作stash一下git stash。然后切换到master
如果是在master修复bug,就在master建立分支issue101并切换. git checkout -b issue101
在issue101上修复漏洞,并git commit。
修复后,在master上合并issue101 ,git merge –no-ff -m “merged bug fix 101” issue-101
切回dev,git stash list命令看看stash内容,然后git stash pop,恢复的同时把stash内容也删了继续工作。
强制分支删除
发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch -D branchname强行删除。
多人协作
多人协作的工作模式通常是这样
查看远程库信息,使用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的标签就是是版本库的快照,它其实就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
创建标签
切换到需要打标签的分支 ,然后 git tag tagname。
备注:可以用git tag查看所有标签,
可以用git show tagname查看标签信息
标签默认是打在最新的commit上,如果需要打在之前的commit上,可以使用git log –pretty=oneline –abbrev-commit查看commit id,然后用git tag tagname commitId打上就可以了。
创建带有说明的标签,用-a指定标签名,-m指定说明文字,git tag -a tagname -m “tag说明” commitId
操作标签
命令git push origin tagname可以推送一个本地标签到远程;
命令git push origin –tags可以推送全部未推送过的本地标签;
命令git tag -d tagname可以删除一个本地标签;
如果标签已经推送到远程,但又需要删除的话,可以先用命令git push origin :refs/tags/tagname删除一个远程标签,然后再用git tag -d tagname删除本地标签。