首页 > 技术文章 > Git 本地操作

ygjlch 2016-11-04 13:42 原文

 

目录(?)[-]

  1. 命令
    1. git config 增删改查 init clone add commit status rm mv ignore
    2. Working DirectoryStaging AreaHistory Repository相关操作 的工作流程
    3. Git本地分支 branch tag checkout stash merge
    4. 修改工作区的暂存区后保存
    5. 在某个时间的合并分支 merge
    6. 查看与对比历史记录 show log diff
    7. 撤销修改 checkout reset clean revert
    8. 重写历史记录 commit amend rebase resert reflog
  2. 相关设置
    1. 命令补全
    2. git config 给 命令 参数 起别名
    3. Git的基本工作流程
    4. 配置级别
    5. 切换版本
 
  • 官方下载网站
  • 官方文档


  • Amend Last Commit 修正上次提交

  • Stage Changed Files to Commit 缓存修改的文件为提交
  • Ustage to Commit 从本次提交中撤除
  • Revert Changes 撤销删除
  • Sign Off 签名
  • Fetch 获取
  • Prune 清除
  • Push 上传
  • Unstaged Changes 未缓存过的提交
  • Stage Changed 缓存改动
  • Portions staged for commit 部分缓存为提交
  • history repository 历史仓库

命令

  • git conifg –help 会弹出网页版的帮助文档
  • git help config 同样也是获得帮助文档
  • clear 清屏
  • f 向下翻页
  • b 向上翻页 

git config 增删改查 init clone add commit status rm mv ignore

  • git config –global user.name “helloworld”
  • git config –global user.email “352111644@qq.com”
  • git config –global –add user.name “eoe”:增加键值对eoe
  • git config –global user.name “eoe”:修改键值对为eoe
  • git config user.name:获取最新的user.name
  • git config –get user.name:获取最新的user.name
  • git config –list –global:获取所有的global中的键值对
  • Git config – global –unset user.name “eoe”:删除user.name,当只有一个用户名是,可以不加后面的名字直接删掉


  • git init git_non_bare_repo:初始化一个目录,附带一个.git的子工作目录

  • git init –bare git_non_bare_reop:不附带.git的子工作目录,而是把.git目录里的东西放出来的
  • git init:在当前文件夹中直接进行初始化,附带.git子目录
  • git clone git_bare_repo/ git_clone_reop:克隆本地仓库
  • git clone URL:克隆服务器上的仓库 

Working Directory、Staging Area、History Repository相关操作 的工作流程

  • git init git_basics
  • cd git_basics/
  • touch a
  • touch b
  • git add a b:将文件添加到暂存区
  • git status:查看暂存区
  • git commit -m “Initial commit”:将文件提交的历史记录里面,” “中间是提交信息
  • vim a:在a中加入一些提示信息
  • git status:将会显示红色的modefied a表示a文件修改了,但是还没有保存到暂存区里面
  • git add a:将修改后的a添加到暂存区
  • git status:显示绿色的modified a表示a文件修改了,并且已经保存到暂存区里了,准备被提交
  • git commit -m “modify a”:提交a
  • git rm a:同时把工作区和暂存去的a删除掉
  • git reset head a:只执行这一个还不能还原a,用ls命令可以看一下
  • git checketout a:执行这两个命令可以找回a
  • git rm –cached a:只删除暂存区里的a文件
  • git status:显示没有跟踪的文件a
  • git add a:重新添加a到暂存区
  • git mv a c:将a重命名为c
  • git status:显示rename:a -> c
  • 上面的那个git mv a c 可以分解为 
    1. mv a c:在自己的工作目录下将a重命名为c
    2. git status
    3. git add a c:可以实现相同的效果
  • git add -A:将整个工作区添加到暂存区里
  • 或者git add .:也是将整个工作区添加到暂存区了
  • cd ../git_ignore_demo/:进入部分不添加模板
  • vim .gitignore:创建gitignore文件,针对下面的那个图片里的目录
*.[oa] //以o,a结尾的文件不要添加,通配符形式
*~ //这种类型的是中间类型的文件
*.pyc
!test.pyc //加感叹号表示这个文件不要被忽略,要添加到暂存区
\!test.py //以感叹号开头的这个文件不要添加到缓存区
foo/ //\结尾匹配的是一个目录,但是文件名是foo的就匹配不到了
**/res //**/代表匹配0个或多个目录名为"res"的目录,包括子目录
build/
Documentation/
src/
.Dx_Store
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 这里写图片描述
  • git status:显示没有被跟踪的文件只有git_ignore_demo、foo、test.py三个
  • git add .gitignore:将此文件添加到仓库中用于整个仓库的共享
  • git commit -m “add ignore”

Git本地分支 branch tag checkout stash merge

  • git init git_checkout_merge
  • cd git_checkout_merge/
  • vim master.txt:创建新文件,增加历史记录
Initial commit on master
  • 1
  • 1
  • git add .:放到暂存区
  • git commit -m “Initial commit on master”:提交进历史记录
  • vim master.txt:在刚才的基础上添加
Second commit on master
  • 1
  • 1
  • git add .
  • git commit -m “Second commit on master”
  • git branch test:产生新的分支
  • git checkout test:切换到新的分支
  • vim master.txt:在test分支上继续添加
Initial commit on test
  • 1
  • 1
  • touch test.txt:创建一个新的文件用于验证修改
  • git add .
  • git commit -m “Initial commit on test”
  • git checkout master:切换回master分支
  • ls:这是看不到刚才创建的test.txt文件
  • vim master.txt:刚才做的修改也看不见
  • 分支名代表最新提交的那个commit的引用,利用tag可以代表靠前的提交,而不用每次都去读历史记录
  • git log –oneline –decorate –graph –all:查看git仓库中的git tag对象,会显示出来每次的提交信息和各个分支名字相对应,带HEAD标志的是当前分支
  • git tag “v0” alaba30:创建一个轻量级tag,后面那一串是commit的hash,不指定默认是当前带HEAD标志分支的commit
  • git tag -a “INITIAL_COMMIT” alaba30:会提示输入一些tag的信息,输入”TAG for INITIAL_COMMIT”,然后退出即可
  • git tag:查看当前有那些tag
  • git log –oneline –decorate –graph –all:查看历史示意图
  • git config –global alias.lol “log –oneline –decorate –graph –all”:给命令起别名
  • git lol:查看历史的树状结构
  • git show v0:查看tag:v0,会显示commit信息
  • git checkout v0:指向一个”v0”commit,会提示detached HEAD,这样直接再回去时,修改可能会丢掉,会提示用 -b 命令
  • git checkout -b fix_v0:在当前标签切换到分支状态

修改工作区的暂存区后保存

  • vim master.txt:在已有的文件中随便加点东西
  • git add .:添加到暂存区
  • git checkout master:会报错,提示没有将修改添加到历史记录,提交修改commit或者stash
  • git stash save -a “stash1”:参数a代表将暂存区保存起来
  • git status:显示当前状态很干净
  • git checkout master:在master分支上进行一些操作之后回去
  • git checkout fix_v0:回到v0分支
  • git stash list:会显示有stash@{0}的引用指向之前的stash
  • git stash pop –index stash@{0}:参数index表示把暂存区也还原回去
  • vim master.txt:刚才随便加的那句话也在里面
  • git stash lish:刚才的pop将stash清除了
  • git stash save -a “stash1”:重来一遍,这次将stash回复后还保存在list中
  • git stash list
  • git stash apply –index stash@{0}
  • git stash list:发现stash1还在里面
  • git stash drop stash@{0}:清除掉指定stash
  • git stash list
  • git stash drop:不加是哪个引用,默认清理第一个引用
  • git stash clear:清理所有的stash

在某个时间的合并分支 merge

  • git checkout master
  • git checkou -b test _merg:创建merg分支,并切换到上面去
  • vim master.txt:修改,加入”Initial commit on test_merge”
  • git add.
  • git commit -m “Initial commit on test_merg”:将修改添加到历史记录里面
  • git lol:查看历史的树状结构,上面有是哪个命令的缩写,可以看到都是master分支衍生出来的
  • git checkout master
  • git merge test_merge:提示这是一个Fast-forward的merge,不需要merge,只需要让master指向test_merge所指向的commit即可
  • git lol
  • git merge test:test分支在前面用到,和master有冲突,会提示自动合并失败,先fix冲突,再来合并
  • git merge –abort:放弃这次合并,在提示合并有冲突后才执行的,如果不进行合并了必须执行
  • 如果不执行git merge –abort 取消合并则执行:
  • vim master.txt:打开冲突文件,发现不一样了,HEAD和====号中间的就是当前所处的分支内容,====和test中间的是test分支上的内容,按找自己的想法去掉其中一块的内容,并且去掉这些符号标记
  • git add master.txt:将master添加进暂存区
  • git commit:会弹出一个文本提示merge信息,退出就行了

查看与对比历史记录 show log diff

  • git log –oneline –decorate –graph –all:查看完整的历史示意图,树状
  • git show de82fa8/master/HEAD:git show 以git的对象作为参数,显示当前分支的一个最新的提交的完整信息
  • git show master^:显示master的当前第一父提交
  • git show master^2:第二父提交
  • git show –oneline master^2:输出一个简短的信息
  • git show –stat master^2:输入提交做出改变的统计信息
  • git show –oneline –stat master^2:将功能组合起来
  • git tag:显示有那些tag对象
  • git show INITIAL_COMMIT:查看其中的一个对象
  • git show –format-%T master^2:通过格式化输入master的一些信息,会出现第一个40位的hash对象,是指向commit指向的那个tree的对象,可以利用是个hash,show那个tree,还有一个是index后面跟着的几个个HASH
  • git show HASH:通过刚才找到的那个hash可以显示tree对象及其中的文件,HASH是40位的前6位
  • git show HASH:这个HASH是在index后面跟着的那几个hash之一
  • git log:输出完整的历史信息
  • git log -p:输出commit之间的差异信息
  • git log –stat:每个commit之间差异的统计信息
  • git log –oneline:单行输出
  • git log –onelien –decorate –graph –all:输出所有分支的信息
  • git diff:输出工作区与暂存区的差异,没有差异则不显示
  • vim master.txt:随便修改一些
  • git diff:显示出一些信息
  • git add master.txt
  • git diff:又不显示了
  • git diff –cached:查看暂存区与历史的差异
  • git diff HEAD~2:比较当前工作区与其他历史提交的差异
  • git diff HEAD~2 – master.txt:比较某一个特定文件的差异
  • git diff –cached HEAD~2:比较暂存区与其他历史之间的差异
  • git diff HEAD HEAD~2:当前历史和前面两个历史的比较
  • git diff HEAD HEAS~2 – master.txt:指定文件的差异
  • vim master.txt:只是随便修改其中的一个单词
  • git diff –color-words:只显示单词的差异
  • git diff –word-diff:表示最新的修改

撤销修改 checkout reset clean revert

  • git lol
  • vim master.txt:做一些修改并保存
  • git diff:看到工作区和暂存区之间的差异
  • git status
  • git checkout – master.txt:撤销对master.txt的本地修改
  • vim master.txt:已经恢复到刚开始了,再修改一下
  • git add master.txt
  • git status:显示有修改将要提交到历史记录中
  • git reset master.txt:撤销修改,还原暂存区
  • git diff –cached:显示暂存区没有差别了,暂存去的修改已经被撤消了
  • git status:发现本地内容和暂存区里的内容有了差异
  • git lol:找到第一个commit on master的内容,通过commit的手动输入的信息找
  • git checkout INITAL_COMMIT – master.txt:撤销对master.txt的本地修改
  • git status:工作区和暂存区没有区别
  • git diff – cached:查看暂存区内容和历史内容的区别
  • git checkout HEAD – master.txt:还原工作区和暂存区到最新的一个提交上
  • git reset INITIAL_COMMIT – master.txt:只还原暂存区,不动工作区
  • git status:发现工作区和暂存区内容不同
  • git diff:查看上面发现的差异
  • git diff –cached:查看暂存区和当前历史记录区别
  • git reset master.txt:还原回来
  • 清理编译等不需要的文件
  • touch test.o test.a:创建不需要提交的文件
  • ls
  • git clean -n:查看git可以帮自己清除的文件
  • git clean -f:强制让git帮自己清除,本地的文件也会清除
  • ls:已经没有了.o .a的文件了
  • vim .gitignore:设置忽略文件 “*.[oa]”,这是另一种方法
  • git add .gitignore
  • git commit -m “add ignore”
  • touch test.o test.a
  • touch test.c:.c还需要修改,.o .a可以不要了
  • git clean -n:发现仅仅会移除.c文件,因为上面的ignore文件中设置的,默认不清理ignore中的文件
  • git clean -n -X:显示将要清理的是.o .a文件,没有了.c文件,是大写的X
  • git clean -x -f:小写的x会移除.c .o .a三种文件,大写的X只会移除.o .a两种文件
  • 默写历史提交的内容不需要
  • git revert HEAD:删除上一步的历史记录,会显示Revert “add ignore”
  • ls -la:看不到ignore文件了

重写历史记录 commit –amend rebase resert reflog

  • git checkout HEAD~ – .gitignore:还原上面删除的gitignore文件
  • git add test.c
  • git commit –amend:把前面的提交信息”Revert “add ignore” 和 下面的HASH码”删掉(前面不带#),然后添加”This is a amend commit”
  • git lol:看到刚才那个Revert的提交没有了,成了This is a amend commit
  • 查看git rebase功能
  • vim master.txt:随机添加一些东西
  • git add master.txt
  • git commit -m “conflict rebase”
  • git checkout -b test_rebase HEAD~:在这个之前的一个提交创建一个分支
  • vim master.txt:显示还没做出刚才的修改,添加”Initial commit on test_rebas”
  • git add master.txt
  • git commit -m “Initial commit on test_rebase”
  • git lol:希望让分支变成线性的来进行合并
  • git rebase master:会显示有merge冲突
  • git rebase –abort:用这种方式可以放弃
  • git rebase master:重新来一遍,还是显示merge冲突
  • vim master.txt:显示带有HEAD 和—–符号的文本,根据自己的想法删除一部分
  • git rebase –continue:提示要将修改的master放到暂存区
  • git add master.txt
  • git rebase –continue
  • git lol:这时候,master和test_rebase的commit都还在,但是已经变成线性的了
  • 再回到之前的不是线性的时候
  • git reflog:显示HEAD@{0-4}都是关于rebase的提交
  • git reset –hard HEAD@{5}:hard参数还原了暂存区和工作区
  • git lol:历史有回来了
  • //git reset –mixed:mixed只还原了暂存区
  • //git Reset –soft:什么都不还原,只是把HEAD和分支引用指向要指向的commit
  • 测试mixed
  • git reset –mixed HEAD~:测试一下mixed,mixed是reset默认的参数
  • git status:显示工作区和暂存区不同
  • git diff:查看不同
  • git lol:查看分支具体情况
  • git reflog -10:输出近10条的Head引用
  • git reset –hard HEAD@{1}
  • git lol:重新还原回来了
  • 测试soft
  • git reset –soft HEAD~
  • git status
  • git diff –cached:查看暂存区与历史区别

相关设置

命令补全

  • git config –:再按Tab键就可以给出可以使用的参数
  • 上面是Windows环境中的,直接可以补全
  • 在Mac os 和 Linux 中需要去github上下载源文件编译一下

git config 给 命令 & 参数 起别名

  • git config –global alias.co checkout
  • git config –global alias.br branch
  • git config –global alias.st status
  • git config –global alias.ci commit
  • git c:再按Tab键就可以看到多了几个自己的别名,代表相应的命令
  • git log:经常用到的查看log日志的命令,加上oneline参数比较整洁
  • git config –global alias.lol “log –oneline”
  • git lol:起到了参数重命名的作用

Git的基本工作流程

  • Git使用40个16进制字符的SHA-1 Hash来唯一标识对象 
    *例如:e98757d0598ab6eeaf1df0d87dd00826048bd80b
  • blob、tree、commit、tag

配置级别

  • 三个级别system、global、local
  • local优先级最高,针对每一个仓库
  • 其次是global,针对当前的一个用户
  • 第一次启动是要输入(用户名和邮箱根据自己的实际情况更换)
$ git config --global user.name "helloworld"
$ git config --global user.email "352111644@qq.com"
  • 1
  • 2
  • 1
  • 2

切换版本

  • which -a git
  • git –version
  • vim bash_profile 就在bash刚进去的目录下执行
  • 加上下面这句话,保存退出
export PATH=/mingw64/bin/git:$PATH
  • 1
  • 1
  • 路径是前面的which -a git得到的
  • source .bashi_profile 重新加载
  • 再次执行 which -a git 查看
  • 这个只是切换版本,如果版本正确,则不用进行

推荐阅读