# 新环境需要修改的配置
PC:~ chenchu$ git config --global user.name "chu chen"
PC:~ chenchu$ git config --global user.email "[email protected]"
PC:~ chenchu$ git config --global color.ui true
# 手动编辑配置
PC:git chenchu$ git config -e
PC:git chenchu$ git config -e --global
PC:git chenchu$ git config -e --system
git diff # 工作区和暂存区
git diff --cached # 暂存区和HEAD比较
git diff HEAD # 工作区和Head比较
git reset --hard #会退到指定提交
带有工作区的版本库都有如下设置:
git config core.logallrefupdates
true
如果回退到早期版本,后悔,通过 {project}/.git/logs/refs/heads/master 查看之前的分支日志,只要是非裸库,都能够找回(asc)
PC:git chenchu$ tail -10 ./.git/logs/refs/heads/master
0000000000000000000000000000000000000000 fe0a9eaf31dd0c349ae4308498c33a5c3794b293 Chu Chen 163.com> 1523716918 +0800 clone: from git://git.kernel.org/pub/scm/git/git.git
fe0a9eaf31dd0c349ae4308498c33a5c3794b293 3aece9c3f6e1109d3591df40a3aa23673cd72dac chu chen 163.com> 1523718885 +0800 commit: a
3aece9c3f6e1109d3591df40a3aa23673cd72dac 12f0dd1e7bbd3c03ec7096634c72899c76f35cb0 chu chen 163.com> 1523805021 +0800 commit: aaa
12f0dd1e7bbd3c03ec7096634c72899c76f35cb0 3aece9c3f6e1109d3591df40a3aa23673cd72dac chu chen 163.com> 1523891778 +0800 reset: moving to HEAD^
3aece9c3f6e1109d3591df40a3aa23673cd72dac fe0a9eaf31dd0c349ae4308498c33a5c3794b293 chu chen 163.com> 1523891782 +0800 reset: moving to HEAD^
fe0a9eaf31dd0c349ae4308498c33a5c3794b293 8b026edac3104ecc40a68fd58b764fb3c717babb chu chen 163.com> 1523891788 +0800 reset: moving to HEAD^
使用如下命令更方便的查看reflog(desc):
git reflog show
PC:git chenchu$ git reflog show
12f0dd1e7 (HEAD -> master) HEAD@{0}: reset: moving to 12f0dd1e7bb
8b026edac HEAD@{1}: reset: moving to HEAD^
fe0a9eaf3 (origin/master, origin/HEAD) HEAD@{2}: reset: moving to HEAD^
3aece9c3f HEAD@{3}: reset: moving to HEAD^
12f0dd1e7 (HEAD -> master) HEAD@{4}: commit: aaa
3aece9c3f HEAD@{5}: reset: moving to HEAD
3aece9c3f HEAD@{6}: commit: a
fe0a9eaf3 (origin/master, origin/HEAD) HEAD@{7}: clone: from git://git.kernel.org/pub/scm/git/git.git
可以使用 git reset –hard master@{2} 重置到指定节点
git reset [-q] [] [--] ...
包含了 path,为了避免 commit 和 paths 重名,可以使用 --
分隔;
- 不会重置引用,更不会重置工作区
- 如果指定了 paths,相当于使用指定
的路径文件替换暂存区的文件,例如:
- - git reset HEAD
清除了
路径下的暂存区修改
git reset [--soft | --mixed | --hard | --merge | --keep] [-q] []
hard
soft
mixed (default)
git reset
: 相当于将暂存区的提交撤回工作区git reset head
: 同上git reset -- filename
: 将指定文件的修改从暂存区撤回工作区git reset HEAD filename
: 同上git reset --soft HEAD^
: 工作区和暂存区不变,引用回退一次,相当于对上次的提交不满意,希望重新提交一次;git commit --amend
== git reset --soft HEAD^; git commit -e -F .git/COMMIT_EDITMSG
,其中 .git/COMMIT_EDITMSG
包含了上次提交的信息 git reset HEAD^
: 工作区不变,暂存区和和引用回退到上一次git reset --hard HEAD^
: 彻底会退到上一次提交git checkout [-q] [] [--] ...
是可选项,如果省略,相当于是从暂存区(index)检出;和git reset
不同,git reset
默认的mixed
模式只会重置暂存区,对工作区不会影响,而git checkout
会同时修改暂存区和工作区
如果不省略
,则会使用指定提交的
文件重置当前HEAD
指向的工作区和暂存区
git checkout []
用于切换分支,如果省略[
,相当于对工作区进行状态检查(没有指定
,只会输出状态,不会修改任何工作区文件内容)
git checkout
M a
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
git checkout [-m] [[-b| --orphan] ] []
通常用于创建新分支,新分支从 [
创建
orphan
孤儿分支,创建的新分支
git checkout branch
:检出分支git checkout
:汇总显示工作区、暂存区、HEAD之间的差异git checkout --filename
:使用暂存区的文件覆盖工作区的文件,这个命令很危险,工作区的修改会丢失git checkout branch --filename
:使用指定分支的文件替换当前工作区和暂存区的文件git checkout -- .
/git checkout .
:使用暂存区覆盖工作区(全部),非常危险git stash
保存当前工作区和暂存区
git stash list
查看stash列表
git stash pop [--index] []
- [
:指定需要回复的stash
- [--index]
:尝试恢复暂存区(如果冲突,则暂存区会恢复失败)
git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] []]
git stash
的完整版
- --patch
显示工作区和HEAD
的差异,通过对差异文件的编辑,决定具体的stash的内容
- -k
/--keep-index
不重置暂存区(默认 git reset --hard HEAD
)
git stash apply [--index] []
除了不删除stash中的进度外,其他和 git stash pop 一样
git stash drop []
删除存储的进度,默认删除当前
git stash clear
清除所有进度
git stash branch
基于进度创建分支
显示里程碑
PC:git chenchu$ git tag
gitgui-0.10.0
gitgui-0.10.1
gitgui-0.10.2
gitgui-0.11.0
gitgui-0.12.0
gitgui-0.13.0
gitgui-0.14.0
gitgui-0.15.0
gitgui-0.16.0
gitgui-0.17.0
gitgui-0.18.0
显示至多两行的提交说明
PC:git chenchu$ git tag -n2
gitgui-0.10.0 git-gui 0.10.0
gitgui-0.10.1 git-gui 0.10.1
加上 -l 参数,支持通配符匹配
PC:git chenchu$ git tag -l v0.99*
v0.99
v0.99.1
v0.99.2
v0.99.3
创建轻量级里程碑,只会指向某次提交,没有具体的提交人信息,不适合团队协作
PC:git chenchu$ git tag aaa
PC:git chenchu$ cat ./.git/refs/tags/aaa
468165c1d8a442994a825f3684528361727cd8c0
PC:git chenchu$ git log
commit 468165c1d8a442994a825f3684528361727cd8c0 (HEAD -> maint, tag: v2.17.0, tag: aaa, origin/maint)
Author: Junio C Hamano @pobox.com>
Date: Mon Apr 2 10:13:35 2018 -0700
Git 2.17
Signed-off-by: Junio C Hamano @pobox.com>
带说明的里程碑,里程碑将作为一个单独的对象存储
PC:git chenchu$ git tag -m 'bbb' bbb
PC:git chenchu$ cat ./.git/refs/tags/bbb
39e01b0e51fe4da407d8fd7524cf58c807603358
PC:git chenchu$ git cat-file -t 39e01b0e
tag
PC:git chenchu$ git cat-file -p 39e01b0e
object 468165c1d8a442994a825f3684528361727cd8c0
type commit
tag bbb
tagger chu chen @163.com> 1527996340 +0800
bbb
假设存在提交(tags):A、B、C、D、E、F,现在需要剔除提交D
- git checkout C
- git cherry-pick master^
- git cherry-pick master
- git checkout master
- git reset --hard head@{1}
最重要的一部,重置master
假设存在提交(tags):A、B、C、D、E、F,现在需要合并C和D
- git checkout D
- git reset --soft head^2
- git commit -C C
-C:-C
- git cherry-pick E
- git cherry-pick F
- git checkout master
- git reset --hard head@{1}
最重要的一步,重置master