Git学习笔记(三)

分布式版本控制系统Git学习笔记,建议学习之前先了解一下常见linux命令。
学习教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
参考资料:http://lib.csdn.net/base/git

分支管理

git中由历史提交记录组成的一条时间线叫做一条分支,我们使用git时程序默认给我们建立了一条叫做master的分支,HEAD是指向当前分支当前提交点的指针。通过将HEAD指向不同提交点就能确定当前处于哪个分支,哪个提交点。


Git学习笔记(三)_第1张图片
master分支

一、分支的创建与合并

使用命令git branch <分支名>创建一条分支,使用git checkout <分支名>切换到创建的分支。也可以使用git checkout -b <分支名>创建分支并切换到该分支。
命令git branch可查看所有分支,在当前分支前面会有一个 *

当你使用git checkout <分支名>切换分支后,以后的所有提交都会在这个分支上创建节点。而在此分支上做出的修改是不会影响其他分支的。如果需要将当前分支的修改在其他分支上也体现出来,那么就需要合并分支。

使用git merge <分支名>将目标分支合并到当前分支。分支合并以后,当前分支与目标分支的最新内容就一样了,我们可以删去目标分支,使用git branch -d <分支名>
如果某个分支的开发被取消了,也就是无需再将之合并到更高层的分支中去,此时需要强制删除分支,使用参数-D,命令git branch -D <分支名>强制删除分支。

假如我们的新分支与原来的分支都有提交,那么git会尝试将两个分支的修改合并,如果修改有冲突,则会提示你某个文件存在冲突,需要手动作出合并。此时打开有冲突的文件就能够看到git将两个分支中冲突的修改标记出来了。你需要解决冲突然后重新提交。这样就合并完成了。
使用命令git log --graph --pretty=oneline --abbrev-commit可以直观的看到提交的图示。

Git学习笔记(三)_第2张图片
图示提交记录

合并分支时,git通常会使用Fast forward模式,此模式下合并后删除分支将会丢失分支的记录(也就是分支提交被融入到合并的分支里了)。如果要保留分支的记录,则在合并分支时使用 --no-ff参数,使用此参数会在合并时创建又一次新的提交,所以需要加上提交信息,最终命令

git merge --no-ff -m "<提交信息>" <目标分支>
Git学习笔记(三)_第3张图片
没用no-ff

Git学习笔记(三)_第4张图片
用了no-ff

二、开发中常用分支

  1. master分支是仓库默认为我们建立的一个主分支,通常用来发布新版本,应该保持稳定。
  2. dev分支是用于工作的分支,参与工作的人需要从上面创建自己的分支进行工作,并时不时向dev分支上合并修改内容即可。
  3. BUG分支用于临时解决某些突发BUG。
  4. Feature分支用于开发某一新的功能。
Git学习笔记(三)_第5张图片
通常就是这样

三、暂存工作现场

有时候我们在某个工作进行到一半时时,临时需要去完成一项更加紧迫的工作,但是原来的工作还没做完,不适合提交,就可以将当前工作现场进行暂存,然后再建立新的分支去完成这项紧急任务,任务结束后再将工作现场恢复继续之前的工作。
暂存工作现场的命令:git stash
查看存储的工作现场:git stash list
恢复工作现场:git stash apply <工作现场编号>
恢复最近的工作现场并删除记录:git stash pop
删除记录的工作现场:git stash drop <工作现场编号>

四、多人协作

前面说了,我们通常git仓库置于远程服务器上,然后协作者克隆到本地进行工作,完成工作以后再将本地修改推送到远程仓库。
查看远程仓库信息:git remote。加参数-v显示详细信息
推送分支:git push <远程仓库名称> <本地分支>
通常我们需要把master分支和dev分支推送到远程,供队友协作。
将本地分支与远程分支关联:git branch --set-upstream <本地分支名> <远程仓库名称>/<远程分支>
克隆远程库:git clone <远程仓库地址>
注意:克隆过来的远程库默认只有master分支,本地需要自己创建一个dev开发分支进行工作。

有时候远程分支的内容会比本地分支的内容新,这有可能会导致你的推送失败,这时需要使用命令git pull抓取远程分支的新提交,本地合并解决冲突再推送。

五、标签

一般来说,commit自动生成的版本号并不好记,不便于使用,所以git引入了标签(tag),标签是指向某个版本的快照,固定的指向某个commit。
使用命令git tag [版本号]为当前分支某节点打上标签,缺省版本号参数则为当前分支当前节点打标签。
使用命令git tag -a -m "说明文字" [版本号]创建带说明的标签。
使用git tag查看所有标签。
使用git show 可查看标签的详细信息。

不小心打错标签的话,使用git tag -d 删除。
将标签推送到远程库使用git push <远程库名称>
或者将全部标签推送到远程git push <远程库名称> --tags
删除远程库的标签:先删除本地标签,然后使用git push <远程库名称>:refs/tags/<标签名>

自定义git

一、忽略特殊文件

有些文件我们并不想把它添加到版本库中,比如系统生成的配置文件,存放口令的配置文件,编译生成的文件。此时需要创建一个.gitignore文件,并将过滤规则写在其中。
比如:

#windows 注释说明
Thumbs.db  #忽略文件
Desktop.ini

#Java
*.class

#my config 
db.ini

Github为我们提供了各种模板,参考https://github.com/github/gitignore

做好配置文件以后我们将.gitignore添加到库再推送到远程库即可。
使用git add -f <文件名>强制添加到git。
使用git check-ignore -v <文件名>检查哪条过滤规则过滤了该文件。

二、偷个懒,简化命令

使用

git config [--global] alias.<别名> <命令>

简化命令,比如使用git config --global alias.st status后,就可以使用简化后的,命令git st查看库状态了。
还有常用的其它简写:

co -- checkout
ci -- commit
br -- branch

另外一些简写配置:

$git config --global alias.unstage 'reset Head'
这样就能使用 git unstage 撤销暂存区修改了

$git config --global alias.last 'log -l'
使用 git last查看最近一次提交

如何删除简写呢,前面说过--global参数是全局设置,对当前用户在本机器上创建的所有库通用,我们可以在用户主目录下找到.gitconfig文件(通常在C:\User\用户名\路径下),删除[alias]下对应的项目即可。
如果你没有用--global参数,则在当前仓库的.git目录下找config文件执行上述操作。

你可能感兴趣的:(Git学习笔记(三))