Git版本控制学习笔记


前言:本博客是本人在学习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 //用版本库的版本文件替换工作区的版本

Ⅴ 构建远程仓库

  1. 生成SSH Key公钥
    $ cd ~
    $ ssh-keygen -t rsa -C "youremail@example.com"
  1. 在GitHub管理个人公钥
    登陆GitHub --> setting -->SSH and GPGkeys -->"New SSH key",添加描述,将 户主目录里 .ssh 目录中的id_rsa.pub里的内容粘贴到 “Key”, 最后 Add SSH key即可。

  2. 新建GitHub项目库
    单机右上角 + 号选择 New repository,按照步骤即可完成远程仓初始化

  3. 本地仓与远程仓连接

    $ git remote add origin git@github.com:xxx/learngit.git 
     //(远程仓增加 origin 分支,并链接到远程仓地址后面的地址请进入到远程项目库复制SSH.)
     
     //若不小心路径输入错误,再输入上面的命令时出现
     fatal: remote origin already exists.
     则将远程的origin主机删除
    $ git remote rm origin
    
  4. 将本地仓的文件push到远程仓

    $ git push -u origin master
    (将master分支上的推送到origin,保持同步,且同时指定origin为默认主机,-u选项会指定一个默认主机,后面的推送则可省略-u)
    

  git提交远程报错[rejected] master -> master (fetch first)
  错误原因 :是仓库中的代码和本地中的代码不一致导致
  解决办法: 先将远程仓库中的代码pull下来(注意同名文件夹覆盖问题),再add -commit -再重复 push操作即可完成。

  1. 从远程仓库克隆
    $ git clone git@github.com:xxx/gitskills.git
    
  2. 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
最后按照冲突解决办法解决

远程分支合并 (此操作必须由版本控制人员进行)

  1. clone项目到本地,此时默认会把master分支clone一份到本地。

  2. 本地分支上新建一个dev分支,名字和远程的dev一样,复制一份远程dev上面的代码,切换到本地master,合并本地dev。

  3. 解决合并过程中的冲突,之后Push到远程master,效果就是远程的dev合并到了远程的master上面。

回退自己的远程分支

 如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了。

  1. 查看提交记录获取id

      $ git reflog
    
  2. 回退版本

     $ git reset -- hard "id"
    
  3. 强制推送到远程分支

     $ 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进行修改(你自己一个人玩的分支除外)

  1. 合并多个commit为一个完整commit

      当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。

    则可以使用命令

    $ git rebase -i  [startpoint]  [endpoint]	//合并多个分支
    

    -i :–interactive,弹出交互式的界面让用户编辑完成合并操作。[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值