文章目录
前言:本博客是本人在学习git版本控制时的学习笔记,目的是为了快速上手同时回顾所学过程及快速查找有关git版本控制的相应命令。本文主要是参考自Git简介 - 廖雪峰的官方网站 ,同时补充了在使用过程中一些其他学习记录。若希望更详细的了解请自行跳转
Ⅰ Git 简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)可以有效、高速地处理从很小到非常大的项目版本管理。
Ⅱ Git 安装
-
windows上安装
从Git 官网直接下载安装程序,然后按默认选项安装即可。安装成功后,
开始菜单
-->Git
-->Git Bash
可以输入git --version
查看版本信息,是否安装成功
接着进一步设置$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
-
linux上安装
略
Ⅲ 创建仓库及开始使用
//创建git版本仓
$ git init .git //隐藏文件代表着成功创建版本库
//添加文件到git仓
$ git add XXX.txt //把文件添加到仓库
$ git add * / *.* //添加当前目录所有文件 / 添加指定格式文件
//查看仓库当前状态
$ git status
//查看详细差异
$ git diff xxx.txt
//提交版本
$ git commit -m "描述更改"
Ⅳ 时光穿梭
版本回退
//查看版本提交记录
git log
$ git log --pretty=oneline //缩略的版本提交记录信息
//查看回退的命令历史
$ git reflog
//HEAD 指向当前版本
//回退到指定版本/上一版本
$ git reset --hard commit_id / HEAD^
注意:每一次在工作区做的修改都需要 add到库的缓存区,然后确定无误,再commit。
工作区为本地.git所在目录文件夹,缓存区为git仓库缓存
撤销修改
//撤销工作区的修改
$ git checkout -- file
//撤销缓存区的修改
$ git reset HEAD <file>
即通过撤销缓存区的修改能回退到工作区的修改,再撤销工作区的修改能回到最初状态,若已经提交,则需要通过版本回退到上一个版本状态。
删除文件
//需要删除工作区且删除版本库
$ rm test.txt
$ git status
$ git rm test.txt
$ git commit -m "remove test.txt"
//误删了工作区文件
$ git checkout -- test.txt //用版本库的版本文件替换工作区的版本
Ⅴ 构建远程仓库
- 生成SSH Key公钥
$ cd ~
$ ssh-keygen -t rsa -C "youremail@example.com"
-
在GitHub管理个人公钥
登陆GitHub
-->setting
-->SSH and GPGkeys
-->"New SSH key
",添加描述,将 户主目录里 .ssh 目录中的id_rsa.pub里的内容粘贴到 “Key”, 最后Add SSH key
即可。 -
新建GitHub项目库
单机右上角+
号选择New repository
,按照步骤即可完成远程仓初始化 -
本地仓与远程仓连接
$ git remote add origin git@github.com:xxx/learngit.git //(远程仓增加 origin 分支,并链接到远程仓地址后面的地址请进入到远程项目库复制SSH.) //若不小心路径输入错误,再输入上面的命令时出现 fatal: remote origin already exists. 则将远程的origin主机删除 $ git remote rm origin
-
将本地仓的文件push到远程仓
$ git push -u origin master (将master分支上的推送到origin,保持同步,且同时指定origin为默认主机,-u选项会指定一个默认主机,后面的推送则可省略-u)
git提交远程报错[rejected] master -> master (fetch first)
错误原因 :是仓库中的代码和本地中的代码不一致导致
解决办法: 先将远程仓库中的代码pull下来(注意同名文件夹覆盖问题),再add
-commit
-再重复 push操作即可完成。
- 从远程仓库克隆
$ git clone git@github.com:xxx/gitskills.git
- push 和 pull用法
$ git push <远程主机名> <本地分支名>:<远程分支名> $ git push <远程主机名> <远程分支名>:<本地分支名> <来源地>:<目的地> $ git push -u origin master //将本地的master分支推送到主机的origin,并指定origin为远程主机 $ git push origin master 省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支通常两者同名),如果该远程分支不存在,则会被新建 $ git push origin //将当前分支推送到origin主机的对应分支 $ git push//如果当前分支与多个主机存在追踪关系,那么这个时候-u选项会指定一个默认主机,这样后面就可以不加任何参数使用git push 删除本地的远程分支 $ git branch -r -D origin/BranchName 远程删除git服务器上的分支: $ git push origin -d BranchName
Ⅵ 分支管理
当需要进行多人版本协作时,我们便需要创建多个分支共同管理
(注意:请不要直接在主分支上操作)
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
//创建并切换到指定分支
$ git checkout -b dev
($ git branch dev $ git checkout dev)
//查看当前分支
$ git branch
(列出所有的分支,带*为当前分支)
若在当前分支做了修改,则运行 add commitr
此刻 dev分支完成工作,
//切换至 主分支 master
$ git checkout master
//最后一步,将刚才dev的提交成果合并到master分支
<!--$ git merge dev -->
$ git merge --no-ff -m "merge with no-ff" dev
禁用fast forward为了便于查看合并记录,否则没有合并记录
//删除 dev分支
$ git branch -d dev
冲突解决
当有多个分支同时对一个文件都有新的操作,即自己的文件版本可能落后1个以上版本,则这时
//查看冲突
$ git status
$ git log --graph --pretty=oneline --abbrev-commit
//并手动解决冲突,解决冲突后再提交
分支管理策略
创建用于开发的次一级分支,所有人将修改并上dev分支,最后由管理人员合并到主分支。
Bug分支
Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
Ⅶ 多人协作
推送分支
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
抓取分支
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看:
$ git branch
master
而如果想在远程的dev分支上进行开发,则必须创建远程的`origin/dev`到本地
//查看远程分支
$ git branch -a
//创建于远程dev关联的分支
$ git checkout -b dev origin/dev
若推送失败,先解决冲突,先抓取文件,若pull失败,则查看是否没有连接。
//将本地的分支与远程分支链接
$ git branch --set-upstream-to=origin/dev dev
最后按照冲突解决办法解决
远程分支合并 (此操作必须由版本控制人员进行
)
-
clone项目到本地,此时默认会把master分支clone一份到本地。
-
本地分支上新建一个dev分支,名字和远程的dev一样,复制一份远程dev上面的代码,切换到本地master,合并本地dev。
-
解决合并过程中的冲突,之后Push到远程master,效果就是远程的dev合并到了远程的master上面。
回退自己的远程分支
如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。
-
查看提交记录获取id
$ git reflog
-
回退版本
$ git reset -- hard "id"
-
强制推送到远程分支
$ git push -f //因为本地分支落后远程分支,所以必须使用强制推送覆盖远程分支
回退公共的远程分支
- 队友使用git reset方法
假设分支方向是
A1 --> A2 --> B1
a 突然说他的A2提交错了,需要回退到A1,于是a回退了自己的仓库,并使远程公共仓回退到A1.则B1被覆盖
于是b
进入自己分支 如 B_dev
$ git reflog //查找自己被覆盖的id,以及当前的id,假设当前id为 bbbbb
$ git reset --hard B1
$ git checkout -b dev_copy //拉取新的分支记录当前位置
$ git checkout B_dev //回到自己的开发分支
$ git reset --hard bbbbb //回到自己分支的最前端
$ git reset --hard origin/master //将自己的master分支和远程对应分支保持一致
$ git checkout master //切换到master
$ git merge dev_copy 合并带有B1的分支到master
当然若队友并没有任何提交被覆盖掉,则只需要直接强制用远程master覆盖本地的master分支即可。
-
使用revert
revert用于撤回某次提交
$ git revert HEAD //撤销最近一次提交 $ git revert HEAD~1 //撤销上上次的提交,注意:数字从0开始 $ git revert 0ffaacc //撤销0ffaacc这次提交
Ⅷ Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线;
前提 :不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
-
合并多个commit为一个完整commit
当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。则可以使用命令
$ git rebase -i [startpoint] [endpoint] //合并多个分支
-i :–interactive,弹出交互式的界面让用户编辑完成合并操作。[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit