记录一些常用的 Git 命令,太容易忘了。。。

配置email地址和名字

1
2
git config --global user.name "Your Name"
git config --global user.email "email@example.com"

把当前目录变为git仓库,建好后会多出一个.git目录

1
git init

文件添加,放入暂存区

1
2
git add fileName
git add .

文件提交,提交暂存区的内容;如果最新改动没有add,这个改动不会被commit

1
git commit -m "comment"

显示当前提交情况

1
git status

查看修改内容,只支持纯文本文件

1
git diff readme.txt

查看历史日志

1
git log --pretty=oneline

回到上一个版本HEAD^, 上上一个版本HEAD^^, 往上100个版本HEAD~100

1
git reset --hard HEAD^

回到指定版本,commit_id只需要写前几位

1
git reset --hard commit_id

查看commit_id日志

1
git reflog

把该文件的修改全部撤销,回到最近一次commit或add的状态。没有放入暂存区时,撤销修改就回到和版本库一样的状态。文件已添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区的状态。

1
git checkout -- readme.txt

撤销某个文件暂存区的修改

1
git reset HEAD readme.txt

删除文件

1
git rm test.txt

创建SSH Key

1
ssh-keygen -t rsa -C "youremail@example.com"

关联一个远程库

1
git remote add origin git@server-name:path/repo-name.git

关联后推送分支内容

1
git push -u origin branch-name

每次本地提交后,推送最新修改。本地新建的分支如果不推送到远程,对其他人就是不可见的。

1
git push origin branch-name

强制推送。需要回滚的时候,可能需要强制推送。

1
git push -f

如果推送失败,因为远程分支比你的本地更新,需要先抓取远程的最新提交

1
git pull

如果git pull提示"no tracking information",则需要建立本地分支和远程分支的关联

1
git branch --set-upstream branch-name origin/branch-name

在本地创建和远程分支对应的分支

1
git checkout -b branch-name origin/branch-name

查看远程库的信息

1
git remote -v

克隆一个git repository

1
git clone git@server-name:path/repo-name.git

创建分支

1
git branch dev

切换分支

1
git checkout dev

创建分支并切换到分支

1
git checkout -b dev

查看分支

1
2
git branch
git branch -a

合并指定分支到当前分支

1
git merge dev

合并分支时禁用fast forward,从而保留分支信息,创建新的提交

1
git merge --no-ff -m "merge with no-ff" dev

删除分支

1
git branch -d dev

强行删除一个没有合并的分支,将丢失修改

1
git branch -D feature1

查看分支合并情况

1
git log --graph --pretty=oneline --abbrev-commit

保存现场,这样你可以先做其它事,可以多次保存

1
git stash

恢复现场,stash内容并不删除

1
git stash apply

可以手动删除stash内容

1
git stash drop

恢复现场同时删除stash内容

1
git stash pop

查看stash内容

1
git stash list

恢复到指定的stash

1
git stash apply stash@{0}

创建标签

1
git tag v1.0

查看标签

1
2
git tag
git show tagname

创建标签,附带说明

1
git tag -a v0.1 -m "version 0.1 released" commit_id

对某个commit_id打上标签

1
2
git log --pretty=oneline --abbrev-commit
git tag v0.9 commit_id

用私钥签名一个标签,采用PGP签名,先要安装gpg

1
git tag -s v0.2 -m "signed version 0.2 released" commit_id

删除标签

1
git tag -d tagname

推送某个标签到远程

1
git push origin tagname

推送全部未推送过的本地标签

1
git push origin --tags

要删除远程标签,先从本地删除

1
2
git tag -d v0.9
git push origin :refs/tags/v0.9

让git显示颜色

1
git config --global color.ui true

要忽略某些文件,需要编写.gitignore文件并提交该文件

1
2
3
4
5
Thumbs.db
*.pyc
*.egg
build
Content/photos/

配置命令的别名,–global针对当前用户起作用,不加则针对当前仓库。 可以在配置文件.git/config中查看已经添加的别名。 当前用户的git配置文件则在用户目录下的.gitconfig文件中。

1
2
git config --global alias.st status
git st

配置命令的别名,把暂存区的修改撤销

1
2
git config --global alias.unstage 'reset HEAD'
git unstage test.py

配置命令的别名,让其显示最后一次提交信息

1
2
git config --global alias.last 'log -1'
git last

搭建git私有服务器

1
2
$ sudo apt-get install git
$ sudo adduser git

收集所有需要登录的用户的公钥id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个选定一个目录作为Git仓库,比如/srv/sample.git,在/srv目录下输入命令:

1
$ sudo git init --bare sample.git

创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

1
$ sudo chown -R git:git sample.git

创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成

1
git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

1
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell。因为我们为git用户指定的git-shell每次一登录就自动退出。 现在,可以通过git clone命令克隆远程仓库:

1
$ git clone git@server:/srv/sample.git

要方便管理公钥,用Gitosis。要像SVN那样变态地控制权限,用Gitolite。