目录
1.git下载地址:https://git-scm.com/downloads
2.git config的参数--local、--global、--system
4.基于旧版本号415c5c8086sg1371创建一个新的分支temp
5.refs/heads/master(或者temp)文件的内容是什么?
2.用git命令查看commit、tree、blob的类型和内容(hash值如上图所示)
3.新建的git仓库,有且仅有一个commit,仅包含/doc/readme,请问内含多少个tree,多少个blob?
1. “detached HEAD” 状态是什么?需要注意什么?
二十.开发中途,遇到紧急任务,需要保留当前工作状态,怎么做?
1.在仓库中新建文件“.gitignore”,只能叫这个文件名
2.在.gitignore文件中添加不需要git管理的文本或文件夹的通配符
3.将/c/Users/lincoco/Desktop/testgit/.git的变更同步到备份zhineng.git
7.协同开发时,不同的人在同一分支的同一文件相同位置进行修改,冲突如何处理
8.协同开发时,不同的人同时变更了文件名和文件内容如何处理?
4.协同工作时,禁止将公共的分支拉到本地后作rebase操作(历史不能被更改)
一.安装
1.下载地址:https://git-scm.com/downloads
2.在命令行检查是否安装成功:git --version
二.使用git之前的配置
1.配置user.name和user.email
#为git设置用户名和email
$git config --global user.name ‘your_name’
$git config --global user.email ‘your_email@domain.com’
2.git config的参数--local、--global、--system
$git config --local:只对某个仓库有效
$git config --global:对当前用户所有仓库有效
$git config --system:对系统所有登录的用户有效
3.显示config的配置,--list
$git config --list --local
$git config --list --global
$git config --list --system
三.建git仓库
1.把已有的项目代码纳入git管理
$cd 项目所在路径
$git init
2.新建的项目直接用git管理
$cd 某个文件夹
$git init project_name #会在当前路径下创建和项目名称同名的文件夹
$cd project_name
3.在新建的仓库配置local用户信息
按第二节命令
4.在项目目录新增一个文件newfile
$git add newfile
$git commit -m ‘add a newfile’
四.认识工作区和暂存区
1.暂存区处于版本管理流程的哪个部分?以及暂存区的好处?
工作目录的变更需要先添加到暂存区,再提交。尝试两套方案时,先把已完成的第一套方案放入暂存区,在试第二套方案,如果第二套方案不行,那么暂存区的第一套方案可以覆盖第二套方案;暂存区的内容已经被git管理了;暂存区的内容如果不合适可以回退。
2.四次提交练习
- # 加入index.html和image/*
$git status
$git add index.html images
$git commit -m ‘add index + log’
- # 加入style/style.css
$git add style
$git commit -m ‘Add style.css’
$git log
- # 加入js文件
$git add js
$git commit -m ‘Add js’
- #同时修改index.html和css文件
$git add -u #将被git管理的所有变更过的文件一起提交到暂存区
$git status
$git commit -m ‘Add message’
五.如何给文件重命名
1.直接按照commit思路进行重命名,以及有什么问题?
$mv readme readme.md #删除了readme,并且新增了readme.md
$git add readme.md #将readme.md加入git管理
$git rm readme #将readme从git管理删除
$git status #显示:readme—>readme.md
2.不想保留刚才的操作,即回滚,如何做?
$git reset --hard #该命令较危险,工作区和暂存区所有的变更都会被清理掉
$git status #此时工作路径下都是clean的
$git log #且没有破坏git的历史
3.一条命令如何重命名
$git mv readme readme.md #显示:readme—>readme.md
$git commit -m ‘Move readme to readme.md’ #直接commit,不需要add
六.用git log查看版本演变历史
1.一行显示历史
$git log --oneline
2.指定只查看最近的4次commit
$git log -n4 --oneline
3.查看本地有哪些分支
$git branch -v
4.基于旧版本号415c5c8086sg1371创建一个新的分支temp
$git checkout -b temp 415c5c8086sg1371
5.基于temp分支修改readme.md 文件
$git commit -am ‘Add test’ #-am 表示直接将工作区的内容提交到历史版本库中,不需要add
6.只看当前分支的历史
$git log
7.查看所有分支的历史
$git log --all
8.图形化展示所有分支的历史
$git log --all --graph
9.指定输出temp分支的log
$git log --oneline temp
七.用图形界面工具gitk查看版本历史
1.gitk --all
八..git目录
1..git目录里面有什么?
$cd .git
$ls -al
2.HEAD文件里面是什么?
$cat HEAD
- 里面是一个引用,指向refs/heads/master,说明当前仓库正在工作的分支是master
- 切换分支(git checkout temp)后,HEAD文件内的内容就会发生变化,指向temp
3.config文件里面是什么?
存储的local的config信息,如果直接在config文件内改变email或user的话,依然生效
4.refs文件夹里面是什么?
包括tags(标签)和heads(分支)
5.refs/heads/master(或者temp)文件的内容是什么?
$git cat-file -t 6a9802fdbdcd #查看6a9802fdbdcd是什么类型,结果显示是commit类型,表示master指针指向的commit
$git cat-file -p 6a9802fdbdcd #查看6a9802fdbdcd指向的内容
6.objects文件夹里面是什么?
进入objects中的98文件夹
blob指文件对象
九.commit, tree, blob三个git对象
1.git对象彼此关系
一个commit对应一棵tree,这个tree代表取出某个commit,这个commit对应一个视图,这个视图里面存放的一个快照,这个快照的集合里面存放了当前commit对应的本项目仓库的所有的文件夹以及文件的一个快照。一个文件夹也是一个tree,一个文件是一个blob,在git中,如果两个文件的内容完全一样,那么这两个文件指向同一个blob。
2.用git命令查看commit、tree、blob的类型和内容(hash值如上图所示)
$git cat-file -p 415c5c #显示上图蓝色区域部分
$git cat-file -p 912fa6 #显示上图黄色第一块区域
$git cat-file -p 6ad4c6 #显示上图绿色第一块区域,blob,文件内容,是一个html
3.新建的git仓库,有且仅有一个commit,仅包含/doc/readme,请问内含多少个tree,多少个blob?
$git init count_git_objects
$cd count_git_objects
$mkdir doc
$cd doc
$echo “hello, world”>readme
$cd ..
$find .git/objects -type f #空的
$git add doc
$ find .git/objects -type f #有一个对象,表示新的东西加入到暂存区
$git cat-file -t 2dadwd23 #是个blob
$ git cat-file -p 2dadwd23 # hello, world
$git commit -m ‘Add readme’
$ find .git/objects -type f #类型是文件的一共有4个,然后用cat-file查看类型和内容,一个commit,一个是blob,两个tree。
十.”detached HEAD”状态
1. “detached HEAD” 状态是什么?需要注意什么?
表示正工作在一个没有分支的状态下,比如不小心checkout到一个历史commit上,此时可以基于当前的commit继续变更或者commit,但是如果此时需要切到另一个分支master上修复一个bug,那么此时切分支时,刚刚工作的没有分支的状态上的commit就可能被git当作垃圾清理掉。这是分离头指针的危险的地方。
2.如何用好分离头指针?
有时想做一些尝试性的变更。可以用分离头指针,最后若想保留更改,那么可以根据warning 提示
3.分离头指针场景的演示
$git log #找到一个历史commit sddqde121
$git checkout sddqde121 #进入分离头指针状态,detached HEAD
- #修改一个文件
$git commit -am ‘Background to green’
$git log #发现这次commit只跟(HEAD)绑定在一起,而不是某个分支
十一. 理解HEAD和branch
1.创建新分支时,HEAD指向哪里?
$git checkout -b fix_readme temp #基于temp分支创建新分支fix_readme,并且切到了新的分支,此时HEAD指向fix_readme、temp
$cat .git/HEAD #refs/heads/fix_readme
2如何利用head比较两次提交的diff
$git diff HEAD HEAD~1 #将HEAD指向的commit与HEAD上一级指向的commit作对比
十二. 删除不需要的分支
1.如何查看当前仓库有哪些分支?
$git branch -av
2.删除分支
$git branch -d fix_readme # -D强制删除
十三. 修改commit的message
1.修改最新commit的message
$git commit --amend #进入vim编辑器,修改message
$git log -1
2.修改老旧的commit的message
$git rebase -i zqh3761zqiq # hash值是要变的commit的父亲,进入vim编辑器,读注释,改:reword/r,保存并退出,接着git会弹出一个新的交互界面,在上面更新message,再保存退出。此时
十四. 将多个commit整理成1个
1.将连续4次的commit整理成1个?
$git log --graph
$git rebase -i da123rqbdh #hash值是前4次commit的父亲,进入vim编辑器,读注释,选择4个中的一个commit为pick,其他三个修改为:squash/s,保存并退出。然后会进入一个新的vim编辑器,在上面第一行和第二行之间加入合并的message。再保存退出。
$git log --graph
2.将不连续的2个commit整理成1个
例如将最近一次commit和最远一次commit整理成一个
$git log --graph
Git rebase -i f2ed321 #由于最远commit没有父亲,因此这里的hash值是最远commit。进入vim编辑器,将最远commit按照格式pick在第一行,将最近一次commit的pick信息剪切到第二行,并把pick改成squash/s,保存并退出。出现warning,利用git status按照提示执行以下命令
$git rebase --continue #进入vim编辑器,在上面第一行和第二行之间加入合并的message。再保存退出。
$git log --graph
十五.比较不同区域的差异
1.比较暂存区和HEAD所指文件的差异?
$git status #工作区有一个文件被修改了
$git diff --cached
- #再次在工作区修改一下
$git add index.html
$git diff --cached
$git commit -m ‘Add the first command with config’
2.比较工作区和暂存区所指文件的差异?
$git diff #呈现工作区和暂存区所有的文件的差异
3.比较工作区和暂存区指定文件的差异?
$git diff -- readme.md #指定readme.md的差异,后面也可以添加一群文件,以空格隔开
十六. 让暂存区、工作区恢复
1.让暂存区恢复成和HEAD的一样
$git status #提示对于暂存区的内容,可以使用“git reset HEAD <file>…”命令让暂存区的指定文件恢复成与HEAD的一样
$git reset HEAD #将暂存区所有的变更都取消,保持与HEAD一致
$git diff --cached #此时暂存区与HEAD之间的差异应为 空
$git status #刚才的变更恢复到了工作区。疑问:会跟工作区发生冲突吗?
2.让工作区恢复成和暂存区一样
$git status #提示 用“git checkout -- <file>..”命令取消工作区的变更
$git checkout -- index.html # 将工作区的index.html文件恢复成和暂存区一样
3.取消暂存区部分文件的更改
$git reset HEAD -- style/style.css readme # style/style.css和 readme这两个文件都从暂存区撤销出来了
十七. 消除最近的几次提交commit
1.temp分支想要回到前两次的commit
$git checkout temp
$git log --graph
$git reset --hard 52djqwdoa #HEAD将指向hash值为52djqwdoa的commit,并且暂存区和工作区都将与该commit保持完全一致。慎用
十八. 查看不同commit的指定文件的差异
1.对两个commit或两个分支进行比较
$git log -n8 --all –graph #查看最近8次commit的情况
$git diff temp master #temp或者master可以换成对应的commit的hash值
2. 对两个commit或两个分支的指定文件进行比较
$git diff temp master -- index.html
十九.删除文件
$git rm readme
$git commit -m “remove readme”
二十.开发中途,遇到紧急任务,需要保留当前工作状态,怎么做?
1.保存当前工作状态,包括工作区、暂存区等
$git stash #保存当前状态进入一个堆栈
$git stash list #查看当前stash列表
$git status #当前工作区是干净的,clean
2.在当前工作区处理紧急任务
该修改修改,该提交提交
3.恢复原来的状态
$git stash apply #恢复状态,stash堆栈中的内容不删除
$git stash pop #恢复状态,stash堆栈中的内容删除
二十一.指定不需要git进行管理的文件
1.在仓库中新建文件“.gitignore”,只能叫这个文件名
2.在.gitignore文件中添加不需要git管理的文本或文件夹的通配符
例如,在该文件中,加入“package”表示不管理名为“package”的文件或文件夹;加入“package/”表示不管理文件夹“package”下的所有文件。
二十二.将git仓库备份到本地
1.备份的传输协议
2.本地备份
$cd backupForGit
$git clone –bare file:///c/Users/lincoco/Desktop/testgit/.git zhineng.git #--bare表示备份一个裸仓库,不包括工作目录
3.将/c/Users/lincoco/Desktop/testgit/.git的变更同步到备份zhineng.git
$cd testgit
$git remote -v #查看当前仓库关联的远端仓库
$git remote add zhineng file:///c/Users/lincoco/Desktop/backupForGit/zhineng.git #将当前仓库与zhineng.git建立remote关联,命名为zhineng
$git remote -v
#在当前仓库作变更
$git push zhineng #将当前仓库的变更push到远端仓库zhineng
二十三.关于github的使用
1.注册github账号
注册网址:https://github.com
点击sign up进行注册;点击sign in 进行登录
2.设置个人信息和帮助文档位置
页面右上角头像处
3.用ssh连接github,设置公私钥
本机的公私钥表明了本机的身份,本机的公钥可以配置在多个git仓库中。
- #查看本机是否已生成ssh key
$cd ~/.ssh #若该文件夹中存在id_rsa文件证明已生成公司钥,直接 cat id_rsa.pub就可以获取公钥
- #若本机不存在ssh key,生成公私钥
$ssh-keygen -t rsa -b 4096 -C “email地址”
接下来一路回车
- #复制公钥
#将公钥粘贴到github
在github右上角头像处点击“Settings”,再点击页面左侧“SSH and GPG keys”,点击“New SSH key”,黏贴。
#用SSH协议,在本机向github push时不用输入用户名密码。
4.在github新建一个仓库
- 在github首页左侧点击绿色按钮“new repositories”
- 初始化仓库,最后点击最下方绿色按钮
- 跳转到仓库详情页
5.将本地仓库同步到github(在本地仓库执行)
- $git remote -v #查看该仓库的远端仓库有哪些
- 将github的仓库添加为本地仓库的远端仓库,
$git remote add github git@github.com:lincoco/newRepositories.git #github是给这个关联关系取的名字,后面的ssh链接是在github仓库复制的ssh协议链接
$git remote -v #查看远端仓库有哪些,发现多了github
- $git push github --all #向远端仓库github push 所有本地分支;此时,master分支push会报错,其他分支可以正常push
原因如下:
- master分支在push之前,需要首先git fetch一下,获取远端存在本地不存在的文件
- 关于fast-forward:在master分支git fetch以后,查看本地的commit树(gitk --all),可以看到remotes/github/master和master两个没有共同历史的分支,是两个独立的树;这种情况下,本地master不能push到远端master,git认为本地master没有基于remote/github/master分支变更
解决方案:
$git branch -va #查看所有分支,包括远端仓库的分支
$git checkout master #git切换到master分支
$git merge github/master #与远端github的master分支进行合并,报错:两个历史不相干的分支无法进行合并,用 git merge -h查看有什么办法可以合并
$git merge -h #
$git merge --allow-unrelated-histories github/master #与远端github的master分支进行合并,此时的本地master有两个parent:远端master和原来的master
$git push github master #将本地master同步到github,此时查看github发现已更新
6.协同开发时,不同的人在同一分支修改不同文件
- 目前开发状态:github有一仓库newRepositories.git;本地有一仓库testgit与其是remote关系,有另一仓库testgit_01是从newRepositories.git clone下来的仓库;这两个本地仓库的用户名和email是不同的,代表两个共同维护newRepositories.git的开发者。
- 目前需要完成的工作:在github新建一个分支feature/fix_package;该分支由两个开发者同时维护;testgit修改readme文件;testgit01修改package文件;
- 在github新建分支feature/fix_package
- 在testgit 拉取github最新分支
$git fetch github
$git branch -av #查看当前testgit有哪些分支,发现新增远程fix_package分支
- 在testgit基于github/feature/fix_package新建本地分支feature/fix_package
$git checkout -b feature/fix_package github/feature/fix_package #此时testgit自动切换到新建的分支,并且该分支与远程的feature/fix_package建立了联系
- 在testgit仓库,修改readme文件并push到github
$vi readme
$git add -u
$git commit -m ‘tories to tory in readme’
$git push github
- 在testgit_01基于origin/feature/fix_package新建本地分支feature/fix_package
$git checkout -b feature/fix_package origin/feature/fix_package
- 在testgit_01基于仓库,修改package文件并push到github
$vi package
$git commit -am 'package to packages in package'
$git push #此时报错如下,origin(github)的该分支与本地有差异,需要先fetch一下
$git fetch
$git push #此时push,依然报错如下,这是当前本地的分支相较远程分支是滞后的,少一个commit,因此接下来作一次merge的操作
$git merge origin/feature/fix_package
$git push #push成功
- 查看github的 feature/fix_package的分支,可以看到两个开发者提交的内容都已更新
7.协同开发时,不同的人在同一分支的同一文件相同位置进行修改,冲突如何处理
- 开发状态接第6条,在此基础上,testgit仓库在package文件的第二行添加“python package”;testgit_01文件在package文件的第二行添加“java package”
- 在testgit仓库,修改package,在package文件的第二行添加“python package”,并push
$git pull
$vi package
$git commit -am 'add python package in package'
$git push
- 在testgit_01仓库,修改package,在package文件的第二行添加“java package”,并push
$vi package
$ git commit -am 'add java package in package'
$git push #报错,冲突了,如下:
$git pull #用git pull,提示merge冲突
##此时手动进入文件进行修改
$vi package #冲突显示如下,从head开始,对该文件进行修改并保存
$git status #查看状态
$ git commit -am 'resolved the conflict by hand in package'
$git status
$git push #成功
8.协同开发时,不同的人同时变更了文件名和文件内容如何处理?
- 开发状态接第6条,在此基础上,testgit仓库将package文件的文件名修改为packages,并push;testgit_01对package文件的内容作修改,并push
- 在testgit仓库,变更文件名
$git mv package packages
$git commit -am ‘Mv package to packages’
$git push
- 在testgit_01仓库,修改package文件中的内容
$vi package
$git commit -am ‘add “modified the context” in package’
$git push #报错
$git pull #本地文件名已更新,同时修改的文件内容也保存(这是git的一个优点,能够get到文件名的变更)
$git push #将更改的文件内容push到github
9.协同开发时,不同的人同时变更了文件名如何处理?
- 开发状态接第8条,在此基础上,testgit仓库将packages文件的文件名修改为packages1,生成commit,push到github;testgit_01将packages文件的文件名修改为packages2,并push,最终协商用packages1作为文件名。
- 同时git pull两个仓库
$git pull
- 在testgit仓库,修改文件名,并commit和push
$git mv packages packages1
$git commit -am ‘mv packages to packages1’
$git push
- 在testgit_01仓库,修改文件名,并commit和push
$ git mv packages packages2
$git commit -am ‘mv packages to packages2’
$git push #报错如下,需要先拉去远程仓库的更新
- 处理冲突
#用git pull 拉去远程更新,并合并
$git pull #报错,冲突
$git status #查看当前状态,发现packages被删除,同时新增了两个文件,一个是本地仓库改的packages2,另一个是远程仓库拉去下来的packages1
$ls -al #查看当前工作区的文件,发现两个文件同时存在
$ diff packages1 packages2 #查看两个文件的不同,输出为空,表明两个文件内容完全一样
#协商后,决定还是选用文件名packages1
$git rm packages
$ git rm packages2
$git add packages1
$git commit -am ‘decide to mv packages to packages1’
$git push #成功
10.在github删除一个仓库
- 在仓库详情页点击Settings
- 拉到页面最下方,点击“Delete this repository”
二十四.慎用的git命令和操作
1.git checkout
2.git reset
3.git push -f
在团队协同工作时需要强行禁止
4.协同工作时,禁止将公共的分支拉到本地后作rebase操作(历史不能被更改)
二十五.如何在github搜索?
1.UI界面按条件搜索
网址:https://github.com/search/advanced
界面:
2.在搜索框按创建时间搜索
created:<2019-12-01
3.直接在搜索框输入关键字,是什么搜索策略?
搜的是仓库的名称和描述
4.如何搜readme包含的关键字的仓库?
在搜索框中输入:git 资料 in:readme #查询readme包含关键字 “git”、“资料”的仓库
5.在搜索框中组合搜索
git 资料 in:readme stars:>50 #readme中包含“git”、“资料”并且stars数多余50的仓库
组合条件之间用空格隔开
6.如何找到与搜索相关的help?
网址:https://help.github.com/en/github/searching-for-information-on-github/
学习资料:
1.Git官网中文教程:https://git-scm.com/book/zh/v2