GIT篇
目录
1. 分布式与集中式管理
(1) 集中式管理控制:版本库是集中存放在中央服务器,做代码处理的时候都是在自己的个人电脑上,处理完代码之后再提交给中央服务器。
集中式版本控制管理主要的毛病是必须联网,在局域网上传和下载还可以接受,如果在互联网上就存在网速很慢的问题。
(2) 分布式管理控制:分布式版本系统控制通常有一台充当中央服务器的电脑,作用是方便交换不同电脑之间的修改,当然没有这个中央服务器,不同的电脑仍然可以工作。
(3) 创建版本库与初始化git的配置
初始化git配置:
git config --global user.email [email protected]
git config --global user.name "Your Name"
在提交的时候,需要设置全局配置,包括邮件和用户名
(a) 创建一个空目录
$ mkdir learngit
(b) 目录变成Git可以管理的仓库
$ git init
第一步:用命令git add,把文件添加到仓库
$ git add readme.txt
第二步:用命令git commit,把文件提交到仓库
$ git commit -m ‘wrote a readme file’
其中,-m后面输入的是本次提交的说明
2. 时光穿梭
2.1 版本回退
(1) 文档readme.txt修改其中的内容,通过git status可以时刻掌握仓库当前的状态。如下图所示:
(2) 查看文档最近到最远的提交日志,使用命令:git log,如果嫌显示内容比较多,可以采用命令git log –pretty=oneline
(3) 在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写成HEAD~100,回退上一个版本的命令
git reset --hard HEAD^
也可以根据commit id来回退版本,相关命令为git reset --hard commit_id
(4) 如果回退版本之后,想重新穿梭到最新的版本,可以通过命令git reflog查询历史命令,再通过git reset --hard commit_id完成操作
2.2 工作区与暂存区
(1) 版本库
其中stage为暂存区,git创建的一个分支master,以及指向master的指针HEAD
(2) 添加工作区到暂存区(stage)
(3) 通过git add把工作区添加到暂存区,然后通过git commit把暂存区提交到分支
2.3 管理修改
(1) 第一次修改àgit addà第二次修改àgit commit,这样的操作过程只能提交第一次修改过程到分支,不能提交第二次的修改
(2) 第一次修改àgit addà第二次修改àgit addàgit commit
通过命令git diff HEAD – readme.txt查看工作区与版本库的区别
2.4 撤销修改
(1) 通过命令git checkout -- file可以丢弃工作区的修改
通过该命令对file文件在工作区的修改全部撤销,存在两种情况:
a. 修改后还没有被放到暂存区,撤销修改就回到版本库时的状态
b. 修改添加到暂存区后,又对文件作了修改,撤销修改就回到添加到暂存区后的状态
其中,git checkout -- file命令中的--很重要,如果没有--,就变成了切换到另一个分支。
(2) 用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset命令既可以回退版本,也可以把暂存区的修改回退工作区
回退版本的命令:git reset --hard HEAD^ 或 git reset --hard commit_id
(3) 如果修改添加到暂存区,则先通过git reset HEAD <file>撤销到工作区,然后通过git checkout -- <file>撤销修改
2.5 删除文件
如果把工作区的文件提交到暂存区后,手动删除文件,存在两种操作:误删或需删除文件
若是误删,则用命令git checkout -- <file>恢复
若需要删除文件,则git rm <file>删除,然后提交git commit
3. 远程仓库
Git仓库和GitHub仓库之间的传输是通过SSH加密,关联远程仓库需要以下步骤的设置:
(1) 创建SSH Key,会在.ssh目录下存在id_rsa和id_rsa.pub两个文件:
ssh-keygen -t rsa -C ‘[email protected]’
其中id_rsa是私钥,id_rsa.pub是公钥
(2) 登录GitHub,打开Settings中的SSH and GPG keys,添加id_rsa.pub的内容到SSH keys中
3.1 添加远程库
(1) 关联本地仓库到远程仓库
git remote add origin [email protected]:github_username/learngit.git
其中远程库的名字是origin
(2) 本地仓库所有内容推送到远程上
git push -u origin master (第一次推送)
每次本地提交后,使用git push origin master推送最新修改
3.2 远程仓库克隆
远程仓库的克隆
git clone [email protected]:github_username/repository_name.git
4. 分支管理
4.1 创建与合并分支
(1) 创建dev分支,并切换到dev分支:
git checkout -b dev
其中-b参数表示创建并切换,相当于以下两条命令:
git branch dev
git checkout dev
(2) 通过命令git branch列出所有分支,当前分支会标一个*号
(3) 分支的合并操作
通过命令git merge dev,合并master到dev中。git merge命令用于合并指定分支到当前分支
(4) 合并后可以删除dev分支,命令git branch -d dev
4.2 冲突解决
(1) master和创建的分支都有提交,如图所示
(2) Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
(3) 对合并的结果提交
git add <file>
git commit -m ‘conflict fixed’
(4) git log --graph --pretty=oneline --abbrev-commit查看分支的合并情况
4.3 分支管理策略
如果禁用Fast forward,需要添加参--no-ff
命令为git merge --no-ff -m ‘message’ dev
合并之后通过命令git log --graph --pretty=oneline --abbrev-commit查询
团队合作中的分支合并情况
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
4.4 BUG分支
Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作,通过命令git stash储藏起来,然后在其他分支上工作,最后通过git checkout name切换到储藏的分支。
(1) 通过命令git stash list查看储藏的工作区存放在哪里
(2) Git把stash内容存在某个地方,需要恢复有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容并删除
4.5 Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
4.6 多人协作
(1) 查看远程远程库的信息,命令为git remote
(2) 用git remote -v显示更详细的信息,上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址
(3) 推送分支,通过命令git push origin master
4.7 Rebase
Rebase操作的特点:把交叉的提交历史整理成一条直线,看上去更加的直观。缺点是本地分叉提交已经被修改。
Rebase操作可以把本地未push的分叉提交历史整理成直线。
Rebase的目的是使得查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
5. 标签管理
发布版本时,通常为版本库打标签(tag),也就确定打标签版本,标签设计版本库的快照。标签与分支都是指针形式存在,但分支可以移动,标签不能移动。
5.1 标签创建
(1) 查看所有版本的标签
git tag
(2) 创建标签,首先通过命令git checkout u_branch切换到指定的分支,然后通过git tag 版本号。即
git checkout u_branch
git tag v1.0
(3) 对指定commit id添加标签
git tag v1.0 commit_id
(4) 查看标签的信息
git show <tagname>
(5) 创建带有说明的标签,-a指定标签名,-m指定说明文字
git tag -a v1.0 -m ‘<description>’ commit_id
5.2 标签操作
(1) 删除标签
git tag -d <tagname>
(2) 标签只存储在本地,不会自动推送到远程。如果想把标签推送到远程,则
git push origin <tagname>
或者一次性推送全部本地标签
git push origin --tags
(3) 删除远程标签,先删除本地,在远程
git tag -d <tagname>
git push origin :refs/tags/<tagname>
6. Git自定义
6.1 Git特殊文件的忽略
添加.gitignore文件,在文件中指定需要忽略的文件名或类型。
如果想提交忽略的文件,可以强制提交
git add -f <ignore_file>
6.2 Git服务器搭建
(1) 在Linux服务器上安装Git服务。
(2) 创建证书登录:收集所有用户的公钥,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,用户的公钥文件为id_rsa.pub。
(3) 选择目录作为Git仓库,初始化一个裸仓库
git init --bare sample.git
(4) 然后就可以通过以下命令:
git clone git@server:/<git_content>/sample.git