基本概念
git是什么
git是一个分布式版本控制工具
远程仓库是什么?
其实就是一个代码托管平台
- 常见的远程仓库
- github(国际)github.com
- gitee(也就是码云,国内的)gitee.com
GitHub概念
项目托管平台
仓库(Repository):就是项目,一般一个项目就是一个仓库,想要开源就必须创建仓库
收藏(Star):方便查看
克隆(Fork):复制克隆别人的项目,在你的仓库会有一个一模一样的,并显示来自于哪里,独立存在
- Pull Request:发起请求,可以将你修改的代码提交过去,需要别人同意才能完成合并
关注Watch:被关注的项目有任何更新都会提醒你
事务卡片(lssue):提交消息,相当于提建议,讨论
GitHub主页
仓库主页 :项目代码,版本,收藏,关注,fork
个人主页 :关注,我的仓库
基本操作
- git分为三个区域,分别是工作区,暂存区,版本库
- 工作区:当前工作的区域
- 暂存区:在工作区和版本之间,下次提交的更改选择性的暂时保存起来
- 版本库:commit之后就将代码添加到了版本库
- 文件的三种状态,已修改,已暂存,已提交
- 文件修改了就是已修改状态,使用了add命令文件就成了已暂存状态,使用commit之后就变成了已提交的状态
- 提交的时候经过暂存区,导出的时候不经过暂存区
git配置用户名和邮箱
git config --global user.name ‘username‘
git config --global user.email ‘email‘
git config --lsit 查看所有配置配置好就可以知道谁写的代码了
基本命令
git add filename 添加文件到暂存区
git add . 添加所有的文件到暂存区
git status 查看暂存区状态 (当前所在分支,已修改,已暂存,已提交等信息)
git commit -m ‘备注‘ filename 将暂存区的文件提交到本地仓库
git ls-files 查看本地仓库所有的文件
git log 查看所有提交信息 (版本号,commit备注内容等信息)
git log --pretty=oneline 之查看一行
git reflog 查看所有日志
git restore --staged filename1,filename2 可以跟多个文件,将文件从暂存区撤销,回退为追踪
git reset head filename 取消上一次操作,也可以从暂存区退回为追踪
这一系列操作都是在本地库
提交协议
提交的两种协议,一种是http/https协议 另一种是ssh协议
http/https协议提交需要登陆github账号,用户名和密码,比较麻烦
ssh协议提交需要设置密钥,一劳永逸
如何生成public key
ssh-keygen -t rsa -C "邮箱" 根据提示生成rsa公钥
ssh -T git@github.com 查看是否添加成功
版本比较
git diff a/filename b/filename 查看文件在工作区,暂存区,本地仓库有什么不同
- a/: 表示暂存区
- b/: 表示工作区
git diff head :比较工作树和最新提交
git diff --cached 仓库版本号 :比较仓库和暂存区
- --cached:表示暂存区,而版本号就是对应仓库里的版本号
git diff 版本号1 版本号2 : 比较两个不同版本之间的区别
版本回退
head是一个指针,默认指向当前版本,我们可以通过移动head指针来回退版本
--hard:参数表示回退版本库,暂存区,工作区(修改过的代码就没有了)
--mixed:回退版本库和暂存区
--soft:回退版本库
git reset --hard head~ 回退一个版本
git reset --hard head~~ 回退两个版本
git reset --hard head~10 回退十个版本
git reset --hard 版本号 回退具体版本
合并提交
用来解决合并次数太多的问题,将没必要的提交合并成一个提交,方便git log查看
git rebase -i 版本号:从当前head开始,到版本号的位置合并成一个提交
git rebase -i head~:当前head到上一个head合并成一个。
文件删除
手动删除只会删除工作树
git rm filename 工作区和暂存区没有了,但是版本库还有
然后 commit一下 本地版本仓库也就没有了
git checkout --filename : 从暂存区恢复被删除的文件
git rm --cached filename 只删除暂存区
git rm -f filename : 两个同名不同内容的文件都删除
重命名文件
手动重命名后使用 git status系统会出现错误信息, 系统会以为你删除了原来的文件,又新建了一个新文件
git mv odlfilename newfilename:重命名
忽略文件
不想要git来管理的文件,让git忽略此文件
echo *.temp > .gitignore :创‘’
分支
假设项目已经上线了,并且有大量用户在使用,但是后续还要添加功能,进行项目的版本更新,为了不影响用户的体验,所以我们需要从主干上创建一个分支,对分支(branch)进行开发,最后只需要合并主线(master)上就行了。
创建分支
git branch 分支名字: 一般起名feature-名字描述,并把当前head指针所指的版本复制到当前分支上
git checkout 分支名字: 切换分支,默认不切换还是在主线上,此时就可以在分支上操作了开发了,此时head指向当前分支,head指针永远在当前操作的版本上
git checkout -b branchname 创建分支并切换
git checkout master: 切换到主分支
git branch -a 查看本地与远程分支
git branch -m oldname newname 更改分支名字
git branch -M oldname newname 强制更改分支名字
git checkout -b local_branch origin/remote_branch (获取远程分支,并且在本地创建分支)
分支合并
git merge 分支名称:合并分支注意在master合并分支,千万不要再分支上合并分支
git push origin branchname 推送本地分支到远程仓库
分支冲突
从主干上创建了两个分支,各个分支更改了代码之后,都要在master上面合并分支,这时候就有了分支冲突。
只有第一个合并可以成功,后面的合并都不会成功,但是主干上的文件还是发生了变化,这时候就需要手动去修改,然后git add ...,git commit -m ’解决冲突’ ..去提交
谁创建的分支谁去解决冲突,这锅不能背
删除分支
git branch -d branchname 删除分支
git branch -D branchname 强制删除分支
git push origin :remote_name (删除远程分支,本地还保留)
远程仓库
克隆远程仓库
经过一系列的开发,程序终于开发完成了,就可以操作远程仓库进行托管了
git clone ‘url’ 将github上的文件下载下来 (如果报错了就将https换成github)俗称换协议
或者
git clone git://github.com/3dem/relion/git --depth 1 --depth 1 参数表示只获取默认分支的最新一次提交
git config --global http.postBuffer 524288000 增大缓存区大小
绑定远程仓库
git remote -v 显示所有的远程仓库
git remote show [remote] 显示远程仓库的信息
git remote add origin 地址 绑定远程仓库并起了一个别名origingit push -u origin master 将本地库origin推送到远程仓库的主分支
? 加了参数-u后,以后即可直接用git push 代替git push origin master
分支 push和pull
先绑定再使用push和pull方法
git push 本地库别名/origin 分支名字 推送本地库到远程分支
git checkout -b 远程分支名字/本地分支名字 拉去远程分支在本地创建同样的分支
git pull origin master:brantest 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master 若是远程分支与当前分支合并,那么冒号就可以省略