• git使用总结


    github的应用很广泛,已经成为一个程序员必备的一项技能。不会git管理,基本上不是一个合格的程序员。本文对此作下总结,方便后续查阅

    git使用

    本文的重点不在此处,这里读者可参考廖雪峰老师的博文Git教程。里面对git的原理以及安装使用分析的很到位,并且结合了很多实例用于讲解,是很优秀的文章集锦,此处博主深度安利下。博主只记录下本身遇到的有用的命令供以后查阅

    git merge 和 git rebase

    都是可以用来合并代码文件的命令。两者合并的概念有所不同。
    1.调用方式
    git merge

    #先切换至被合并的分支
    $ git checkout master
    
    #执行merge命令,让v1来合并当前分支
    $ git merge v1
    

    git rebase

    #即合并v1分支到master分支,且会自动切换至master分支
    $ git rebase v1 master
    
    #也可采取这种方式
    $ git checkout master 
    $ git rebase v1
    

    2.合并步骤
    git merge命令其会比较两个branch的commit节点,然后进行合并,如果有冲突则会产生新的commit节点;
    git rebase <upstream-branch-name> <to-branch-name>命令则会执行以下逻辑

    1.切换到to-branch分支;
    
    2.将to-branch中比upstream-branch多的commit先撤销掉,并将这些commit放在一块临时存储区(.git/rebase);
    
    3.将upstream-branch中比to-branch多的commit应用到to-branch上,此刻to-branch和upstream-branch的代码状态一致;
    
    4.将存放的临时存储区的commit重新应用到to-branch上;
    
    5.结束。
    
            执行完上述第3步后,to-branch的代码状态已经改变,接着执行第4步时则可能会产生合并冲突。
    

    Tips:

    1. git rebase操作即使在产生冲突的时候也不会重新产生新的commit id,而git merge在绝大部分情况下则会产生新的commit id(除非待合并的分支与当前分支是包含关系而不是交叉关系)

    2. git rebase在解决完冲突后,需要执行git rebase --continue才算合并结束。合并后两个branch的commit记录都会保存下来。另外这里也罗列下其他的两个命令方法

      #放弃挂起的patch提交记录,也就是直接应用源branch的提交记录,舍弃本身的提交记录
      $ git rebase --skip
      
      #即撤销rebase操作
      $ git rebase --abort
      
    3. git merge默认情况下是使用fast forward方式合并的,其会忽略合并信息,加上--no-ff -m "commit merge"参数则会记录合并操作

    git branch 和 git checkout

    都是可以用于创建分支的命令。但git checkout的功能比git branch强大,下述以创建分支v1为例
    1.分支创建

    #切换分支到master
    $ git checkout master
    #创建分支v1,但是不会自动切换上下文至v1分支,此处仍为master分支
    $ git branch v1
    
    -------------------------------
    -------------------------------
    
    #根据当前分支创建v1分支并且切换上下文至v1
    $ git checkout -b v1
    

    2.分支与远程关联
    如果创建的分支想关联远程仓库的分支,此处假设远程服务器已创建分支v1,则可以使用以下命令

    #创建分支v1,并关联远程的v1仓库
    $ git checkout -b v1 origin/v1
    

    上述操作主要是方便本地v1分支的修改推送到远程上能自动映射,如果使用git branch,则需要进行关联操作才可以git push

    $ git branch --set-upstream v1 origin/v1
    

    3.分支删除

    #删除v1分支
    $ git branch -d v1
    
    #强制删除v1分支
    $ git branch -D v1
    

    4.分支查看

    #查看本地分支(带*即为当前分支)
    $ git branch
    	feature1
    	master
    *	v1
    
    #查看远程分支
    $ git branch -r
    	origin/HEAD --> origin/master
    	origin/master
    	origin/v1
    
    #查看远本地分支的具体信息
    $ git branch -v
    
    

    5.文件操作

    git checkout -- <file>还可用于还原指定文件到最近的一次git add或者git commit对应的记录

    Tips:分支的创建、删除、合并在git的本地操作是非常快的,所以git很推荐使用分支来处理代码的编写、合并。

    git clone 和 git fetch/git pull

    三者命令都可以用来下载远程仓库代码。三者调用方式如下

    #两种方式下载远程代码,ssh方式和https方式
    $ git clone git@github.com:jtjsir/GitTest
    
    $ git clone https://github.com/jtjsir/GitTest.git
    
    #git pull 下载方式
    $ mkdir GitTest
    $ git init
    $ git remote add origin https://github.com/jtjsir/GitTest.git
    $ git pull origin master
    #如果当前分支为master,则下述调用方式同上
    $ git pull
    
    #以下方式并不能下载文件
    $ git fetch origin master
    
    1. git pull包含了git fetchgit merge

    2. git fetch其会拿取远程库的最新commit id与本地分支指向远程库的commit id进行对比(.git/refs/remote/origin/{branch}),如果不一致,则设置为最新的commit id。而git pull操作在git fetch的基础上进行判断,如果commit id不一致,则会调用git merge拉取线上最新的代码合并至本地

    3. 一般建议使用git clone来初次下载仓库,后续操作采用git pull命令更新仓库

    git push

    推送本地仓库到远程仓库。语法如下
    git push <remote> <localRepo>:<remoteRepo>。这里罗列下其用途

    #上传本地master分支到远程origin的master分支
    $ git push origin master
    
    #创建远程分支v1(v1分支在远程服务器尚未存在),执行下述命令刷新github服务器即有v1分支
    $ git push origin v1:v1
    
    #删除远程分支v1
    $ git push origin :v1
    

    git log

    用于查看当前分支的提交情况,常用用法有

    #列表形式,所列信息较详细
    $ git log
    commit 03fde2c26e391c5b7732677abf763cc9104251c2
    Merge: 2f19739 e06bb86
    Author: jtjsir <**@163.com>
    Date:   Fri Mar 2 14:55:26 2018 +0800
    
        fix conflict
    
    commit 2f1973967ca0559ebbe3772b2c735e7e39304818
    Author: jtjsir <**@163.com>
    Date:   Fri Mar 2 14:52:52 2018 +0800
    
        fix syntax -by master
    
    commit e06bb8683f2ea69a9fac825c5ccc732c34370f82
    Author: jtjsir <**@163.com>
    Date:   Fri Mar 2 14:48:20 2018 +0800
    
        fix syntax error -by branch_feature1
    
    commit d0f6c095b99416db7c4a9f45c47e467fd7abaa9d
    Author: jtjsir <**@163.com>
    Date:   Fri Mar 2 11:11:29 2018 +0800
    
        add comment for java. -by branch_v1
      ...
    
    #简便列表展示
    $ git log --pretty=oneline
    03fde2c26e391c5b7732677abf763cc9104251c2 fix conflict
    2f1973967ca0559ebbe3772b2c735e7e39304818 fix syntax -by master
    e06bb8683f2ea69a9fac825c5ccc732c34370f82 fix syntax error -by branch_feature1
    d0f6c095b99416db7c4a9f45c47e467fd7abaa9d add comment for java. -by branch_v1
    55f4ebf23d3ec8214c5caf83c13b23441ccf24e8 add php codes
    7cfa63ed7da74212cd3532a5e4032af08af9ff90 add java codes
    2dcf842671698a0be0ff41f7d1838195201ecfe2 Initial commit
    
    #同上
    $ git log --oneline
    03fde2c fix conflict
    2f19739 fix syntax -by master
    e06bb86 fix syntax error -by branch_feature1
    d0f6c09 add comment for java. -by branch_v1
    55f4ebf add php codes
    7cfa63e add java codes
    2dcf842 Initial commit
    
    #图形化展示
    $ git log --graph --oneline --abbrev-commit
    *   419deae fixed the merge by v1
    |  
    | * d83903d add comment by v2
    * | 2615020 modify by v1
    |/  
    * 43aabae add comment by v1
    *   03fde2c fix conflict
    |  
    | * e06bb86 fix syntax error -by branch_feature1
    * | 2f19739 fix syntax -by master
    |/  
    * d0f6c09 add comment for java. -by branch_v1
    * 55f4ebf add php codes
    * 7cfa63e add java codes
    * 2dcf842 Initial commit
    

    git stash

    缓存当前的工作区间状态。常用于突发情况下的bug修复,缓存当前工作区间方便以后继续解决

    #缓存当前分支状态
    $ git stash
    
    #查看当前分支状态列表
    $ git stash list
    
    #恢复最新的分支状态并在list集合中删除
    $ git stash pop
    
    #恢复当前分支的指定状态
    $ git stash apply stash@{0}
    

    git reset

    回滚提交操作,常用命令如下

    #回滚到上一个提交
    $ git reset --hard HEAD^
    
    #回滚到上两个版本的提交
    $ git reset --hard HEAD^^
    
    #回滚到上50个版本的提交
    $ git reset --hard HEAD~50
    
    #回滚到指定的版本,根据commit id
    $ git reset --hard <commit id>
    
    #回滚某个文件[add操作后commit操作前]
    $ git reset HEAD <file>
    
    

    git diff

    git在本地有个这样的逻辑:

    #工作区-->暂存区(add操作后存放)-->本地git版本库(commit操作后存放)
    working directory --> stage area(.git/index文件)--> git repository(.git/refs目录)
    

    比较版本之间的差异或者文件。常用方式如下

    #拿工作区和暂存区比较差异
    $ git diff
    
    #拿工作区的整体或者某文件与上一版本比较差异
    $ git diff HEAD^ <pathfile>
    
    #拿工作区与指定版本比较差异
    $ git diff <commit-id> <pathfile>
    
    #拿暂存区与指定版本比较差异
    $ git diff --cached <commit-id>
    
    #比较两个指定版本的差异
    $ git diff <commit-id> <commit-id>
    

    总结

    好记性不如烂笔头

  • 相关阅读:
    Semaphore wait has lasted > 600 seconds
    mysql二进制日志
    HashMap(JDK1.9)详解
    企业中如何批量更改mysql中表的存储引擎?
    mysql监控
    String源码详解
    字符编码详情
    mysql事务详解
    数据库水平分表(一个大数据量的表)
    bat
  • 原文地址:https://www.cnblogs.com/question-sky/p/8494444.html
Copyright © 2020-2023  润新知