接着上次分布式版本控制系统——Git(上)继续学习Git啦。多一些刻意的练习,就会多掌握一份技能。ヾ(◍°∇°◍)ノ゙
创建dev 分支,然后切换到dev分支
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout 命令加上-b参数表示创建并切换
,相等于以下两条命令:
$ git branch dev
$ git checkout dev
使用git branch
命令查看所有分支,当前分支前面会标一个*号:
$ git branch
* dev
master
然后,就可以在dev分支上正常提交了,git add
,git commit -m
提交完成,分支工作结束之后,切换回master
分支:
$ git checkout master
Switched to branch 'master'
将dev分支的提交合并到master
上 :
#参数--no-ff:表示禁用Fast forward,可以看出曾经做过合并,
$ git merge [--no-ff -m "message"] dev
git merge
命令用于合并指定分支到当前分支,关于合并模式
合并完成,可以删除dev分支了
# git branch -D [branch] 强行删除
$ git branch -d dev
Deleted branch dev (was 3ba40f4).
git switch [-c] master
切换分支,-c:创建并切换到新的分支。
需要解决冲突即Git无法自动合并分支时,首先需要解决冲突:git status
查看产生冲突的文件,查看文件内容,Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。手动解决完冲突之后,再进行提交
#用带参数的git log --graph查看分支的合并图,若不加--graph的话,只会出现commit信息
$ git log --graph --pretty=online --abbrev-commit
场景:若当前正在工作的分支为dev(未完成),突然来了一个紧急代号为101的bug,需要创建一个临时分支issue-101
进行修改。
保存当前所在dev分支的工作
#将当前工作中的分支储藏起来,等以后恢复继续工作
$ git stash
# git status查看工作区,干净,放心修改bug
需要确定在哪个分支上修复bug,转到该分支之后,建立临时分支[例如bug在master分支上]
$ git checkout master
$ git checkout -b issue-101
#接下来,进行修复工作,add,commit,修复完成
#切换到master分支
$ git switch master
#完成合并
$ git merge --no-ff -m "message" issue-101
#删除临时分支
git branch -d issue-101
恢复dev分支
$ git switch dev
# 查看之前工作现场保存到何处了
$ git stash list
# 恢复现场
#1.恢复后,stash内容并不会删除,stash@{0}-删除指定的stash,是由git stash list获得
$ git stash apply [stash@{0}]
#需要删除stash内容
$ git stash drop
#2.恢复的同时把stash内容也删除了
$ git stash pop
若该bug也在dev分支中存在,该如何修复呢
#将issue101提交的修改复制到dev分支上即可
$ git cherry-pick <commit id>
$ git push <远程库的名字,默认是origin> <所要推送的branch>
向bug这种分支就不需要进行推送,自己本地用就可以。
小伙伴clone下远程库,默认只能看到本地的master分支,要想在dev分支上开发,就必须创建远程origin的dev分支到本地
$ git checkout -b dev origin/dev
此时小伙伴就能在dev分支上工作了,若多人产生推送冲突
#先把最新的提交从origin/dev抓下来,然后本地合并,解决冲突,再推送
$ git pull
#若提示no tracking information表示没有指定本地dev分支与远程origin/dev分支的链接,执行
$ git branch --set-upstream-to=origin/dev dev
#再次git pull之后,若产生冲突,查看解决冲突部分
发布一个版本时,通常先在版本库中打一个标签(tag)实际上就是指向某个commit的指针,但标签不可以移动。若commit出现在多个分支上,那么这几个分支均可以看到这个标签。
默认标签是打在最新提交的coomit上的;查看标签的时候,是按照字母排序的。
#切换到需要打标签的分支上,执行
$ git tag v1.0
#向某个指定commit上打标签
$ git tag <tagname> <commit id>
#创建带有说明的标签
$ git tag -a <tagname> -m "message" <commit id>
操作标签
#创建的标签只存在本地,不会自动推送到远程,打错的标签可在本地安全删除
$ git tag -d <tagname>
#推送某个标签到远程
$ git push origin <tagname>
#一次性推送所有尚未推送到远程的标签
$ git push origin --tags
#若标签推送至远程库,要想删除远程标签
#1.先从本地删除
#2.再从远程删除
$ git push origin :refs/tags/<tagname>
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把妖忽略的文件名填进去
,Git就会自动忽略这些文件。忽略文件的原则是:
.class
文件;$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
# git reset HEAD file:将暂存区的修改撤销掉,重新放回工作区
$ git config --global alias.unstage 'reset HEAD'
#显示最后一次提交信息
$ git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
执行git lg
有点炫酷哈,没有实操,直接截的图,O(∩_∩)O哈哈~真够懒的 ,o(╥﹏╥)o
每个仓库
的Git配置文件都放在.git/config文件中;当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig文件中。修改和删除别名可以直接在配置文件中进行修改。
准备一台Linux机器,推荐使用Ubuntu或Debian,通过apt进行安装。
使用的账号要有sudo权限
#1.安装git
$ sudo apt-get install git
#2.创建一个git用户,运行git服务
$ sudo adduser git
#3.创建证书登录,将所有需要登录的用户的公钥(id_rsa.pub)导入/home/git/.ssh/authorized_keys文件里,每行一个
#4.初始化Git仓库;选定一个目录为Git仓库/sample/rep.git,在/sample目录下输入
$ sudo git init --bare rep.git
# 这个仓库不让用户登录到服务器去改工作区,并且服务器上的Git仓库通常都是以.git结尾的
#修改owner
$ sudo chown -R git:git rep.git
#5.禁用shell登录,编辑/etc/passwd文件
#6.clone远程仓库
管理公钥、权限的工具=》Gitolite
GUI工具=》SourceTree