Git操作总结
2017-04-17 Git免费,开源的分布式版本控制系统。
配置个人信息
- 配置用户名:
$ git config --global user.name "whoisnian"
- 配置邮箱:
$ git config --global user.email "[email protected]"
连接GitHub
- GitHub同时支持SSH和Https协议:
- Https:任何人都可以clone,push的时候每次都需要验证用户名和密码。
- SSH:只有拥有者可以clone,需要提前在GitHub上添加自己的SSH公钥。
- 查看
~/.ssh
下是否存在SSH Key,若存在id_rsa
和id_rsa.pub
文件,则不需要创建SSH Key;
否则需要创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
如果没有特殊需要,可以不设置SSH Key密码,一路回车即可。
然后登录GitHub,复制自己~/.ssh
下id_rsa.pub
中的内容,在个人设置中添加SSH Key。
工作区—暂存区—仓库
- 工作区:
本地的自己直接在里面对文件进行修改的文件夹就叫做工作区,工作区下的.git
目录则是版本库,记录着版本数据。 - 暂存区:
当使用git add
命令时,git会把工作区的改动保存到暂存区,此时改动尚未提交到仓库。 - 仓库:
当使用git commit
命令时,git才会把已经保存在暂存区的改动上传进本地仓库,此时自己在本地所做的修改才算完成。
撤销修改
- 撤销工作区对
README.md
的修改:
$ git checkout -- README.md
这样就可以将工作区的README.md
恢复到修改前的样子,也就是最近一次git add
或者git commit
之后的样子。 - 撤销暂存区对
README.md
的修改:
$ git reset HEAD readme.txt
这样就可以把暂存区的README.md
恢复到和本地仓库相同的状态,其中HEAD
指的就是本地仓库中最新的版本。
版本控制
- 查看版本记录:
$ git log
或者简化输出内容:
$ git log --pretty=oneline --abbrev-commit
里面的一长串十六进制数字就是版本号,即commit id
。 - 找到了想要回退到的版本的
commit id
,现在就可以进行版本回退了。上一个版本就用HEAD^
表示,上上个版本就是HEAD^^
,再多的话,比如前第100个版本,可以用HEAD~100
表示。
返回上个版本:
$ git reset --hard HEAD^
- 返回上个版本后,再执行
git log
就会发现回退之前的版本号不见了。
此时如果想要回到最新的版本,可以查看git的历史记录:
$ git reflog
找到回退之前的commit id
之后就可以回退了。
分支管理
- 创建新分支
dev
:
$ git branch dev
- 切换到
dev
分支:
$ git checkout dev
- 查看当前分支:
$ git branch
- 查看所有分支:
$ git branch -a
- 创建与远程仓库
dev
分支相同的本地分支:
git checkout -b dev remotes/origin/dev
- 把
dev
分支合并到master
分支:
$ git merge dev
- 删除本地仓库的
dev
分支:
$ git branch -d dev
- 删除远程仓库的
dev
分支:
$ git push origin --delete dev
- 强制删除未合并的分支:
$ git branch -D dev
- 查看分支合并图:
$ git log --graph
或者简化输出内容:
$ git log --graph --pretty=oneline --abbrev-commit
在实际开发中,master分支应该是非常稳定的,也就是仅用来发布新版本,平时的修改都在dev分支上,dev分支是不稳定的。每个人都有自己的分支,时不时地从自己分支往dev分支上合并。当修改已经确定时,再把dev分支合并到master上,然后在master分支上发布新版本。
标签管理
- 切换到想要加标签的分支
dev
:
$ git checkout dev
- 给分支加标签:
$ git tag v1.0
或者得到commit id
为6666666
后,直接对该次commit加标签:
$ git tag v1.0 6666666
- 查看所有标签:
$ git tag
- 删除标签:
$ git tag -d v1.0
多人协作
- 大致流程:
- 开发者
Fork
上游仓库到自己的GitHub。 - 开发者在自己
Fork
得到的仓库中创建一个测试分支,并在上面进行修改。 - 开发者通过Github向上游仓库发起一个
pull request
。 - 上游仓库成员审核代码,并作出修改。
- 开发者的代码被并入上游仓库,然后该
pull request
被关闭。
- 开发者
- 克隆
Fork
得到的仓库到本地:
$ git clone [email protected]:user/repo.git
- 创建
dev
分支:
$ git checkout -b dev
- 在
dev
分支上修改完毕后git commit
,然后推送到自己的仓库:
$ git push origin dev
- 然后到上游仓库中,选择
New pull request
。
base fork
选择上游仓库的地址,base
选择要提交到的上游仓库的分支;
head fork
选择自己仓库的地址,compare
选择自己仓库的分支,例如上面的dev
分支。
最后选择Create pull request
,并对自己的pull request
进行详细说明。 - 现在就等待上游仓库成员的回复吧。
如果上游仓库在自己
Fork
之后有了新的修改,而你又想要让自己Fork
得到的仓库与上游仓库保持一致的话,可以使用下列命令:
$ git remote add upstream https://github.com/original_owner/original_repo.git
添加上游仓库地址(注意修改为你的上游仓库实际地址)。$ git pull upstream master
同步上游仓库到本地仓库当前分支。- 然后再
git push
到自己GitHub上的仓库即可。
常用命令
- 克隆仓库:
$ git clone
- 初始化仓库:
$ git init
- 本地仓库连接远程仓库:
$ git remote add
- 添加文件改动到暂存区:
$ git add
- 添加所有改动到暂存区:
$ git add -A
- 移动暂存区文件:
$ git mv
- 删除暂存区文件:
$ git rm
- 查看工作区和暂存区状态:
$ git status
- 查看修改内容:
$ git diff
- 提交暂存区到本地仓库:
$ git commit
- 从远程仓库同步到本地仓库:
$ git pull
- 推送本地仓库到远程仓库:
$ git push