Git使用入门
- 1. git攻略
by 李春城
chuncheng.li@dianping.com
- 2. git基本概念
暂存区
(stage)
暂存区:为了更高效,更快速的完成工作
稍后具体介绍各个命令的时候在介绍这三个的原理
- 3. 目 • git前奏
录 • git基本概念
• 配置、初化化
• 基本命令
• 暂存区
• 检出、重置
• git进阶
• 冲突解决
• 分支
• 标签、里程碑
3
- 4. git
前 远程
奏 办公
重置 爱上
.git目录
提交
git
每日
备份
- 5. 配置:git config
配 git config –-system key.value {/etc/config} 优先级最低
置 git config –-global key.value {~/.gitconfig}
文 git config key.value {.git/config} 优先级最高
件 一般的配置项:
user.name
user.email
alias.别名
git config alias.ci “commit –u”
color.ui true
git config –e –-global
git config --unset key.value
在哪可查看远程版本路径?
- 6. git支持的协议
初 ssh(scp)githttp(s)地地协议
始 git init
化 git clone <repository> <local directory>
文件+版本库均检出,是一个对等工作区,只能Pull,不能push
版 git clone –bare <repository> <local directory.git>
本 只检出版本库(祼库)
库 git clone –mirror <repository> <local directory.git>
与bare区别:在<repository>可以fetch <local repository>
注意:创建一个祼版本库后,第一次用git push会报错,因为远程
版本库还没有任何分支,所以第一次提交命令后面要跟上一个分支
号
eg: git push /path/to/repo/nullrepo.git master
- 7. git add
基 -i
本 -u
-A
命 git status
令 位于第二列红色的M(红二):工作区—暂存区
第一列绿色的M:暂存区-版本库
git status -s 精简输出
git status –s –b 查看当前工作分支 (git branch)
git diff
git diff 工作区—暂存区
git diff HEAD 工作区—版本库
git diff –cache 暂存区—版本库
git diff –staged 暂存区—版本库
比较文件输出的一堆内容是什么
- 8. 基 git clean –fd 清除工作区未加入版本库的非跟踪文件和目录
本 git checkout . 用暂存区内容刷新工作区
命 git commit –a 对本地所有变更文件(修改、删除)提交
令 git cat-file –t <版本> 查看类型 tree blob commit
git cat-file –p <版本> 查看版本提交的内容
- 9. master 代表分支master中最新的提交(分支名不一定是master
版 refs/heads/master 或 heads/master
本 HEAD 最近的一次提交
号 HEAD^ 最近两个提交 || HEAD^1
HEAD^^ 最近三次提交 || HEAD^2
a34690
a34690^^ || A34690~2
:访问
HEAD:path/to/file
a34690^3:path/to/file
:path/to/file 暂存区中的文件
- 10. HEAD指针
重 HEAD指针永远指向当前分支的最近一次提交
置 more .git/refs/heads/master(假如当前分支在master分支)
命 可以人为的改变HEAD指针 git reset
git reset –hard 版本号 [-- file]
令 重置三个区域到版本号,是最危险的操作,会删除local的多余文件
git reset –soft 版本号 [– file]
改变HEAD指针,不改变local和stage
git reset –mixed 版本号 [-- file]
改变HEAD指针,重置stage,不改变Local (默认操作)
恢复—hard的结果
git reflog show master | head 6
git reset –hard master@{3}
哈唏值是怎么计算来的?
- 11. 检 危险命令
出
git checkout branch – filename
维持HEAD不变,用branch指向的filename替换暂存区和工作区的相应文
命 件
令 git checkout branch
检出branch分支,更新HEAD以指向branch分支,更新暂存区和工作区
git checkout –b branch start_point
git checkout
汇总显示工作区、暂存区与HEAD的差异
git checkout – filename
用暂存区中filename文件来覆盖工作区中的filename文件(危险)
git checkout . 或 git checkout -- .
会取消所有本地的修改,相当于暂存区的所有文件直接覆盖本地文件
- 12. 冲突一:修改不同的文件
冲 有其他用户已经push,会push失败,除非强制push -f
突
解决:先pull ( pull = fetch + merge)
说明:可以禁用强制push
解 git config receive.denyNonFastForwards true
决
merge默认会自动提交,如果不想commit,可以提供—no-commit
冲突二:修改相同文件的不同区域
同冲突一方案解决
git blame filename可以查看每一行是谁改的
冲突三:修改相同文件的相同区域
手工编辑完成冲突解决 git add -u
<<<<<<(七个小于号)
我自己的版本
=======(七个等于号)
他人更改的版本
>>>>>>>(七个大于号)
图形工具完成冲突解决
git mergetool
需要安装 以下之一 kdiff3 meld tortoisemerge araxis
A: 共同祖先版本 B: 我的版本 C: 他人的版本
- 13. 冲突四:一个用户更改了文件名,另一个用户更改了文件的内容
冲 解决方案同冲突一,可以用pull自动合并
突 冲突五:任何软件都无法解决的问题
一个用户把函数名改了或者把函数的函数体改成了另外的功能,另一个
解 用户还是在用这个用户,这是人为造成的bug,git也无能为力。
决 冲突六:两个或者多个用户同时修改文件名
解决方案,共同商定用哪个文件名
命令行方式:
git rm 删除不要的文件
git add 最后的文件
git commit
问答式:
git mergetool
冲突的配置:
merge.conflictstyle 设置标记风格,默认merge || diff3
merge提供本地和他人的代码
diff3提供本地、祖先、他人的代码
merge.tool 配置图形化工具
- 14. git tag –n<num>显示<最多num行>里程碑
标 git describe 显示最近的一个里程碑
签 git tag <tagname> [<ID>] 创建轻量级里程碑
git tag –a <tagnme> [<ID>] 创建带说明的里程碑
git tag –m <msg> <tagname> [<ID>] 创建带说明的里程碑
git tag –s <tagname> [<ID>] 创建带签名的里程碑
git tag –u <key-id><tagname> [<ID>] 创建带签名的里程碑
git tag –d <tagname> 删除里程碑
说明:
里程碑一般只存在于本地
可以用git push origin mytag 显示推送到版本库以共享给他人
用户获取里程碑 git pull
git pull origin refs/tags/mytag:refs/tags/mytag
- 15. git branch 显示当前所有的分区,*号表示当前分区
分 git branch <branchname> 创建分区
支 git branch <branchname> <start-point>
git branch –d <branchname> 删除分区(已经有过合并不能删除)
git branch –D <branchname> 强制删除分区
git branch –m <oldbranchname> <newbranchname>
重命名分区
git branch –M <oldbranchname> <newbranchname>
强制重命名分区
git merge <branchname>合并到当前分区