git操作详解

配置用户名和密码:
   git  config --global  user.email zhen24
   git  config --global  user.name zhen24

查看用户名:
    git  config --get  user.name

查看列表(使用最后一个):
    列表:git  config --list --global
    单个:git  config --get  user.name

删除一个用户名:
    多个需要指定:git  config  --global --unset user.name  zhen24
    一个不需要指定:git  config  --global --unset user.name

修改用户名:
    git config --global user.name zhen

git 使用hash来唯一标识对象

获取仓库:
1、git  init
    eg:git init first_init
2、git clone  http://xxxxx

三个区:工作区(working)、暂存区(staging)、历史仓库(history)
git add  文件名 :添加文件到暂存区     eg:添加整个文件:git add  -A
git commit  -m ‘添加的说明’:提交到暂存区
注:修改commit的提交说明,git commit --amend
git push -u origin master :将代码推送到远端,强制覆盖远端使用这:git push -u origin master -f 

git status  :查看工作区和暂存区的区别
git mv   命名a  命名b :重命名或移动
git rm  文件名:删除文件
git rm  --cached 文件名:删除暂存区的文件
git branch   分支名:创建分支
git checkout  分支名:切换分支

创建tag:
    git tag tag名  hash(默认当前的分支的hash)
    git tag -a 'tag名称' hash(默认当前的分支的hash)
查看tag:
    git tag
查看历史示意图:
    git log --oneline --decorate --graph --all
    起别名:git config --global alias.lol 'log --online --decorate  --graph --all' 其中lol为别名
    之后使用:git lol

切换分支前保存当前分支的工作:
    git stash save -a 'stash1'
查看保存的分支列表:
    git stash list
还原之前保存的内容:
    git stash pop  --index  stash@{0}

合并分支:
    git merge 分支名
放弃合并:
    git merge --abort

git show hash/head:显示最新的提交信息
git show master 第一个父提交
git show master^2 第二个父提交

显示简短的提交:
    git show --format=%T master^2

显示完整的信息:git log
git log -p :输出每一个commit之类的差异信息
git log --stat :输出每一个commit之类的差异的统计信息
git log --oneline :输出单行信息

查看历史示意图:
                        commit引用的信息    显示所有信息
    git log --oneline --decorate --graph --all
                                   图形化的信息

显示工作区与暂存区的区别:git diff
查看暂存区和历史提交的差异:git diff --cached  [可加hash]
比较不同提交版本的差异:git diff HEAD HEAD^2 --master.txt
显示单词的差异:
    git diff --color-words
    git diff --word-diff

git checkout -- master.txt:用暂存区的内容覆盖工作区的内容
git reset 文件名(master.txt):忽略差异
使用历史的文件覆盖工作区的内容:git checkout HEAD -- master.txt
git clean  


 .gitignore忽略文件匹配规则

 

一 Git简介  

    1.1 Git 特点

        Git是一种非常流行的分布式版本控制系统,它和其他版本控制系统的主要差别在于Git只关心文件数据的整体是否发生变化,而大多数版本其他系统只关心文件内容的具体差异,这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。Git另一个比较好的地方在于绝大多数操作都可以在本地执行,而每个本地都可以从服务器获取一份完整的仓库代码,而且在没网的时候仍然可以修改和使用大部分命令,在方便的时候再跟服务器进行同步,这样可以更好的实现多人联合编程。

        另外个人感觉Git系统的强大在于它创建了一个个类似于快照的东西,记忆我们每一次的提交并且可以在未来的任何时候回到这里,对于大型项目的管理非常有效.

    1.2 Git 安装

        安装Git:http://iissnan.com/progit/html/zh/ch1_4.html

    1.3 一些常见的命令

      我们可以通过  git help/git --help/ man git 来查看git的一些最常用的命令

 

在Linux终端上运行git --help

 

 二 克隆Git仓库

    1.1 从远程仓库中克隆整个代码仓库

        mkdir Demo  //在当前路径下新建一个文件夹,用来存放将要拉取的整个代码库

        cd Demo           //进入这个文件夹

        repo init -u ssh://igerrit.storm:29418/Demo/manifest -b master    

    //-u :指定一个URL,其连接到一个manifest仓库

    //-m:在manifest仓库中选择一个xml文件

    //manifest:manifest是远程仓库里的一份清单,init的时候就是按照这份清单从服务器进行同步的

    //ssh://igerrit.storm:29418/Demo/ :是一个远程服务器的地址,地址可以是私人的也可以是共有的,共有的表示代码是公开的

     //-b:表示后接分支名,可以是master,也可以是其他分支

        repo sync //这是一个封装的命令,用来同步代码。 上一步应该用时比较少,这一步用时较长

        repo start master  --all  //这也是一个封装的命令,用来切分支的。这一步不可缺少 ,意为将拉下来的版本库都切换到master分支,如果不做这一步,克隆下来的所有仓库默认是no branch状态,容易导致后面工作时添加的代码丢失

    1.2 克隆单个仓库

        git clone https://github.com/×××  从远程库中克隆,克隆一个版本库到新的目录,可以在当前目录新建一个文件夹,也可以git clone [地址] [本地目录]

    git clone ssh://igerrit.storm:29418/tools/repo.git // 同上,

    之后 git pull origin master //origin是远程主机,master是默认分支

    要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

    Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快

    单一仓库的更新可以使用git pull命令。

    repo init完成的操作如下:

  (1):完成repo 工具的完整下载,执行的repo脚本只是引导程序

  (2):克隆清单库manifest.git(地址来自于-u参数)

  (3):克隆的清单库位于manifest.git中,克隆到本地.repo/manifests.清单,.repo/manifest.xml只是符号链接,它指向.repo/manifests/default.xml文件,

    repo sync:用于参照清单文件.repo/manifest.xml克隆并同步版本库。如果某个版本库尚不存在,则执行repo sync命令相当于执行git clone。如果项目版本库已经存在,则相当于执行下面的两条指令:

  (1):git remote update //相当于对每一个remote源执行了fetch操作

  (2):git rebase origin/branch //针对当前分支的跟踪分支执行rebase操作

    repo start:创建并切换分支,是对git checkout -b命令的封装 //如果存在分支则切换分支,若不存在则创建并切换

        区别是repo start 是在清单文件设定分支的基础上创建特性分支,git checkout是在当前所在分支的基础上创建特性分支,如果是针对于整个版本库,那么相当于 repo forall -c git checkout -b 

题外:在使用这些命令克隆仓库之前,我们是需要配置一些环境,如ssh的key,用户名,邮箱名等等

        如果公司使用的是私有github,在初始化仓库之前需要若是初始化仓库的时候出现提示仓库已经初始化,那么可以尝试删除本地的.repo

 

三 Git 仓库 

    1.1Git 基本概念    

        在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。

        现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中有一个“.git”的文件夹。这个文件夹非常重要,所有的版本信息,更新记录,以及Git进行仓库管理的相关信息

全部保存在这个文件夹里面。所以,不要修改/删除其中的文件,以免造成数据的丢失。

        进一步的讲解请参考下面一张图,大概展示出了我们需要了解的基本知识。

     

    根据上面的图片,下面给出了每个部分的简要说明:

  • Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间,除了.git之外的都属于工作区。
  • .git:存放Git管理信息的目录,初始化仓库的时候自动创建。
  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
  • Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

     有了上面概念的了解,下面简单介绍仓库的文件结构。

 

        该目录下有可能还有其他文件,但这是一个全新的 git init 生成的库,所以默认情况下这些就是你能看到的结构。新版本的 Git 不再使用 branches 目录,description 文件仅供 GitWeb 程序使用,所以不用关心这些内容。config 文件包含了项目特有的配置选项,info 目录保存了一份不希望在 .gitignore 文件中管理的忽略模式 (ignored patterns) 的全局可执行文件。hooks 目录保存了客户端或服务端钩子脚本。

另外还有四个重要的文件或目录:HEAD 及 index 文件,objects 及 refs 目录。这些是 Git 的核心部分。

  • objects 目录存储所有数据内容
  • refs 目录存储指向数据 (分支) 的提交对象的指针,里面即有stash栈指针以及tag等
  • HEAD 文件指向当前分支
  • index 文件保存了暂存区域信息

    1.2 简单的代码提交流程

        这里不对每一条命令做详尽的解释,这些命令或类似命令贯穿我们顺利的一个完整提交,关于其他情况以及这些命令的详细解释留待后面叙述。

        (1)git status //查看工作区代码相对于暂存区的差别,

        (2)git add . // 将当前目录下修改的所有代码从工作区添加到暂存区 . 代表当前目录

        (3)git commit -m “commit-message” //将暂存区的代码提交到本地版本库

        (4)git push origin master // 将本地版本库推送到远程服务器,origin是远程主机,master表示是远程服务器上的master分支,分支名是可以修改的。

 

Git add  

  git add [参数]  [--] <路径>  //作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用git commit命令进行提交了。

          为了方便下面都用 . 来标识路径, . 表示当前目录,路径可以修改,下列操作的作用范围都在版本库之内。

    1.1  git add . 

        不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除

     1.2 git add -u .

       -u  == --update ,表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。

      1.3 git add -A .

       -A == --all  , 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。

      1.4 git add -i .

        日常工作中了解前三个命令已足够能满足我们的使用需求了,但是了解一下这个交互式拣选操作也是不错的。这个命令它也是作用于版本库中已被跟踪的文件中的执行过修改与删除操作的文件。

         git add -i
           staged     unstaged  path

 1:        +0/-0         nothing      Testfile

*** Commands ***
  1: status     2: update     3: revert     4: add untracked
  5: patch      6: diff       7: quit       8: help
What now>

        1.4.1、revert子命令
            可以通过git add -i的revert子命令(3: [r]evert)把已经添加到索引库中的文件从索引库中剔除。

            (3: revert)表示通过3或r或revert加回车执行该命令。执行该命令后,git会例出索引库中的文件列表.

            然后通过数字来选择。输入"1"表示git会例出索引库中的文件列表中的第1个文件。

            "1-15"表示git会例出索引库中的文件列表中的第1个文件到第15个文件.回车将执行。

    如果我们不输入任何东西,直接回车,将结束revert子命令,返回git add -i的主命令行。

        1.4.2 update子命令

            可以通过update子命令(2: [u]pdate)把已经tracked的文件添加到索引库中。其操作和revert子命令类似。

        1.4.3 add untracked子命令

            通过add untracked子命令(4: [a]dd untracked)可以把还没被git管理的文件添加到索引库中。其操作和revert子命令类似。

        1.4.4 diff子命令

            可以通过diff子命令(6: [d]iff)可以比较索引库中文件和原版本的差异。其操作和revert子命令类似。

        1.4.5 status子命令

           status子命令(1: [s]tatus)功能上和git add -i相似

        1.4.6 quit子命令

            quit子命令(7: [q]uit)用于退出git add -i命令系统

    1.5 git add -h

            查看帮助,使用git add --help可以查看更详细的内容

 

  Git commit

        git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,

  commit-id在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.

   1.1 git commit -m “message”

           这种是比较常见的用法,-m 参数表示可以直接输入后面的“message”,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,

   message即是我们用来简要说明这次提交的语句。还有另外一种方法,当我们想要提交的message很长或者我们想描述的更清楚更简洁明了一点,我们可以使用这样的格式,如下:

        git commit -m ‘

        message1

        message2

        message3

        ’

    1.2 git commit -a -m “massage”

            其他功能如-m参数,加的-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,注意,

   新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。建议一般不要使用-a参数,正常的提交还是使用git add先将要改动的文件添加到暂存区,再用git commit 提交到本地版本库。

    1.3 git commit --amend

            如果我们不小心提交了一版我们不满意的代码,并且给它推送到服务器了,在代码没被merge之前我们希望再修改一版满意的,而如果我们不想在服务器上abondon,那么我们怎么做呢?

         git commit --amend //也叫追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中,

       (1) 假如现在版本库里最近的一版正是我们想要追加进去的那版,此时是最简单的,直接修改工作区代码,然后git add,之后就可以直接进行git push到服务器,中间不需要进行其他的操作如git pull等

       (2) 如果现在版本库里最近的一版不是我们想要追加进去的那版,那么此时我们需要将版本库里的版本回退到我们想要追加的那一版,想要将版本回退到我们想要的哪一版有好几种方法

            1) 第一种即是我们从服务器上选取我们需要的版本,直接进行挑拣,在服务器的提交管理页面上右上方一般会有一个Download按钮,点击会弹出一个下拉框,选择其中的cherry-pick,复制命令,

     之后在我们版本仓库对应的目录下运行这个命令,执行完后,使用git log -1 命令,可以查看到现在版本库里最近的一版变成了我们刚才挑拣的这版,此时再在工作区直接修改代码,

     改完之后进行git add,再执行本git commit --amend命令,之后git push.

            2) 使用gitk或其他的图形界面化工具,在终端输入 gitk,回车,会弹出gitk的图形界面,在界面的左侧部分陈列着版本库中的一条条commit-id,此时选中我们需要的那一版,右键点击之后会弹出一个

     选择菜单,如果是在master  分支上,那么其中会有一项是 Reset master branch to here,点击这项,会弹出一个名为confirm reset的确认box,选择reset type 中的hard项,再点击OK,

     关闭gitk图形界面,回到终端,运行git log -1命令,发现现在版本库里最近的一次提交已经是我们希望的那一版了,此时再在工作区直接修改代码,改完之后进行git add,

     再执行本git commit --amend命令,之后git push.

            3) 如果我们知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以直接使用git reset --hard HEAD~n命令,关于git reset 命令有详解,此时这个命令执行完后,

     运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.

            4) 如果我们不知道我们需要的版本与现在最近的版本中间隔着 n 个提交,那么我们可以使用git log来查看版本库中的commit-id,找到我们需要的commit-id后,在终端中执行git reset --hard commit-id,

     时这个命令执行完后,运行git log -1 命令我们会发现现在版本库里最近的一版就是我们需要的那版,此时再在工作区直接修改代码,改完之后进行git add,再执行本git commit --amend命令,之后git push.

 1.4 git commit --help

       查看帮助,还有许多参数有其他效果,一般来说了解上述三种即可满足我们工作中的日常开发了

 

Git push

        在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。

    git push的一般形式为 git push <远程主机名> <本地分支名>  <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,

    第一个master是本地分支名,第二个master是远程分支名。

    1.1 git push origin master

        如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建

     1.2 git push origin :refs/for/master 

  如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master

    1.3 git push origin

   如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支 

 1.4 git push

  如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

 1.5 git push 的其他命令

  这几个常见的用法已足以满足我们日常开发的使用了,还有几个扩展的用法,如下:

    (1) git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,

      不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式

      如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置

    (2) git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项

    (3) git push --force origin git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。

    (4) git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令

 1.6 关于 refs/for

  // refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要

 

Git diff

     用于比较两次修改的差异

    1.1 比较工作区与暂存区

      git diff 不加参数即默认比较工作区与暂存区

    1.2 比较暂存区与最新本地版本库(本地库中最近一次commit的内容)

      git diff --cached  [<path>...] 

    1.3 比较工作区与最新本地版本库

      git diff HEAD [<path>...]  如果HEAD指向的是master分支,那么HEAD还可以换成master

    1.4 比较工作区与指定commit-id的差异

      git diff commit-id  [<path>...] 

    1.5 比较暂存区与指定commit-id的差异

      git diff --cached [<commit-id>] [<path>...] 

    1.6 比较两个commit-id之间的差异

      git diff [<commit-id>] [<commit-id>]

    1.7 使用git diff打补丁

      git diff > patch //patch的命名是随意的,不加其他参数时作用是当我们希望将我们本仓库工作区的修改拷贝一份到其他机器上使用,但是修改的文件比较多,拷贝量比较大,

      此时我们可以将修改的代码做成补丁,之后在其他机器上对应目录下使用 git apply patch 将补丁打上即可

      git diff --cached > patch //是将我们暂存区与版本库的差异做成补丁

        git diff --HEAD > patch //是将工作区与版本库的差异做成补丁

      git diff Testfile > patch//将单个文件做成一个单独的补丁

    拓展:git apply patch 应用补丁,应用补丁之前我们可以先检验一下补丁能否应用,git apply --check patch 如果没有任何输出,那么表示可以顺利接受这个补丁

       另外可以使用git apply --reject patch将能打的补丁先打上,有冲突的会生成.rej文件,此时可以找到这些文件进行手动打补丁

 

 Git merge的用法

    git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支

    git merge -m  “Merge from Dev”  Dev //-m可以加上merge时要添加的描述性语句,如果出现冲突,那么先解决冲突,再将文件git add,git commit,之后再merge

   Git rebase的用法:

   与merge的形式一样,git rebase dev,作用也一样是在当前分支合并Dev分支,如果git rebase遇到冲突,第一步当然是解决冲突,然后 git add,之后并不需要git commit,

     而是直接运行git rebase --continue,这样git 就会继续应用剩下的补丁了,//假如你不想解决冲突且不再进行合并,那么可以使用git rebase --abort

  git merge 与 git rebase的区别:

    举例两个分支Dev和master刚开始处于同一起点,之后各自前进,Dev是只有自己修改,但是master有其他人的修改,此时如果准备在master分支上将Dev分支合并,

    使用git merge的结果像是一个新的合并的提交,而git rebase看起来则像没有经历过任何合并一样

下面是转载自http://blog.csdn.net/wh_19910525/article/details/7554489   很不错的一篇博客

-----------------------------------

他们的 原理 如下

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

$ git checkout -b myworkorigin

假设远程分支"origin"已经有了2个提交,如图

 

现在我们在这个分支做一些修改,然后生成两个提交(commit).

$ vi file.txt

$ git commit

$ vi otherfile.txt

$ git commit

...

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

 

 

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

 

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

$ git checkout mywork

$ git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

 

 

当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

 

二、解决冲突

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

$ git rebase --abort

三、git rebase和git merge的区别

现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

当我们使用Git log来参看commit时,其commit的顺序也有所不同。

假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,

对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1

对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C7 ,C6‘,C5',C4,C3,C2,C1

 

git branch 和 git checkout经常在一起使用,所以在此将它们合在一起

  1.Git branch

    一般用于分支的操作,比如创建分支,查看分支等等,

    1.1 git branch

      不带参数:列出本地已经存在的分支,并且在当前分支的前面用"*"标记

    1.2 git branch -r

      查看远程版本库分支列表

    1.3 git branch -a

      查看所有分支列表,包括本地和远程

    1.4 git branch dev

      创建名为dev的分支,创建分支时需要是最新的环境,创建分支但依然停留在当前分支

    1.5 git branch -d dev

      删除dev分支,如果在分支中有一些未merge的提交,那么会删除分支失败,此时可以使用 git branch -D dev:强制删除dev分支,

    1.6 git branch -vv 

      可以查看本地分支对应的远程分支

    1.7 git branch -m oldName newName

      给分支重命名

  2. Git checkout

    1. 操作文件  2. 操作分支

    2.1 操作文件

      2.1.1 git checkout filename 放弃单个文件的修改

      2.1.2 git checkout . 放弃当前目录下的修改

    2.2 操作分支

      2.2.1 git checkout master 将分支切换到master

      2.2.2 git checkout -b master 如果分支存在则只切换分支,若不存在则创建并切换到master分支,repo start是对git checkout -b这个命令的封装,将所有仓库的分支都切换到master,master是分支名,

    2.3 查看帮助

      git checkout --help

      当然git checkout还有许多命令,但这些已经能满足我们日常开发所需

                     因为C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,

                    从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1

 

 Git stash

  git stash这个命令可以将当前的工作状态保存到git栈,在需要的时候再恢复

  1.1 git stash 

    保存当前的工作区与暂存区的状态,把当前的工作隐藏起来,等以后需要的时候再恢复,git stash 这个命令可以多次使用,每次使用都会新加一个stash@{num},num是编号

  1.2 git stash pop

    默认恢复git栈中最新的一个stash@{num},建议在git栈中只有一条的时候使用,以免混乱

  1.3 git stash list

    查看所有被隐藏的文件列表

  1.4 git stash apply

    恢复被隐藏的文件,但是git栈中的这个不删除,用法:git stash apply stash@{0},如果我们在git stash apply 的时候工作目录下的文件一部分已经加入了暂存区,部分文件没有,

    当我们执行git stash apply之后发现所有的文件都变成了未暂存的,如果想维持原来的样子,即暂存过的依旧是暂存状态,那么可以使用 git stash apply --index

  1.5 git stash drop

    删除指定的一个进度,默认删除最新的进度,使用方法如git stash drop stash@{0}

  1.6 git stash clear 

    删除所有存储的进度

  1.7 git stash show

    显示stash的内容具体是什么,使用方法如 git stash show stash@{0}

  1.8 查看帮助

    git stash --help

 

参考大佬:https://www.cnblogs.com/qianqiannian/category/899203.html

 

常见问题及解决方法:

1、本地提交失败

原因:远端有最新的提交(代码更新了)而本地的提交落后于远端的提交。 

解决方法:

方法(一):

(1)、git pull (先把远端的代码更新下来)。

(2)、git status(查看冲突的文件)。

(3)、vi修改该冲突的文件之后并且保存和退出。 

(4)、git  add  和git commit 添加刚刚解决完冲突的文件。

(5)、git  push (把文件提交到远端)。

方法(二):

       git push -u origin master -f (此方法会覆盖远端的代码,不提倡!)

 

2、修改commit的备注内容。

解决:

(1)、git  commit --amend 。

(2)、vi编辑我们需要修改的内容即可。

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值