0%

git-tips

复习一下,整理到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:丢弃工作区的修改
    1
    git checkout -- file
  • 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
git branch -D <name>

多人协作

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服务
    1
    sudo adduser 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官网