Git学习笔记
//配置email地址和名字
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
//把当前目录变为git仓库,建好后会多出一个.git目录
git init
//文件添加,放入暂存区
git add *
//文件提交,提交暂存区的内容;如果最新改动没有add,这个改动不会被commit
git commit -m "comment"
//显示当前提交情况
git status
//查看修改内容,只支持纯文本文件
git diff readme.txt
//查看历史日志
git log --pretty=oneline
//回到上一个版本HEAD^, 上上一个版本HEAD^^, 往上100个版本HEAD~100
git reset --hard HEAD^
//回到指定版本,commit_id只需要写前几位
git reset --hard commit_id
//查看commit_id日志
git reflog
//把该文件的修改全部撤销,回到最近一次commit或add的状态
//没有放入暂存区时,撤销修改就回到和版本库一样的状态
//文件已添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区的状态
git checkout -- readme.txt
//撤销某个文件暂存区的修改
git reset HEAD readme.txt
//删除文件
git rm test.txt
//创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
//关联一个远程库
git remote add origin git@server-name:path/repo-name.git
//关联后推送分支内容
git push -u origin branch-name
//每次本地提交后,推送最新修改
//本地新建的分支如果不推送到远程,对其他人就是不可见的
git push origin branch-name
//如果推送失败,因为远程分支比你的本地更新,需要先抓取远程的最新提交
git pull
//如果git pull提示"no tracking information",则需要建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
//在本地创建和远程分支对应的分支
git checkout -b branch-name origin/branch-name
//查看远程库的信息
git remote -v
//克隆一个git repository
git clone git@server-name:path/repo-name.git
//创建分支
git branch dev
//切换分支
git checkout dev
//创建分支并切换到分支
git checkout -b dev
//查看分支
git branch
git branch -a
//合并指定分支到当前分支
git merge dev
//合并分支时禁用fast forward,从而保留分支信息,创建新的提交
git merge --no-ff -m "merge with no-ff" dev
//删除分支
git branch -d dev
//强行删除一个没有合并的分支,将丢失修改
git branch -D feature1
//查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
//保存现场,这样你可以先做其它事,可以多次保存
git stash
//恢复现场,stash内容并不删除
git stash apply
//可以手动删除stash内容
git stash drop
//恢复现场同时删除stash内容
git stash pop
//查看stash内容
git stash list
//恢复到指定的stash
git stash apply stash@{0}
//创建标签
git tag v1.0
//查看标签
git tag
git show tagname
//创建标签,附带说明
git tag -a v0.1 -m "version 0.1 released" commit_id
//对某个commit_id打上标签
git log --pretty=oneline --abbrev-commit
git tag v0.9 commit_id
//用私钥签名一个标签,采用PGP签名,先要安装gpg
git tag -s v0.2 -m "signed version 0.2 released" commit_id
//删除标签
git tag -d tagname
//推送某个标签到远程
git push origin tagname
//推送全部未推送过的本地标签
git push origin --tags
//要删除远程标签,先从本地删除
git tag -d v0.9
git push origin :refs/tags/v0.9
//让git显示颜色
git config --global color.ui true
//要忽略某些文件,需要编写.gitignore文件并提交该文件
Thumbs.db
*.pyc
*.egg
build
Content/photos/
//配置命令的别名,--global针对当前用户起作用,不加则针对当前仓库
//可以在配置文件.git/config中查看已经添加的别名
//当前用户的git配置文件则在用户目录下的.gitconfig文件中
git config --global alias.st status
git st
//配置命令的别名,把暂存区的修改撤销
git config --global alias.unstage 'reset HEAD'
git unstage test.py
//配置命令的别名,让其显示最后一次提交信息
git config --global alias.last 'log -1'
git last
//搭建git私有服务器
$ sudo apt-get install git
$ sudo adduser git
收集所有需要登录的用户的公钥id_rsa.pub文件,把所有公钥
导入到/home/git/.ssh/authorized_keys文件里,一行一个
选定一个目录作为Git仓库,比如/srv/sample.git,在/srv目录下输入命令:
$ sudo git init --bare sample.git
创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享
服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git sample.git
创建的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每次一登录就自动退出
现在,可以通过git clone命令克隆远程仓库:
$ git clone git@server:/srv/sample.git
要方便管理公钥,用Gitosis
要像SVN那样变态地控制权限,用Gitolite