git

GIT

  • GIT
    • 全局配置
    • 访问GIT版本库中的对象
    • 命令
      • git diff
      • git reset
        • 使用reflog挽回错误的重置
        • 第一种用法
        • 第二种用法
        • examples
      • git checkout
        • 第一种用法
        • 第二种用法
        • 第三种用法
        • examples
      • git stash
      • git tag
    • 场景
      • 撤销某次提交
      • 将历史的两次提交合并

全局配置

# 新环境需要修改的配置
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版本库中的对象

  • 采用部分的SHA1的hash,只采用开头的部分(4位以上),不和其他冲突;
  • 使用master代表分钟master中最新的提交,refs/heads/master 或 heads/master;
  • 使用HEAD代表最近一次提交;
  • ^代表上一次提交,例如前一次:HEAD^,前两次:HEAD^^,前三次:HEAD^3;
  • ~代表上n次提交,例如 a57310~3:a57310 的前三次提交
  • a57310^{tree},提交的树对象
  • a57310:path/to/file:提交的文件对象

命令

git diff

git diff           # 工作区和暂存区
git diff --cached  # 暂存区和HEAD比较
git diff HEAD      # 工作区和Head比较

git reset

git reset --hard   #会退到指定提交

使用reflog挽回错误的重置

带有工作区的版本库都有如下设置:

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)

    • 替换引用的指向
    • 替换暂存区,暂存区的内容和引用指向的目录树一致

examples

  • 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

第一种用法

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 孤儿分支,创建的新分支

examples

  • git checkout branch:检出分支
  • git checkout:汇总显示工作区、暂存区、HEAD之间的差异
  • git checkout --filename使用暂存区的文件覆盖工作区的文件,这个命令很危险,工作区的修改会丢失
  • git checkout branch --filename:使用指定分支的文件替换当前工作区和暂存区的文件
  • git checkout -- ./git checkout .使用暂存区覆盖工作区(全部),非常危险

git stash

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  

基于进度创建分支

git tag

显示里程碑

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 , --reuse-message=
- git cherry-pick E
- git cherry-pick F
- git checkout master
- git reset --hard head@{1} 最重要的一步,重置master

你可能感兴趣的:(git)