复习一下,整理到blog来……
Git 简介
Git安装
1 2 3 4 5
| install git 略...
#seting git config --global user.name "Your Name" git config --global user.email "email@example.com"
|
Repository
1 2 3 4
| pwd git init git add <file> git commit -m "message"
|
时光机
1 2
| git status #查看当前仓库状态 git diff #查看difference
|
如果git status
报告有文件被修改过,使用git diff
可以查看修改内容
版本回退
1 2 3 4 5 6 7 8 9 10 11 12 13
| git log #查看commit历史记录 git log --pretty=oneline #输出摘要信息
HEAD表示当前版本 HEAD^ 上一个版本 HEAD^^ 上上一个版本 HEAD~100 上100个版本
git reset --hard HEAD^ #将当前版本回退到上一个版本
取消回退需要知道回退前的版本号 git reflog #记录了每一次命令 git reset --hard commit_id
|
工作区和暂存区
- Workspace
- .git 版本库(包含暂存区stage和自动创建的分支master,以及一个指向master的指针HEAD)
- git add 将文件修改添加到暂存区
- git commit 提交更改,将暂存区的所有内容提交到当前分支
管理修改
- git 跟踪并管理的是修改而非文件
- 每次修改,如果不用
git add
到暂存区,那就不会加入到commit
中。
撤销修改
- case1:丢弃工作区的修改
- case2: 不但改乱了工作去的某文件内容,并添加到了暂存区,想丢弃修改,分两步,第一步用
git reset HEAD <file>
,就回到了case1;第二步按case1操作
- case3:已经提交了不适合的修改到版本库,想要撤销本次提交,参考版本回退,前提是没有推送到远程库。
删除文件
删除文件后,git rm <file>
提交删除到暂存区,并git commit
,文件会从版本库中被删除。
另一种情况是删错了,使用git checkout -- filename
可以用版本库里的版本替换工作区的版本,无论工作去是删除还是修改,都可以从版本库还原。
远程仓库
- 创建SSH密钥
1
| ssh-keygen -t rsa -C "your email@example.com"
|
- 可将公钥添加到github或自己的git服务器
添加远程仓库
- 在远程创建一个仓库
- git remote add origin git@github.com:username/repo.git 关联远程仓库
- git push -u origin master 第一次推送master分支的所有内容
- 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改
从远程仓库克隆
从0开发,最好的方法是先创建远程库,然后从远程库克隆。
1 2 3
| git clone git@github.com:username/repo.git git://使用ssh协议 也可以使用https协议,ssh支持的原生git协议速度最快
|
分支管理
创建与合并分支
1 2 3 4 5
| git checkout -b dev #创建dev分支并切换到dev 相当于 git branch dev git checkout dev git branch 查看当前分支
|
把dev分支的工作成果合并到master分支
1 2 3
| git checkout master #切回master分支 git merge dev #合并dev到当前分支 git branch -d dev #删除dev分支
|
解决冲突
当master分支和dev分支各自都有新的提交,这种情况git无法执行快速合并,必须手动解决冲突后再提交
1 2 3 4 5 6 7
| git status 可以告诉我们冲突的文件 手动修改需要的内容 git add 。。。 git commit git log --graph #可以看到分支的合并情况 git log --graph --pretty=oneline --abbrev-commit 最后删除dev分支
|
分支管理策略
通常合并分支时git尽可能用fast forward,但这种模式下,删除分支后会丢掉分支信息。
合并分支时加上--no-ff
参数就可以进行普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并看不出来曾经做过的合并。
Bug分支
1 2 3 4 5 6 7 8 9 10 11
| git stash 储藏工作区现场 git status 查看,工作区是干净的 假设在master分支上修复bug,就从master创建临时分支 git checkout master git checkout -b issue-101 修改 git add git commit 切换到master分支 git checkout master git merge --no-ff -m "merge bug fix 101" issue-101 删除issue-101分支
|
切回dev分支,git status 工作区是干净的
1 2 3 4 5
| git stash list 查看储存的工作区 git stash apple 恢复,但恢复后stash内容不删除,需要用git stash drop删除 git stash pop 恢复的同时把stash内容也删除了 可多次stash,恢复时先用git stash list查看,然后回复指定的stash git stash apply stash@{0}
|
Feature分支
开发一个新的feature,最好创建一个分支
如果要丢弃一个没有被合并过的分支,可以通过下命令强行删除
多人协作
1 2
| git remote #查看远程库信息 远程仓库默认名称是origin git remote -v
|
推送分支
1 2
| git push origin master git push origin dev
|
抓取分支
1 2
| git pull git branch --set-upstream-to=origin/dev dev #设置dev和origin/dev的链接
|
- 首先可试图用git push origin 推送自己的修改
- 如果推送失败,则因为远程分支比本地更新,需先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或或解决掉冲突后,再用git push推送
- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream-to origin/
Rebase
- git rebase操作可以把本地为push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因此分叉的提交需要三方对比
标签管理
tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起
创建标签
1 2 3 4
| 1. git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id 2. git tag -a <tagname> -m "blablabla"可以制定标签信息 3. git tag 查看标签 4. git show tagname查看标签信息
|
操作标签
1 2 3 4
| git push tagname 可以推送一个本地标签 git push origin --tags 可以推送全部未推送过的本地标签 git tag -d tagname 可以删除一个本地标签 git push origin :refs/tags/tagname 可以删除一个远程标签
|
自定义git
让git显示颜色
1
| git config --global color.ui true
|
忽略特殊文件
配置文件在线浏览
1 2
| git add -f #强行添加文件 git check-ignore #可以检查出哪个规则出错
|
.gitignore文件本身要放到版本库中,并且可以对.gitignore做版本管理
配置别名
1 2
| git config --global alias.co checkout git config --global alias.last 'log -1'
|
配置git时,加–global针对当前用户起作用,不加针对当前仓库起作用
1 2
| .git/config #每个仓库的配置文件 .gitconfig #用户主目录下,当前用户的配置文件
|
搭建git服务器
- Step1:install git
- Step2: 创建一个git用户,用来运行git服务
- Step3: 创建证书登录
1 2
| 收集所有需要登录的用户的公钥,id_rsa.pub,把所有公钥导入到 /home/git/.ssh/authorized_keys文件里,一行一个
|
- Step4: 初始化git仓库
1 2 3 4 5
| sudo git init --bare sample.git 假定在/srv/sample.git --bare创建裸仓库,没有工作区 服务器上的git仓库默认都以.git结尾,然后把owner改为git sudo chown -R git:git sample.git
|
- Step5: 禁用shell登录
1 2 3 4
| 出于安全考虑,step2创建的git用户不允许登录shell 编辑/etc/passwd git:x:1001:1001:,,,:/home/git:/bin/bash改为 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
|
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动推出。
- Step6: 克隆远程仓库
1
| git clone git@server:/srv/sample.git
|
管理公钥,几百人的团队,可以用Gitosis来管理公钥。
权限管理,开源精神哈哈。。。但是git支持hook,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
Git官网