廖雪峰Git学习笔记(下)

(三)分支管理

其他VCS如SVN等都有分支管理,但其创建和切换分支很慢,远不如Git。

git中HEAD严格说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支
例如:创建新的分支时git新建了一个指针,假设为dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。

若在dev上的工作完成了,便可把dev合并到master上。最简单的合并方法就是直接把master指向dev 的当前提交。合并后,若dev分支没用了便可删除了。

1. 创建与合并分支

git checkout -b dev 创建并切换到dev分支
或先创建git branch dev,再切换git checkout dev

git branch 查看当前分支(当前分支前标有一个*号)

git merge name 合并指定分支(名为name)到当前分支

合并时出现的“Fast-forward”是指此次合并是“快进模式”,即直接把所在分支指向指定分支的当前提交,所以合并速度很快。但并非每次都能Fast-forward,还有其他方式的合并。

git branch -d name 删除名为name的分支

关于switch:

切换到名为name的分支:
git checkout namegit switch name

git switch -c name 创建并切换到新的name分支

Git 切换分支时会把未add或未提交的内容带过去。因为未add或未提交的内容不属于任何一个分支,即对于所有分支而言,工作区和暂存区是公共的。
可用git stash暂存现场,以避免分支间切换时的影响。

2. 解决冲突

当同一个文件的内容在两个分支中不同时,两个分支各自分别有新的提交
因此,git无法执行“快速合并”,只能试图把各自的修改合并,但这种合并可能会用冲突。

git status可告诉我们冲突的文件。

无法自动合并分支时必须手动解决冲突后再提交。
解决冲突就是把git合并失败的内容手动编辑为我们希望的内容再提交。

冲突解决后
git log --graph --pretty=oneline --abbrev-commit 查看图形化的分支合并情况

3. 分支管理策略

合并分支时,git会优先使用“Fast forward”模式,但此模式下删除分支后会丢掉分支信息。

git merge --no-ff -m “描述信息” name 普通模式合并指定分支name到当前分支

加上–no-ff参数强制禁用该模式,这种合并保留了指定分支name的进度,git也会在merge时生成一个新的commit,这样就可用git log从分支历史上看出分支信息。

分支策略:
1)master分支应是稳定的,即仅用来发布新版本,平时不能在上面干活;
2)干活都在另一分支(如dev分支)上,即dev分支是不稳定的。要发布新版本时再把dev合并到master上,在master上发布新版本。

4. Bug分支

在你需要创建一个分支来修复bug,而你在dev上进行了一半的工作还无法提交时,可以用git stash暂存现场,等之后恢复现场后继续工作。
此时用git status查看工作区,就是干净的(除非有未被Git管理的文件),因此可以放心地创建分支来修复bug。

步骤:
1)确定在哪个分支修复bug,从该分支创建临时分支(假定要再master分支上修复)

2)在临时分支上修复bug并提交。

3)完成后切换到master分支并合并,最后删除临时分支。

Bug修复后,切换到dev分支,由于dev是早期从master中分出来的,此时dev上此bug还存在。
接下来先还原刚刚的工作现场,再修复dev上的bug。

还原现场:
git status查看时工作区是干净的,用git stash list 查看会发现工作现场还在。

恢复暂存现场有两种方法:
① 先 git stash apply 恢复(恢复后stash内容并不删除)

或用git stash apply stash@{1}   恢复指定的stash如stash@{1}(默认使用最近的,即stash@{0})

git stash drop删除暂存内容
git stash pop 恢复地同时也删除了stash内容

git stash不能将未被追踪的文件(untracked file)压栈,也就是从未被git add过的文件,在git stash之前一定要用git status确认没有Untracked files。

修复bug:
要在dev上修复同样的bug,只需把之前修复bug的那次提交(459ae65)所做的修改复制到dev(不是把整个master分支merge过来)。

在dev分支上git cherry-pick 459ae65 ,Git自动为dev做一次提交但这次的commit id不同于master 的那次。

5. Feature分支

为了不影响主分支,在开发新功能时,新建一个feature分支,在上面开发,完成后合并、再删除该分支。

git branch -d feature 删除分支
若此新建分支未合并就执行此命令,需要git branch -D feature强行删除。

6. 多人协作

git remotegit remote -v 查看远程库(默认名称是origin)信息
(后者查看的信息更详细,显示了抓取和推送的origin地址。若无推送权限,就看不到push地址)

git remote rm origin 删除指定地远程库

git push origin --delete name 删除远程name分支

推送分支:

git push origin name 推送指定本地分支name到远程库对应的远程分支

本地分支并不一定都要把往远程推送:
master分支是主分支,要时刻与远程同步;
dev分支是开发分支,每个成员都要在上面工作,也要与远程同步;
而bug分支只用于在本地修复bug,不必推到远程;
feature分支是否推到远程取决于你们是否合作在上面开发。

抓取分支:

多人协作时,甲可在另一台电脑(要把SSH Key添加到Github)或同一台电脑另一个目录克隆你的master分支:
git clone git@github.com:username/RepositoryName.git 克隆远程库到本地

默认情况下甲只能看到本地的master分支。

若甲要在dev分支上开发,就必须创建远程origin的dev分支到本地:
git checkout -b dev origin/dev 创建本地dev分支

然后他就可以在dev上继续修改并提交,时不时地把dev分支push到远程。

甲已经向origin/dev分支推送了他的提交,若恰巧你对同一文件做了修改并试图推送,此时若出现冲突:

git branch --set-upstream-to=origin/dev dev 设置本地dev分支与远程origin/dev分支的链接
git pull 把最新提交从origin/dev抓下来,在本地合并后再推送。

7. Rebase

git rebase 把本地未推送的分叉提交历史“整理“成直线

优点:看上去更直观
缺点:本地的分支提交已经被修改

(四)标签管理

Git的tag其实就是指向某个commit的指针(与分支相似,但分支可移动而tag不能动),它总是和某个commit挂钩,创建和删除tag都很快。

1. 创建标签

(先切换到需要打tag的分支上)
git tag name 创建标签(默认是打在最新提交的commit上,即HEAD)

git tag name commit_id 在指定commit id上打标签

git tag -a tagname -m “提示说明” commit_id 创建附带说明的标签

git log --pretty=oneline --abbrev-commit 查找历史提交的commit id(前7位即可)

git tag 查看所有标签(标签是按照tag的版本顺序排列,并非tag的时间顺序)

git show tagname 查看某标签信息(tagname为标签名)

注意:若被标记的commit既出现在master,又出现在dev,则这两个分支上都可看到这个标签。

2. 操作标签

git push origin tagname 推送某标签到远程

git push origin --tags 一次性推送全部未推送到远程的本地标签

git tag -d tagname 删除本地某标签
(创建的标签只存储在本地,不会自动推送到远程,所以打错的标签可在本地安全删除)

git push origin :refs/tags/tagname 删除远程某标签
(删除已推送tag时先删除本地,再删除远程,完成后可登录GitHub从远程库查看是否已经删除)

git fetch origin tag tagname 获取远程某标签(远程存在而本地不存在)

(五)使用Gitee

git remote add remotename git@gittee.com:username/repository.git
关联gitee的remotename远程库的repository仓库

一个本地库可关联多个远程库,但要用不同名称来标识不同的远程库

git remote -v 查看远程库信息

git remote rm remotename 删除远程库(名为remotename)

git push remotename branch 推送本地branch分支到远程库remotename

(六)自定义Git

配置git显示颜色或字体:

git config --global color.ui true 启用默认颜色设置

git config --global color.ui false 关闭默认颜色设置

也可针对具体命令进行设置,如color.branch ,color.diff等。

字体可用ui ,bold等。

1. 忽略特殊文件

编写.gitignore文件,将要忽略的文件放入.gitignore文件中,git就会自动忽略它们。

.gitignore文件本身要放到版本库里,并且可对它做版本管理。

忽略文件的原则:
1) 忽略OS自动生成的文件,如缩略图等;
2) 忽略编译生成的中间文件、可执行文件等(即通过一个文件自动生成的其他文件);
3) 忽略自己的带有敏感信息的配置文件,如存放口令的配置文件。

git check-ignore -v filename 检查.gitignore文件书写是否有误

如:.gitignore文件期望忽略.class文件
对App.class执行该命令,若无输出,说明.gitignore没写对;若输出.gitignore:2*.class App.class,则设置正确。

2. 配置别名

git config --global alias.<简写名> <命令名> 简化命令名

git config --global --unset alias.<简写名> 删除别名

如: git log -1 显示最后一次提交信息
git config --global alias.last ‘log -1’ 之后,执行git last即可显示最后一次的提交

–global参数是全局参数,即这个命令在这台电脑的所有Git仓库下均有用,若不加此参数,只针对当前仓库起作用

配置文件:

每个仓库 的git配置文件都放在.git/config文件中,可用cat .git/config查看其内容。
( 配置的别名就在[alias]后面,要删除别名,直接把对应的行删掉即可,也可用git config --global --unset alias.<简写名>

当前用户 的git配置文件放在用户主目录(C:/users/计算机名)下的隐藏文件.gitconfig中。配置别名也可直接修改这个文件,若改错了,可以删掉文件重新通过命令配置。

注意:查看用户配置信息可用 git config --global --list
查看当前仓库配置git config --local --list

用户的global配置在用户主目录下的.gitcongig文件中,仓库的.git/config只存当前仓库的本地配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值