Git--版本管理

SVN冲突:避免冲突, 及时提交、更新

git:版本控制软件

分布式版本控制软件

命令:

git add:将本地文件 增加到暂存区
git commit:将暂存区的内容 提交到 本地仓库(本地分支,默认master分支)
git push:将本地仓库的内容 推送到  远程仓库(远程分支)

git pull:将远程仓库(远程分支)的内容 拉取到  本地仓库(本地分支)

安装git

 msysgit.github.io

安装时:  Use git from git bash only..,其他默认下一步
配置path: E:\programs\Git\bin
配置git:用户名和邮箱
右键-git bash
git config --global user.name "yq"
git config --global user.email "157468995@qq.com"

查看C:\Users\YANQUN\.gitconfig

搭建git服务器(远程仓库) :统一的托管网站(https://github.com/)

为了 在本地 和远程仓库之间进行 免密钥登录,可以配置ssh 

ssh:本地-远程

配置ssh:先在本地配置,发送给远程

现在本地生成ssh:
ssh-keygen -t rsa -C 157468995@qq.com  一直回车
发送给远程:
github - settings - SSH and ... - New SSH  - title任意、key中输入 刚才在本地生成的ssh:
将本地刚才生成的id_rsa.pub内容复制到远程的Key中

测试连通性:
ssh -T git@github.com

如果本地和远程成功通信,则可以在 /.ssh目录中 发现known_hosts文件
如果失败:多尝试几次 、检查回车符

在本地新建git项目

在项目根目录  右键 - git bash - git init

在远程建立git项目
new-建立项目- 生成  https://github.com/yanqun/mygitremote.git

本地项目-远程项目关联
git remote add origin git@github.com:yanqun/mygitremote.git

第一次发布项目 (本地-远程)
git add .      //文件-暂存区
git commit -m "注释内容"  //暂存区-本地分支(默认master)
git push -u origin master


第一次下载项目(远程-本地)
git clone git@github.com:yanqun/mygitremote.git

提交(本地-远程)
(在当前工作目录 右键-git bash)
git add.
git commit -m "提交到分支"
git push  origin master


更新(远程-本地)
git pull


Egit:在Eclipse中操作git

目前的eclipse基本都支持git,如果不支持 则到eclplise marktplace 搜git安装
配置:
a.team-git-configuration -邮箱 用户名
b.general -network -ssh2选中 生成的ssh目录

第一次发布
share project
加入暂存区add to index
提交到本地分支commit 
将项目推送到远程      右键-team -remote -push ---


提交
team-add to index
team -commit
team -push


commit时:
commit and push 或commit按钮的区别:
commit按钮:不能单独的Push某一个文件,只能Push整个项目
commit and push:可以 单独Push某一个文件


第一次下载
import -clone -输入 https/ssh的唯一标示符


更新
team - remote -pull


git冲突的解决:

发现冲突:    进入同步视图  右键——team - synchronized...
解决:
    添加到本地暂存区 add to index
    提交到本地分支 commit
    更新服务端的分支内容  到本地分支 pull
    修改冲突:直接修改 或者 merge tool
                (--->已经变为了普通本地文件)
    add to index
    commit push

git多个人 团队协作开发


github中 该项目 -settings
增加合作者: Collaborators 加入 合作者:github 全名或邮箱

发送邀请链接
合作伙伴: 打开该链接、接受邀请 :合作开发....clone项目、修改、add \commit\push

 

git:分布式版本控制系统

https://git-scm.com/

git : [g i: t]

Linux系统  -> BitKeepper(2005收费)

Linux系统 ->Git  


版本控制系统:集中式版本控制(cvs  svn)  分布式版本控制(git)


git优势:
    本地版本控制    重写提交说明    可以“后悔”   分支系统 

svn:
    a.txt  "这是我的文件"
git    a.txt  "这是我的文件"  -》a.txt  "这是我的第一个文件"


svn:增量
git:全量(每一个版本都包含全部的文件,时刻保持数据的完整性)

git三种状态(个人理解:四种)

(已管理)
已修改(modified)
已暂存(staged)
已提交(commited)

将某个目录纳入git管理: git  init  (默认master分支)
.git: git版本控制的目录


暂存区->工作区
git rm --cached


git log:查看提交日志

git log -最近的次数

git log --pretty=oneline
git log --pretty=format:"%h - %an ,%ar : %s"

commit eb125a18e9b9d7ffeb2e30236ce5fbe6d6d110ce 

eb125a18e9b9d7ffeb2e30236ce5fbe6d6d110ce  :sha1计算的结果  
sha1 、md5  加密算法  、随机数 ,用于区分 是哪一次的提交(并且不重复)


分布式id生成器

设置邮箱、用户名:

1git config --global  (基本不用,给整个计算机一次性设置)

2git config --system  (推荐,给当前用户一次性设置)  ~.gitconfig

3git config --local  (给当前项目一次性设置)    .git/config 
 
优先级3》2》1

git config --local user.name '颜群'
git config --local user.email '157468995@qq.com'

git config --local user.name 'yq'
git config --local user.email '18092788808@qq.com'

给当前用户设置邮箱名字:
/c/Users/YANQUN/.gitconfig

简单粗暴
删除git config --local --unset user.name

操作:

  如果某个文件 已提价,并且对其进行了修改。可以放弃修改(还原到已提交状态)
: git checkout -- hello.txt

提交问题:
    只对修改之后 的提交有效。修改之前的 提交 仍然使用的是之前的 配置(用户名、邮箱)
    双引号可省

删除已提交的文件:

git rm  x  :  1.删除   2.暂存区
删除之后 文件被放到 暂存区

彻底删除: git commit -m "彻底删除b" ;
git rm后悔:
    1.恢复到工作区git reset HEAD hello.txt  2.git checkout -- hello.txt

操作系统删除  rm  :1.删除  2.工作区


    git mv 重命名
    mv

注释重写(重写提交说明)
正规 : git commit --amend -m '修正'


忽略文件:.gitignore


通配符 :

*任意字符


*.properties

!b.properties

dir/:忽略dir目录中的所有文件

dir/*.txt

dir/*/*.txt  :能够忽略 dir/abc/a.txt   dir/xyz/a.txt ,不能 dir/xyz/123/a.txt 
dir/**/*.txt   :任意级别目录

空目录:默认就是忽略的


分支

查看分支 git branch
创建分支 git branch 分支名
切换分支 git checkout 分支名
删除分支 git branch -d 分支名  (不能删除当前分支)
    其他不能删除的情况: 包含 “未合并”的内容,删除分支之前 建议先合并

强行删除git branch -D 分支名
细节:
    1.如果在分支A中进行了写操作,但此操作局限在工作区中进行(没add commit)。在master中能够看到该操作。  如果分支A中进行了写操作  进行了commit(对象区),则master中无法观察到此文件
    2.如果在分支A中进行了写操作,但此操作局限在工作区中进行(没add commit)。删除分支A 是可以成功的。


创建新分支 并切换 :git checkout -b 分支名

git checkout -b new_branch

合并 git merge new_branch

git branch -v


分支:一个commit链,一条工作记录线

分支名(master) :指向当前的提交(commit)
HEAD:指向当前分支(HEAD->分支名)

    
如果一个分支靠前(dev),另一个落后(master)。则如果不冲突, master可以通过 merge 直接追赶上dev,称为 fast forward。  
fast forward本质就是 分支指针的移动.注意:跳过的中间commit,仍然会保存。
fast forward: 1. 两个分支 fast forward 归于一点commit
           2.没有分支信息(丢失分支信息)

git在merge 时,默认使用fast fast forward ;也可以禁止 : git merge --no-ff
        1. 两个分支 fast forward ,不会归于一点commit (主动合并的分支 会前进一步)
        2.分支信息完整(不丢失分支信息)

合并:

merge more采用ff.

合并:如果冲突  ,需要解决冲突。
    解决冲突:git add  xxxx ,git commit -m  "xx"
    git add  xxxx(告知git,冲突已解决)
    注意:master在merge时 如果遇到冲突 并解决,则解决冲突 会进行2次提交: 1次是最终提交,1次是将对方dev的提交信息commit也拿来了

如果一方落后,另一方 前进。则落后放可以直接通过merge合并到 前进方。


git log --graph
 git log --graph --pretty=oneline --abbrev-commit


合并add 和commit:
git commit -am '注释'

版本穿梭:

在多个commit之间 进行穿梭。 回退、前进

回退到上二次commit:  git reset --hard HEAD^^

回退到上n次commit: git reset --hard HEAD~n

跳转到任意一次commit: 通过sha1值 直接回退  git reset --hard sha1值的前几位  ,需要结合git reflog使用。


git reflog:查看记录,记录所有操作。可以帮助我们 实现“后悔”操作。需要借助于 良好的 注释习惯

checkout:放弃修改。放弃的是 工作区中的修改。  相对于暂存区或对象区
    
reset: 将之前增加到暂存区中的内容 回退到工作区

checkout:

git checkout sha1值
版本穿梭(游离状态)
    1.修改后、必须提交
    2.创建分支的好时机 git branch mybranch 2735603
    git chekcout mybranch;
    git chekcout master;


分支重命名:
    git branch -m master master2


stash:保存现场

    1.建议(规范) :在功能未没有开发完毕前,不要commit
    2.规定(必须) : 在没有commit之前,不能chekcout切换分支 (不在同一个commit阶段)
如果还没有将某一个功能开发完毕  就要切换分支:建议 1.保存现场(临时保存,stash)  2.切换


保存现场:git stash 
还原现场(默认还原最近一次):
    git stash pop (将原来保存的删除, 用于还原内容)
    git stash apply(还原内容,不删除原保存的内容),可以指定某一次现场git stash apply stash@{1}

        手工删除现场:git stash drop stash@{0}


查看现场:git stash list


    (了解即可) 如果不同的分支 在同一个commit阶段在,在commit之前,可以chekcout切换分支


Tag标签 :

适用于整个项目,和具体的分支没关系
git tag xxx
git tag -a xxx -m "xxxx"
查看标签git tag
删除标签 git tag -d 标签名
    
    
blame:责任

git blame a.txt  查看a.txt的所有提交commit sha1值,以及每一行的作者

差异性diff  a.txt b.txt
@@ -4,4 +4,6 @@
4:从第4行开始,6 比较6行
-:原文件
+:对比的文件

diff:比较的是文件本身
git diff :比较的  区中的文件

git diff :暂存区 和工作区的差异
工作区 和 某个对象区的差异


git diff commit的sha1值: 对象区和  工作区的差异
git diff commit的sha1值:最新 对象区和  工作区的差异

git diff --cached commit的sha1值 : 对象区和  暂存区的差异

git diff --cached HEAD : 最新对象区和  暂存区的差异


push:本地->github
pull:github->本地 , pull = fetch + merge


rm -rf * :当前目录中的文件、子文件目录全部删除(不会删除隐藏文件、不过回收站)
.....rm ..... -rf / ......:不要执行,删除整个计算机中的全部文件


github的仓库中,默认的说明文档README.md


推送:

git remote add origin https://github.com/yanqun/git2019.git
(ssh)git remote add origin git@github.com:yanqun/git2019.git


git remote add  :    origin  --   https://github.com/yanqun/git2019.git

(master)
git push -u origin master

后续修改推送时  只需要git push

ssh配置: 本地 私钥 ,远程github存放公钥

ssh-keygen  生成:私钥(本机)  公钥(github)

可以将公钥 存放在github中的两个地方:
    项目的setting中,只要当前项目可以和 本机 免秘钥登录
    账号的settings中, 账户的所有项目 都可以和本机免秘钥


注意:远程增加ssh的公钥时  1删除回车符  2可写权限

    dev:开发分支,频繁改变
    test:基本开发完毕后,交给测试实施人员的分支
    master:生产阶段,,很少变化

dev -> test (merge dev) -> master (merge test ) -> ....

    bugfix:临时修复bug分支


git remote show


git remote show origin

git会在本地维护  origin/master分支,通过该分支 感知远程github的内容
 origin/master一般建议 不要修改,是一个只读分支

pull/push:推送,改变指针

Fast-forward :更新, 如果发现 更新的内容 比自己先一步(commit 的sh1值 在自己之前),则 会自动合并


冲突:

fetch first
git pull

 pull = fetch + merge  


有冲突:  
pull =fetch + merge

 merge: vi 解决冲突 ->   git add . ->commit

总结:
pull -> vi -> add -> commit ->push

pull =fetch + merge

图形化工具

git gui  : gitk 、gui 、github desktop

git log
查看github分支的日志:git log refs/remotes/origin/master

分支:就是一個指針,commit的sha1值


分支:

  git branch -av
 本地->远程:
    git push
    方法一:(dev)
    git push -u origin dev
    方法二:    
    git push --set-upstream origin test

      git branch -av
 远程->本地
    1.pull  :远程->追踪
    2. 追踪->本地
        方法一:
            git checkout -b dev origin/dev
        方法二:
            git checkout -b test--track origin/test
            git checkout --track origin/aaa

===

删除分支:
git branch -d 分支名

git push origin src:dest
删除远端分支  git push origin  :test
          git push origin --delete dev


git push origin src:dest
git push origin dev:dev2
git push origin HEAD:dev2


git pull  origin ccc2:ccc3  ,相当于  git  pull  +  :  git checkout -b dev origin/分支名


本地没有a分支,但本地却感知远端的a分支。  
检测: git remote prune origin --dry-run

清理无效的 追踪分支(本地中感知的远程分支)    
git remote prune origin


将远端分支 拉去到本地某个新分支 :

给命令起别名:git config --global alias.ch checkout


标签

git tag

git tag v1.0   简单标签,只存储当前的commit的sha1值
git tag -a v2.0 -m "我的v.2.0版本"   (创建一个新对象,会产生一个新的commit/sha1)存储信息,其中包含了当前的commit的sha1值

v1.0 : 8c3512547
v2.0 :  aaaa(8c3512547)

推送标签


git push origin v1.0 v2.0  

git push origin --tags

git push origin v1.0
完整git push origin refs/tags/v1.0:refs/tags/v1.0

获取远程标签

git pull  :如果远端新增标签,则pull 可以将新增的标签拉去到本地;如果远程是删除标签,则pull无法感知
git fetch orgin tag v4.0

删除远程标签
git push origin  :refs/tags/v1.0

注意:如果将远程标签删除,其他用户无法直接感知 


git gc :压缩 

objects、refs中记录了很多commit的sha1值,如果执行gc 则会将这么多sha1值 存放到一个 压缩文件中packed-refs


refs :标签、head、remote
objects:对象 ,git 每一次version的全量内容

git裸库
   没有工作区的 工作仓库 ,存在于服务端


submodule :子模块

    应用场景 :在一个仓库中 引用另一个仓库的代码。


 

在github上如果新建项目,并且ssh连接 则必须配置ssh
第一次:仓库地址、分支


git remote add origin git@github.com:yanqun/A.git

git push -u origin master

--

git remote add origin git@github.com:yanqun/B.git


A中有B库,但B  push之后 A无法直接感知  ,需要主动操作:pull
        1.进入A/B中pull
        2.直接在A中 迭代pull(将A中的所有submodule全部pull): git submodule foreach git pull


            

B:修改->push->    A(本地+远程)无法感知

本地pull : 本地有, A的远程没  :  本地add ..commit ->push

如果push  B,则 B本身能够感知 ;但是A中的B不能直接感知


如果clone的项目包含submodule,则clone方法:
git clone git@github.com:yanqun/A.git --recursive

工作区
rm -rf B
暂存区    
git rm --cached B

->commit .  push.

建议:submodule 单向操作

substree:双向、简单

SSH
(父)指定仓库地址
git remote add origin git@github.com:yanqun/parent.git

再指定分支
git push -u origin master


(子)
git remote add origin git@github.com:yanqun/subtree.git
git push -u origin master


(父-子)
git remote add subtree-origin git@github.com:yanqun/subtree.git
git subtree add -P subtree subtree-origin  master 等价 git subtree add --prefix subtree subtree-origin  master


另一种方式
git subtree add -P subtree2 subtree-origin  master --squash


--squash:合并commit,为了防止 子工程干扰父工程

squash:减少commit的次数

父- 子
git log
    子:  a,b,c,d,e  5commit  subtree
--squash               ->f  合并1次提交, 1次新的提交          subtree2

加了squash之后:1 会产生新的提交(很容易冲突)  2往前走两步commit   

--结论: 在做subtree
    如果加squash,以后每次都加 (git subtree开头的命令,要么都加  要么都不加)
     如果不加,都不要加

    -如果是同一个祖先,则可能不会冲突 。。    
    -如果不是同一个祖先,很可能冲突 
    在subtree  submodule容易冲突(有2个跟解决) -> vi add commit push 

    核心流程:
        子->父中子 有反应
        1.修改子工程 push    
        2(本地)将github中的子工程更新到 父中子模块
             git subtree pull -P subtree subtree-origin master

        3.父中子模块 的更新情况 推送到 对应的github上(父-子)
    
            
修改 父工程中子模块->子模块

    如何将 本地修改的内容(父-子)  推送到 远程中真实的子模块中:
    git subtree push -P subtree subtree-origin master

如果要操作  真实的子模块: git subtree pull/push -P

冲突:修改同一文件的同一行、不是同一祖先、不规范 


cherry-pick :如果写了一半(已经提交),发现写错分支,需要将已提交的commit转移 分支
    每次只能转移(复制)一个commit ,内容会被复制,但是sha1会变
思路: cherry-pick  复制到应该编写的分支上;把写错分支删除(checkout 旧节点,删除分支);新建分支
    cherry-pick  在复制的时候,不要夸commit节点复制

rebase:变基(衍合) :改变分支的根基
 

  编写代码的地方

    rebase会改变提交历史
    rebase之后的提交线路 是一条直线


如果B转到A ;  
    cherry-pick:在A中操作
    rebase:在B中操作
git rebase 转移的分支名


rebase也会冲突:
    a.解决冲突
         vi ... add .    git rebase --continue
    b.忽略冲突(放弃rebase所在分支的修改,直接使用其他分支)
             git rebase --skip

终止,还原成rebase之前的场景
     git rebase --abort

建议:
    reabase分支 只在本机操作,不要推送github
    不要在master上直接rebase

git  - gradle 

jar :maven 

gradle ->Maven   


下载、解压缩


gradle ->maven
gradle实际是在maven仓库中获取 jar 

pom.xml  - build.gradle
配置jdk
cmd开发:
  GRADLE_HOME:gradle安装目录
  GRADLE_USER_HOME   本地仓库(本地存放JAR的目录)
  PATH:
    %GRADLE_HOME%\bin

idea开发    (本地仓库)
    idea:settings-gradle :Service directory path


    
web服务器?
        
    gradle或maven中 可以通过编码配置 产生web服务器环境 
    
    gradle:gretty
gretty -》tomcat

appRun    
appRunDebug
    --结束: 按任意键

appStart    
appStartDebug
    --结束:appStop


自动生成的文件
1.
@WebServlet(name = "MyServlet")
改成@WebServlet(urlPatterns = "/MyServlet")
2.
  metadata-complete="false">


运行:gradle appRun    、gradle appStart    -》直接访问


调试:    1配置 
        debugPort = 8888   (5005)
           debugSuspend = true
    2.gradle appRunDebug/gradle appStartDebug
    3.监听服务
        配置 Configuration - Remote  : 8888 
       启动调试

    4.访问


在idea中使用git托管项目(版本控制)
    将idea中默认的cmd更换 bash.exe  重启


GitLab


下载gitlab-ce-11.9.0-ce.0.el7.x86_64.rpm 

下载地址https://packages.gitlab.com/gitlab/gitlab-ce


搭建centos7  、阿里云centos7


centos6 -> centos7
centos7和centos6在安装配置时  只有以下3点不一样:
1
    hostnamectl set-hostname bigdata02    
2
    网卡ifcfg-ens33
    centos7不需要删除70-persistent-net.rules
    
3
    systemctl start  firewalld
    systemctl stop firewalld

    

如果都不会搭建,上网搜资料

gitlab ->centos 7


gitlab ee(收费)  

gitlab ce


安装说明https://about.gitlab.com/install/
        1. Install and configure the necessary dependencies
        2  离线安装
            rpm -ivh gitlab-ce-11.9.0-ce.0.el7.x86_64.rpm
        3.  
         EXTERNAL_URL="http://centos7的IP"    
                 EXTERNAL_URL="http://192.168.2.129"    

                 修改配置文件
        /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
                host:centos7的IP

            
         gitlab-ctl reconfigure

    补救     本机的hosts文件中 增加映射 192.168.2.129  gitlab.example.com
        启动
            gitlab-ctl start/stop
            
        关闭防火墙
        访问服务的地址 192.168.2.129  root 设置密码

gitlab-ctl restart


后续 就可以在 gitlab中 进行团队开发(group项目 )   、 自己学习private


如果“另一个应用程序是:PackageKit”
解决:
/etc/yum/pluginconf.d/langpacks.conf       enabled = 0 ;     yum update  -> reboot

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值