zoukankan      html  css  js  c++  java
  • 48 git使用

    0 引言

    git/github是当前最好的代码版本管理和协同工作工具。最近我终于用上了这一先进工具,撒花撒花!

    # 先把大神廖雪峰的链接献上
    https://www.liaoxuefeng.com/wiki/896043488029600
    # 官方教程
    https://git-scm.com/

    1 配置git使用环境

    git的使用环境主要包括git的安装、设置SSH公钥和私钥、添加到github账号、测试连接,参考了如下链接。

    http://bitjoy.net/2018/11/13/ubuntu%E4%B8%8B%E4%BD%BF%E7%94%A8vscode%E8%BF%9E%E6%8E%A5github/

    一步一步来就行了,非常简单。

    # 设置并确认 username in git 
    $ git config --global user.name "Mona Lisa"
    $ git config --global user.name
    > Mona Lisa
    
    # 设置并确认commit email address in Git
    $ git config --global user.email "email@example.com"
    $ git config --global user.email
    > email@example.com
    
    # 查看git 配置
    $ git config --list --show-origin # 可以看到文件存放位置,user.name, user.email等信息
    # 生成一个新的SSH key并添加到 ssh
    -agent中 $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 接下来跟着操作就行,需要设置路径、输入 passphrase等

    # 查看本机公钥
    a. 打开你的 git bash 窗口
    b. 进入 .ssh 目录:cd ~/.ssh
    c. 找到 id_rsa.pub 文件:ls
    d. 查看公钥:cat id_rsa.pub 或者 vim id_rsa.pub
    # 将SSH key添加到ssh-agent中
    $ eval "$(ssh-agent -s)"
    $ ssh-add ~/.ssh/id_rsa
    
    # 测试链接是否成功
    $ ssh -T git@github.com

    2 git关联和推送到远程仓库

    (1)将git本地项目提交到远程仓库

    # 进入项目文件夹,通过命令git init将项目初始化成git本地仓库
    $ git init
    
    # 将项目内所有文件都添加到暂存区
    $ git add .
    
    # 对本次的提交进行备注,以便后期版本回退等操作
    $ git commit -m 'xxx'           //xxx是本次提交备注的内容
    
    # 在github上新建一个仓库,复制仓库地址,然后使用命令将本地仓库与远程仓库建立连接
    $ git remote add origin  xxx       //xxx是git仓库的地址
    
    # 将暂存区的文件推送至远程仓库(使用强制推送'-f'是因为一般新建仓库的时候会生成read me文件,导致需要先git fetch才能推送,但这个read me文件其实是不需要的,因为在生成本地项目的时候一般也会生成一个read me文件,所以选择直接强制推送过去。)
    $ git push origin master -f  # 不用-f比较好,因为正常的流程是要在自己的本地解决掉所有的 merge conflict 之后才能 push 到 remote 的。鲁莽的 push -f 确实很容易激怒别人,同时也会很大风险把别人有价值的 commit 都覆盖清空了

    (2)下载远程仓库到本地

    $ git clone git@github.com:2017Greg/geometry-processing-registration.git 

    3  初始化、提交、回退操作

    (0)初始化本地仓库

    # 建立本地仓库与远程仓库之间的连接关系
    $ git init $ git remote add origin https:
    //gitee.com/用户个性地址/HelloGitee.git

    (1)将远程仓库pull到本地仓库

    # 将远程仓库下载下来
    $ git clone https://gitee.com/用户个性地址/HelloGitee.git #将远程仓库克隆到本地

    (2)将本地仓库push到远程仓库

    $ git add . #将当前目录所有文件添加到git暂存区
    $ git commit -m "my first commit" #提交并备注提交信息
    $ git push origin master #将本地提交推送到远程仓库

     (3)github的版本回退与逆回退功能

    # git中用 HEAD表示当前版本,也就是最新的提交;
    # 上一个版本是HEAD^,上上一个版本是HEAD^^
    # 上100个版本是 HEAD~100
    
    # 回退到上一个版本
    git reset --hard HEAD^
    
    # 回退到指定版本
    git reset --hard  1094a***  ## hard后边是版本号,不需要写完全
    
    
    # 逆回退操作
    git reflog
    
    e475afc HEAD@{1}: reset: moving to HEAD^
    1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
    e475afc HEAD@{3}: commit: add distributed
    eaadf4e HEAD@{4}: commit (initial): wrote a readme file
    
    
    git reset --hard 1084adb  #回退到了指定的版本

     4 过滤/跟踪某些文件的操作: .gitignore

    (1).gitignore文件的创建

    // .gitignore 的创建
    // 进入git bash, 进入项目所在目录
    
    $ touch .gitignore   // 创建一个.gitignore文件 接下来对该文件进行编辑

    (2)编辑.gitignore设置过滤/跟踪件,执行的顺序有先后,以最后一次执行判断是过滤还是跟踪

    # 表示过滤这个文件夹
    /mtk/   
    
    # 表示 过滤这种类型的文件  
    *.zip      
    *.rar 
    *.exe
    *.txt
    *.dll
    
    # 指定过滤某个文件
    /mtk/do.c
    /mtk/if.h
    
    # 设置跟踪某个文件夹
     !/plutommi/mmi
    
    # 设置跟踪某类文件
     !*.c
     !*.h
    
    #跟踪某个指定的文件
    !/plutommi/mmi/mmi_features.h

     (3).gitignore失效的解决方案

    问题:在使用git进行版本控制,执行一下命令时
    $ git add .
    $ git commit --m "test"
    $ git status
    $ git push origin master
    发现想被忽略提交的文件仍在会被提交,也就是说实际并没有被忽略
    
    原因:git ignore 只会对不在git远程仓库中的文件进行忽略,如果这些文件已经在git仓库中了,则不会忽略。所以如果需要忽略的文件已经提交到远程仓库了,则需要从从远程仓库中删除,.gitignore才能实际生效。
    
    $ git push/git clone将远程仓库的代码同步到本地
    $ git rm file/to/be/ignored -r
    $ 修改.gitignore中的内容
    $ git add .  + git commit + git push 

     5 Git多人协作

     (1)基本模式:

    1 管理员创建一个项目,放在github或者gitee上
    2 git clone ssh 下载到本地
    3 修改,git add . -> git commit -m "first commit" -> git push origin master
    # 其它人加入到项目中称为管理员
    4 git clone ssh_address
    5 git pull origin master
    6 修改
    7 git add . -> git commit -m "first commit" -> git push origin master

     (2)git中https 和 ssh的区别

    # clone项目时
    使用ssh方式时,需要配置个人的ssh key, 并将生成的ssh公钥配置到git服务器中。而对于https方式来讲,就没有这些要求。
    
    # push到远程服务器时
    使用ssh方式时,是不需要验证用户名和密码的,如果你在配置ssh key时设置了密码,则需要验证密码。而对于使用https方式来讲,每次push都需要验证用户名和密码。

     6 git log查看提交历史

    # 将每个提交放在一行显示
    $git log --pretty=oneline
    # 退出git log或者vim编辑器
    $ Q

     7 git branch 分支操作

    (1)分支策略:盗用廖雪峰的一张图解释一下

     master是稳定版本,也就是仅用来发布新版本,平时不能在上面干活。干活的时候都在dev分支上,也就是说dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本。 而每个人平时都在自己的dev分支上干活,时不时往dev分支上合并就可以了。

    (2)常见操作

    https://www.cnblogs.com/chechen/p/9950798.html

    # 第一个操作:我在远程建了一个分支,想pull到本地,此时本地没有同名分支
    (1)远程建立分支:手动搞,名为 dev
    (2)查看远程分支:
    $ git branch -a # 加上-a可以查看远程分支,远程分支会用红色表示出来
    (3)将远程分支拉取到本地
    $ git checkout --track origin/dev
    (4) 可能会报错,报错信息如下:
    fatal: 'origin/hotfix_20180820' is not a commit and a branch 'hotfix_20180820' cannot be created from it
    解决方案:
    $ git pull # 重新拉取数据
    $ git checkout --track origin/dev

    # 第二个操作:我将本地分支推送到远端,并跟master合并
    (1)确定当前分支
    $ git branch
    (2)切换本地分支
    $ git checkout dev
    (3)推送到远端仓库 有三种情况 https://blog.csdn.net/torpidcat/article/details/81252505
    (3.1)远程已有remote_branch分支并且已经关联本地分支local_branch且本地已经切换到local_branch
    $ git push
    (3.2)远程已有remote_branch分支但未关联本地分支local_branch且本地已经切换到local_branch
    $ git push -u origin/dev
    (3.3)远程没有remote_branch分支并,本地已经切换到local_branch
    $ git push origin dev:origin/dev

    # 第三个操作:我在本地建立了一个分支,并推动到远端
    (1)创建本地分支
    $ git checkout -b dev
    (2)查看本地分支的状态
    $ git branch
    (3)将本地分支推送到远端
    $ git push origin dev:dev
    如果不行的话,尝试
    $ git push --set-upstream origin dev
    可以在自动在远程创建一个 dev分支,然后本地分支会track该分支。
    (4)查看远程分支
    $ git branch -a
    (5)
    删除远程分支
    $ git push origin :dev
    $ git push origin -d dev

    # 第四个操作:合并远程分支
    (1)把代码clone到本地仓库
    $ git clone https://gitee.com/zhanghan_123/gittest.git
    (2)在本地创建dev分支并与远程dev分支对应
    $ git checkout -b dev origin/dev
    (3)切换到master分支
    $ git checkout master
    (4)本地的dev合并到master上(如果遇到冲突解决完后再次提交即可)
    $ git merge dev
    (5)推送到远程的master上
    $ git push origin master

     8 回滚操作

    (1)commit的回滚

    # 首先查看最近的commit
    $ git log
    
    # 然后回滚,回滚到指定的commit 用软回滚不影响目录下的文件
    $ git reset --soft  %目标的SHA1值%
    
    # 回滚n次
    $ git reset HEAD^       # ( 回滚几次加几个 '^')

    9 git tag-打标签

    # tag的用法:保存多个版本的文件,每个版本都用一个tag来标识,方便找到
    git add .
    git commit -m "v1"
    git tag v1
    git push origin v1 / git push v1

     10 本地仓库与远程仓库的关系

    # 可以查看所有远程仓库与哪个本地仓库关联
    git remote show origin  

    # 开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
    git checkout dev
    git pull
    git checkout master

    git merge dev
    git push -u origin master

    # 当master代码改动了,需要更新开发分支(dev)上的代码
    git checkout master 
    git pull 
    git checkout dev
    # 此时需要pull request一下,申请manager或者其他人看自己的代码是否符合merge的标准
    git merge master 
    git push -u origin dev
  • 相关阅读:
    关于云计算:IaaS的四个误解和四个猜想 浪峰小园子
    国外10个优秀的免费轻量级CMS系统 浪峰小园子
    Win8下80端口被System占用,造成Apache不能启动的解决办法 浪峰小园子
    [转载]基于内存数据库的分布式数据库架构何坤 浪峰小园子
    php短域名转换为实际域名函数 浪峰小园子
    [转载]苹果公司与分工原理 浪峰小园子
    PHPer的等级划分
    简单的无限分类树
    转换字符串编码
    php开启虚拟域名功能
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10448710.html
Copyright © 2011-2022 走看看