前言: 最近在实习,写文章的频率下来了很多,开几篇文章写写在实习中学到的东西吧。
一、Git的使用
git的主要功能
-
版本控制:想要记录历史版本以备可能会需要回溯到某个版本的可能,避免手动为每一个历史版本做一个副本,git会帮助你记录历史版本。
-
合作开发:可以同时多个人分别自己开发,最后能合到一起。
-
分布式?:每个人都有完整的版本库,同时开发的人可以互相推送分支然后合并成新版本(实际似乎不是这样)。
git的基本概念
git仓库
开始使用git需要在要管理的目录下初始化一个git仓库。
git init #初始化git仓库
会在当前目录下自动生成.git文件夹(里面的内容以后在了解),记录历史版本、提交、分支、用户配置等。
工作区、暂存区和版本库
-
工作区:正在修改的,尚未加入暂存区的文件在工作区。
-
暂存区:准备提交到版本库的文件存在暂存区。
-
版本库:当所有工作区的修改都进入暂存区,commit提交后成为一个版本。
git add foo #将文件foo加入暂存区git status #查看工作目录状态git commit -m "desc" #将暂存区文件提交并附上描述
有了上面三个概念就有了版本控制。
工作区的修改可以从暂存区或版本库中的记录恢复,也可以加入暂存区。
git checkout -- foo #将工作区的foo修改作废,恢复至暂存区或版本库中的版本
暂存区的文件可以恢复到工作区也可以回退成版本库中的版本。
git reset HEAD foo #将HEAD指针所指向版本库中的foo文件恢复到暂存区。该操作影响暂存区,不影响工作区内容。
也可以使工作区回到指定版本。
git reset --hard HEAD^ #工作区恢复到HEAD的前一个提交,工作区的修改全部丢失。
分支
在一个commit之后像树分叉一样两个分支独立生长。 开发者可以拥有自己的工作分支,随时提交到自己的分支而不影响主分支。开发完成后再进行合并,解决冲突(如果你的分支和主分支上同时修改了相同的文件)后,主分支上也有你的工作了。
以下流水账。
基本操作
创建版本库
** git init ** git add some.file $ git commit -m "description"
版本回退
** git status ** git reflog $ git reset --hard commit_id
撤销修改
从工作区撤销修改
$ git checkout -- filename
可以撤销工作区文件的修改,回退到暂存区,如果未进入暂存区,则回退到版本库。如果被追踪的文件被删除同样可以找回。
从暂存区撤销修改
$ git reset HEAD filename
所有撤销修改仅限于影响被追踪的文件
删除文件
让git不再记录文件,使用
$ git rm filename
文件将从版本库中删除。
远程仓库
关联远程仓库和从远程克隆
** git remote add origin git@server-name:path/repo-name.git ** git clone git@github.com:foo/bar.git
分支管理
一个分支是一串提交串成的时间线。分支可以从某个点分化成不同分支各自发展。不同的分支间可以合并。
创建、切换与合并
** git branch name ** git checkout name ** git checkout -b name ** git merge name $ git branch -d name
-
merge分支可能会产生冲突,需手动解决。
-
更重要的是生产环境中一般不允许merge,而是提交pull request。
-
问题:fast-forward模式是如何丢失分支信息的
保存现场
$ git stash
可以将工作区和暂存区的修改保存起来,此时可以切换分支进行开发。切换回来想恢复现场,则使用
$ git pop
更多stash
** git stash list ** git stash apply $ git stash drop
feature分支
通常在开发新特性时都会用到。命名以feature开头。强制删除分支的命令是
$ git branch -D name
fork 和 pull request
-
GitHub类网站的一个功能。想向别人的项目提交代码却没有权限,可以先fork别人的代码,自己修改并提交,然后向项目管理者发起pull request,申请把你的代码合并到他的分支里。
-
生产过程中也需要用pull request而不是merge来提交代码。
自定义git
颜色、name和email
** git config --global color.ui true ** git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
.gitignore
忽略掉不想track的文件如密码配置等,使其不在git status时提示。GitHub上推荐的各种工程.gitignore文件
规则
新加入的规则不会忽视已经track的文件,status仍会提示,此时应untrack这些文件。
** git rm -r --cached . ** git add . $ git commit -m 'update .gitignore'
设置别名
设置alias可以让使用更方便。
** git config --global alias.co checkout ** git config --global alias.ci commit $ git config --global alias.br branch
那如何取消设置呢
config文件
仓库的配置
每个仓库的.git/config
用户的配置
~/.gitconfig
问题
git是支持分布式的,但现实中似乎还是使用了一个中心服务器。开发时先pull下来再开新分支开发然后push,所以比SVN好在哪。(commit是本地的,push和pull时需要网络;SVN可以修改文件但没网不能提交)
为什么要有暂存区,如果只是好看可以修改完然后提交所有。
分支好难说。
merge的fast-forward方式和noff方式对分支合并前后的影响。
.git文件夹下的内容。
网友评论