版权声明:数学是研究世界的本质,自然科学是研究上帝的意志,而计算机则是揣摩屌丝人类的意志
命令
- 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 可以分解为
- mv a c:在自己的工作目录下将a重命名为c
- git status
- 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 查看
- 这个只是切换版本,如果版本正确,则不用进行