git实践指南

概念

commit tree : 整个git的记录提交就是对committree添枝加叶的过程,每一个提交都至少有一个父提交
HEAD: 当前提交记录的符号名称(即当前操作是基于该提交记录的),HEAD总是指向最近一次提交记录.HEAD通常指向分支名(如bugFix)

配置

1
2
3
#配置全局用户名和邮箱
git config --global user.name "Mu"
git config --global user.email "sxk10812139@163.com"

高级技巧

分离HEAD

分离HEAD就是将HEAD指向一个特定的提交记录ID,而不是分支名

1
git checkout <commit_id>

相对引用

两个操作符 ^ ~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
检出master分支的父提交
git checkout master^
检出master分支的父父提交
git checkout master^^
等同于
git checkout master~2
检出C4提交的父提交 C4为commitid
git checkout C4^
检出HEAD的父提交
git checkout HEAD
检出HEAD的第二个父提交
git checkout HEAD^2
检出HEAD的父提交的第二个父提交的父提交的父提交
git checkout HEAD~v2~2

常用命令

branch

1
2
3
4
5
6
7
8
9
10
11
# 显示所有分支信息
git branch -av
# 将master分支指向HEAD~3[当前所在分支不能是master]
git branch -f master HEAD~3
# 删除本地分支b1
git branch -d b1
# 删除远程分支b1
git push origin :b1

checkout

git checkout 意思是检出到某次提交,假如是分支的话,就检出到分支当前所在的提交
分支只指向一个commitid,只不过分支指定的commitid在不停的变动

1
2
3
git checkout C1 背后git将HEAD指向C1
git checkout master 背后git将HEAD指向master分支当前所在的提交
git checkout tagv1 背后将HEAD指向名位tagv1的tag

checkout还可以检出某次提交的指定文件

1
2
# git checkout <commit_id> <file_path>
git checkout master~2 /path_to_project/test.php

merge

1
2
3
git merge B1 合并B1到当前分支
git reset --hard HEAD 舍弃合并的内容,并强制恢复到上次提交

revert/reset

revert会产生一个新的提交,用于远程回滚内容
reset直接将分支指向之前的提交,用于本地回滚内容

1
2
git revert master~2 回滚
git revert <commit_id> -m <parent_id> 回滚合并

rebase

1
2
3
4
5
6
7
#将bugFix分支的提交复制到master分支上,使得两个分叉变成一个
git rebase master bugFix
注意: 并没有对两分支指向commitid做任何移动,master分支依旧指向C5,此时可使用git branch -f bugFix强制将master指向bugFix所在提交
#同样是rebase,但可以针对其中提交记录做出内容或顺序修改,通常用于分支合并到主干前,合并分支多个提交为一个
git rebase -i master bugFix
注意: 执行后将展示bugFix相对master所有的提交,从第二个起使用s(squash),将所有提交整理为一个,保存后输入新的提交信息,继续保存完成操作

调整顺序以及合并commit
image_1bjikc71gq5f1r52n6l1a8d14ce9.png-77.8kB

填写合并后的commit备注信息
image_1bjikda8prbeopn41b1ju5rs5m.png-86.8kB

rebase之前:
rebase之前
rebase之后:
rebase之后

cherry-pick

1
2
# 将提交C3 C4操作复制到当前分支并依次提交
git cherry-pick C3 C4

tag

作用: 对某一commitid设定固定标识

1
2
3
4
5
6
7
#对提交记录C1设定tag为v1
git tag v1 C1
#返回距离当前分支最近的tag信息
git describe branch_name
=>
v1_2_g234222f v1是距离最近的tag,2表示与v1相差的提交数,2344222f是当前分支所在的commitid前七位

commit

1
2
3
4
5
#添加有改动的文件并提交更新
git commit -am "描述"
#修改上一次提交的描述内容
git commit --amend

log

1
2
3
4
5
6
7
8
9
10
11
12
13
git log
--name-status 显示每次提交改动的文件及动作
--name-only 显示改动的文件名
--no-merges 不显示合并提交
#查看C1到HEAD用户小明的提交内容
git log --graph --name-status --no-merges --author='小明' C1..HEAD
#查看在test分支但是不在master分支的提交记录
git log --name-status master..test
#获取当前分支中修改和添加的文件列表并去重
git log --name-status master..HEAD --no-merges|grep -e "\(^A\t\)\|\(^M\t\)"|awk '{print $2}'|sort|uniq

fetch

本地有master origin/master两分支,git fetch只下载更新内容,即更新origin/master
pull = fetch + merge
远程分支格式: <remote>/<branch>

push

git push <remote> <place>
remote远端仓库名
place

1
2
3
4
5
git push origin master 将本地master推送到远端master
等于
git push origin master:master
git push origin foo^:master 将本地foo^推动到远端master

stash

1
2
3
4
git stash 将工作区内容备份至git栈中
git stash list 显示git栈中中备份内容
git stash pop 恢复最近一次的备份内容
git stash clear 清空git栈

FAQ

1.如何修改已提交日志中的作者信息
答: http://www.jianshu.com/p/b6add8187c06

2.指定目录移除版本控制

1
2
3
4
执行 git rm -r --cached "bin/" 删除文件的命令
执行 git commit -m" 删除bin文件" 提交,并加注释
执行 git push origin master    提交到远程服务器