安装配置
1 | $ git config --global user.name "Your Name" |
自定义git
- 让git显示颜色: git config –global color.ui true
- 设置差异比较工具: git config –global merge.tool vimdiff
git编码问题
1
2
3$ git config --system gui.encoding utf-8 # Git Gui乱码问题
$ git config --system i18n.commitEncoding gbk # 提交的log里面可以用gbk提交
$ git config --system i18n.logOutputEncoding gbk # 运行 git log 时将 utf-8 编码转换成 gbk 编码忽略特殊文件: 创建.gitignore文件,编写如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14#windows
Thumbs.db
ehthumbs.db
Desktop.ini
#Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
#My configurations:
db.ini
deploy_key_rsa
创建版本库
1 | $ git init <name> |
克隆及相关
- git clone url<直接fork地址>
- 添加upstream: git remote add upstream <原作者库地址>
- 查看remote情况: git remote -v
- 将原作者的修改更新到本地目录: git fetch upstream
- 将直接fork的东西更新到本地目录: git pull origin master
- 也可以通过checkout命令更新: git checkout master
- 合并原作者与本地版本的区别: git merge upstream/master
- 如果有冲突的话运行: git mergetool
- 然后 git push origin master, 就可以将fork的版本与原作者版本进行统一
git fetch 与 git pull
git fetch:相当于是从远程获取最新标本到本地,不会自动merge
- git fetch origin master
- git log -p master origin/master
- git merge origin/master
- 上面的含义如下:
- 从远程的origin的master主分支下载最新的版本到origin/master分支上;
- 比较本地的master分支与origin/master分支的差别;
- 合并
- 上面的过程类似如下:
- git fetch origin master:tmp
- git diff tmp
- git merge tmp
git pull: 获取最新版本病merge到本地
- git pull origin master
提交更改
- git status
- git add 修改的文件
- git rm 要删除的文件
- git mv 要修改的文件名 修改后的
- git commit -m “修改的内容”
- git push origin master
管理修改
- git status
- git diff HEAD – filename(可以查看工作区与版本库里面的最新版本的区别)
- git diff filename(查看文件的区别)
- 如果使用
git add
提交修改后, 后悔了,使用git reset HEAD filename
将暂存区的修改撤销掉
版本回退(git中,用HEAD表示当前版本,HEAD^表示上个版本, 上上个HEAD^^, 依次类推, 简化可以写成HEAD~100)
- git log(查看提交的log)
- git log –pretty=oneline(简化输出)
- git log -p filename(查看文件所有变化)
- git reset –hard HEAD^ (方法1)
- git reset –hard (commit-id)
分支
- 查看当前分支: git branch
- 创建分支: git branch branch_name
- 删除分支: git branch -d branch_name
- 切换分支(如果存在): git checkout branch_name
- 切换分支(如果不存在,创建): git checkout -b branch_name
- 将分支上的修改合并到master: git merge branch_name
- 克隆分支版本: git clone -b branch_name <主版本地址>
bug分支
- 开发过程中,突然有个bug要修改,但是你当前正在工作的分支(dev)还有任务没有提交(由于未完成,无法提交)
- 保存工作现场: git stash
- 如果要修复master分支上的bug,则切换到master上创建分支: git checkout -b issue-101
- 修改后: git add <修改的文件> , git commit -m “修改的内容”
- 如果不进行这一步, 切回主分支还是能看到分支的内容的
- 切换到主分支合并修改: git checkout master
- 合并修改: git merge –no-ff -m “merge buf fix 101” issue-101
- –no-ff 禁用Fast Forward模式,这样log就可以看出曾经做过合并
- 删除分支: git branch -d issue-101
- 切换到工作分支:git checkout dev
- 查看工作现场列表: git stash list
- 恢复现场
- 方法1: git stash pop
- 方法2: git stash apply; git stash drop
- 可以多次恢复: git stash apply stash@{0}
标签管理
- 标签的作用: 发布一个版本时,通常现在版本库中打一个标签, 这样就确定了打标签时刻的版本.*
- 将来无论什么时候, 取某个标签的版本, 就可以取出历史版本.*
- 查看标签: git tag
- 创建标签: git tag v1.0
- 查看标签信息: git show tag_name
- 创建带说明的标签: git tag v0.2 -m “说明”
- 删除标签: git tag -d v1.0
- 删除远程标签: git push origin :refs/tags/v0.9
- 推送某个标签到远程: git push origin v1.0
- 或推送全部未推送的: git push origin –tags
子仓库(submodule)
1 | git submodule允许一个git仓库作为另一个git仓库的子目录,并保持父项目与子项目相互独立. |
添加子仓库
1 | $ git submodule add <仓库地址> <本地地址> |
检出(checkout)
1 | clone一个包含子仓库的仓库,并不会clone子仓库,只会下载.gitmodule文件,需要通过 |
方法1
1
2
3
4
5# 初始化配置文件
$ git submodule init
# 检出父仓库列出的commit
$ git submodule update方法2
1
$ git submodule update --init --recursive
此时子目录在一个未命名分支,此时子仓库有改动并没有检测到。此时需要将子仓库的分支切换
到主分支,并更新到最新,然后切换到住仓库,并提交更改。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 查看子仓库的分支
$ git branch
# 切换到主分支
$ git checkout master
# 更新
$ git pull
# 切换到主仓库并查看状态
$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
(提交或丢弃子模组中未跟踪或修改的内容)
修改: mshell/zsh/plugins/fast-syntax-highlighting (新提交)
修改: mshell/zsh/themes/powerlevel9k (新提交)
修改: oh-my-zsh (新提交)
修改尚未加入提交(使用 "git add" 和/或 "git")
# 上面的三个都是子仓库,可以提交修改。
删除子仓库
- 删除.gitsubmodule里相关部分
- 删除.git/config文件里相关字段
- 删除子仓库目录
$ git rm --cached <本地路径>