根据廖雪峰的官方网站整理,原网链接:http://www.liaoxuefeng.com
下载与安装
下载
Windows版的Git可以从以下链接下载:点我开始下载
安装
安装 Git
默认安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,也可以对某个仓库指定不同的用户名和Email地址
配置 Git
忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,提交.gitignore
文件到Git,Git就会自动忽略这些文件,文件格式如下:
# Windows:
ehthumbs.db
Desktop.ini# Python:
*.py[cod]
*.so
*.egg
*.egg-info#My configurations: >db.ini
deploy_key_rsa
配置文件可参考:https://github.com/github/gitignore
使用配色
$ git config --global color.ui true
配置别名
$ git config --global alias."short-name" "long-name"
注意:--global
参数是全局参数,也就是这些命令在这台电脑的所有Git 仓库下都有用
本地仓库
创建版本库
在当前目录下建立仓库使用以下命令:
$ git init
仓库目录下多了名为.git
的隐藏目录,这个目录即是Git的版本库
把文件添加到缓存区
$ git add "filename"
把文件提交到仓库
$ git commit -m "description of commit"
查看状态
$ git status
常见状态说明
状态 | 说明 |
---|---|
on branch master | 当前在master分支 |
changes not staged for commit | 工作区有未添加到暂存区的修改 |
changes to be committed | 暂存区有未提交到当前分支的修改 |
untracked files | 未被添加过的文件 |
查看修改
当git status
告诉提示有文件被修改过,可以用git diff
可以查看修改内容,采用以下语句:
$ git diff "filename"
版本回退
版本回退前可以用通过提交日志查看回档版本号,查看日志采用以下语句:
$ git log [--pretty=onelie]
回档采用以下语句:
$ git reset --hard "版本号"
其中版本号可以用HEAD
表示当前版本,用HEAD^
表示上一个版本
在版本控制中经常需要查看命令日志,查看命令日志采用以下语句:
$ git reflog
简单文件我们可以在工作台直接查看,采用以下语句:
$ cat "filename"
撤销修改
撤销工作区的修改
工作区是我们硬盘上的物理目录,撤销工作区实际上是用版本库的版本替换工作区的版本。撤销工作区的修改采用以下语句:
$ git checkout --"filename"
撤销暂存区的修改
暂存区是Git的一个概念。git add
命令实际上就是把文件修改添加到暂存区,git commit
命令实际上就是把暂存区的所有内容提交到当前分支。撤销暂存区的修改采用以下语句:
$ git reset HEAD "filename"
删除文件
在工作区中删除文件
$ rm "filename"
在版本库中删除文件
$ git rm "filename"
$ git commit -m "description-commit"
远程仓库
远程仓库托管网站 GitHub 提供代码托管服务,注册账号后按一下步骤设置:
在用户主目录下,看看有没有
.ssh
目录,如果有,再看看这个目录下有没有私钥id_rsa
和公钥id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Git Bash,通过以下语句创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
登陆GitHub,打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴
id_rsa.pub
文件的内容
添加远程库
- 登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库
- 关联远程库
$ git remote add origin "your SSH clone URL"
推送到远程库
$ git push -u origin master
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master推送到远程
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令,使用以下语句即可:
$ git push origin master
从远程库克隆
$ git clone "your HTTPS clone URL"
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆
Git支持多种协议,包括https
,但通过ssh
支持的原生git
协议速度最快
分支管理
分支基本操作
创建分支
$ git checkout -b "new-branch-name"
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch "new-branch-name"
$ git checkout "new-branch-name"
切换分支
$ git checkout "branch-name"
合并分支
$ git merge "designated-branch-name"
git merge
命令用于合并指定分支到当前分支,默认用快进模式fast-forward
合并,有时应避免用fast-forward
查看分支
$ git branch
git branch
命令会列出所有分支,当前分支前面会标一个*号
删除分支
$ git branch -d "branch-name"
解决冲突
解决冲突思路
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
分支管理策略
合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息;强制禁用Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样,从分支历史上就可以看出分支信息
。禁用Fast forward
模式:
$ git merge --no-ff -m "merge-discrimination" "branch-name"
注意:此处-m "merge discrimination"
参数中的引号不能去掉
保存当前分支状态
Git提供了一个stash
功能,可以把当前工作现场储藏
起来,等以后恢复现场后继续工作
设置 stash
$ git stash
查看 stash
$ git stash list
恢复 stash
apply 方法
$ git stash apply
$ git stash drop
用git stash apply
恢复,但是恢复后,stash
内容并不删除,你需要用git stash drop
来删除
pop 方法
$ git stash pop
用git stash pop
恢复的同时把stash
内容也删了
恢复指定 stash
$ git stash list
$ git stash apply stash@{0}
注意:此处stash@{0}
是根据git stash list
命令得到的
丢弃未合并的分支
$ git branch -D "branch-name"
注意:此处参数-D
是大写,代表强行删除;参数-d
代表普通删除
多人协作
查看远程库信息
$ git remote
$ git remote -v
推送分支
$ git push origin "branch-name"
抓取分支
创建远程分支到本地
$ git checkout -b dev origin/dev
指定本地分支与远程分支的链接
$ git branch --set-upstream dev origin/dev
注意:这里的dev
为分支名
抓取分支
$ git pull
多人协作模式
- 首先,可以试图用
git push origin branch-name
推送自己的修改 - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功 - 如果
git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
标签管理
创建标签
给当前分支打标签
$ git tag "tag-name"
给特定分支打标签
$ git tag "tag-name" "commit-id"
注意:“commit-id”可以通过git log
命令查看
查看标签
查看已打标签
$ git tag
查看具体标签信息
$ git show "tag-name"
推送标签
推送某个标签
$ git push origin "tag-name"
推送全部标签
$ git push origin --tags
删除标签
删除本地标签
$ git tag -d "tag-name"
删除远程标签
$ git tag -d "tag-name"
$ git push origin :refs/tags/"tag-name"
搭建Git服务器
以下方法适用于Unix,在sudo权限下操作,仅供参考:
- 安装git
$ sudo apt-get install git
- 创建一个git用户,用来运行git服务
$ sudo adduser git
- 创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个 - 初始化Git仓库
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner
改为git
$ sudo chown -R git:git sample.git
- 禁用shell登录:
出于安全考虑,第二步创建的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
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。 - 管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队人数较多,这时可以用Gitosis
来管理公钥。