zoukankan      html  css  js  c++  java
  • git 教程2 (git常用命令解说)

    <1>$ git -- help (调出git的帮助文档)

    <2>$ git +命令 --help (查看某个具体命令的帮助文档)

    <3>$ git --version (查看git版本号)

    <4>$ git init (生成空的本地仓库)

    <5>$ git add <file>(将文件添加到暂存区)

    <6>$ git commit (将暂存区里的文件提交到本地仓库)

    <7>$ git commi -m <message>(-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。)

    <8>初次commit 之前,需要配置用户邮箱及用户名,使用以下命令:

    $ git config --global user.email ''you@example.com''

    $ git config --global user.name ''Your Name''

    <9>文件状态
    新建文件状态为untracked
    使用git add 命令将新建文件加入到暂存区,文件状态变为staged
    使用git commit 命令将暂存区的文件提交到本地仓库,状态变为Unmodified
    如果对Unmodified状态的文件进行修改,状态变为modified
    如果对Unmodified状态的文件进行git rm 操作,其状态回到untracked状态

    <10>$ git log (显示从最近到最远的提交日志)
    (1)git log命令显示的信息的具体含义:
    commit 4a70ceb24b6849ad830d6af5126c9227b333d2d1 --通过算法SHA-1计算出的校验和也叫commit id
    Author: wiggin <wiggin@gmail.com> --作者跟邮箱概要信息
    Date: Wed May 16 23:51:02 2018 +0800 --提交时间
    还有--commit 的时候,使用-m选项所写的一段概要说明

    (2)$ git log -n (表示查看最近的n次提交)
    (3)$ git log -p (显示提交的不同点)
    (4)$ git log --author 查看具体某个作者的提交
    (5)$ git log --pretty=oneline (简化的日志)
    (6)$git log --graph (以一个简单的线图串联整个提交历史)

    <11>$ git diff (用于比较差异)

    diff -->difference的缩写,用于比较差异
    使用场景:
    1、解决冲突
    2、制作补丁
    (1)$ git diff 不加任何参数 (用于比较当前工作区跟暂存区的差异)
    (2)$ git diff --cached 或者--staged (比较暂存区与最新本地版本库)
    (3)$ git diff HEAD (比较工作区与最新本地版本库)
    (4)$ git diff 分支名 (查看当前分支跟指定分支的差异)
    (5)$ git diff 分支名1 分支名2 (查看两个指定分支(已提交的文件)的差异,分支2 跟分支1的差别)
    (6)$ git diff 文件名 (查看指定文件的差异)
    (7)$ git diff commitid1 commitid2 (用于列出两个历史提交的差异)
    (8)$ git diff --stat (用于罗列有变更的文件)
    (9)$ git diff输出信息的具体含义如下:

    diff --git a/file2 b/file2 file2的两个版本
    index c200906..29e2b3c 100644
    --- a/file2 表示变更前的文件
    +++ b/file2 表示当前文件
    @@ -1 +1,2 @@ 变更前的文件的第一行与变更之后的文件的第一行往下两行,这块文件区域有差异
    222
    +111 +表示新增了一行 -表示删除了一行 如果对一行内容进行修改,在此处体现出来的就是先删除一行,再新增一行


    <12>$ git reset
    使用场景:版本回滚
    (1)$ git reset HEAD 文件名 移除不必要的添加到暂存区的文件
    (2)$ git reset HEAD^ 或者 commitid 去掉上一次的提交
    (3)$ git reset --soft HEAD^ 修改上次提交的描述信息,即修改commit -m "修改这里的内容"
    (4)$git reset --soft 只是将HEAD引用指向指定的提交,工作区跟暂存区的内容不会改变
    (5)$git reset --mixed (默认选项)将HEAD指向指定的提交,暂存区的内容随之改变,工作区内容不变
    (6)$git reset --hard 将HEAD指向指定的提交,暂存区跟工作区都会改变
    (7)$ git reset --hard HEAD^ (回滚到上个版本)
    (8)$ git reset -- hard +commit id 前几位 (回滚到指定版本号)
    (9)$git reset (–mixed) HEAD~1 回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也不受影响)
    (10)$git reset –soft HEAD~1 回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响)
    (11)git reset –hard HEAD~1 回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
    简单总结一下,其实就是--soft 、--mixed以及--hard是三个恢复等级。使用--soft就仅仅将头指针恢复,已经add的缓存以及工作空间的所有东西都不变。
    如果使用--mixed,就将头恢复掉,已经add的缓存也会丢失掉,工作空间的代码什么的是不变的。如果使用--hard,那么一切就全都恢复了,头变,aad的缓存消失,代码什么的也恢复到以前状态。

    <13>$ git reflog (查看历史命令)

    <14>$ git status (查看缓冲区状态)

    <15>$git rm (用于git文件的删除操作)
    $ git rm --cache filename 仅删除暂存区里的文件,在工作区该文件仍然存在
    $ git rm filename 命令如果不加 --cache 会删除工作区里的文件,并提交到暂存区,此时暂存区也无该文件

    <16>$ git checkout -- file (丢掉工作区的修改)
    注意(1)$ git checkout filename 即git checkout 直接加文件名是从暂存区将文件恢复到工作区,如果工作区已经存在该文件,则会选择覆盖该文件
    (2)$ git checkout <branch name> <filename> 即$ git checkout 加分支名 + 文件名则表示从分支<branch name>拉取文件,并覆盖工作区文件
    (3)文件已修改,未add到暂存区:$ git checkout -- file可还原工作区文件
    (4)文件已修改,并add到暂存区未commit:$ git read HEAD file $ git checkout -- file两条命令可还原工作区文件

    <17>$ ssh -keygen -t rsa -C "799583930@qq.com" (创建SHH KEY)

    <18>$ git remote add origin git@server-name:path/repo-name.git (关联远程仓库repo-name)

    <19>$ git push -u origin master (第一次推送分支master内容)

    <20>此后,每次本地提交后,只要有必要,就可以使用命令$ git push origin master推送最新修改;

    <21>$ git clone git@github.com:enjoyzier/gitskills.git (克隆github仓库,注意:要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

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

    <22>$ git branch (查看所有分支)

    <23>$git branch <name> (创建分支)

    <24>$ git checkout <name> (切换分支,如果在分支上面对文件进行修改之后,没有commit就切换到另一个分支,这个时候会报错,因为没有commit的文件在切换分支之后会被覆盖,所以git会报错提示)

    <25>$ git checkout -f <name> (强制切换分支,如果当前有未提交的变更,会直接丢弃
    -f 参数一定一定要非常非常小心使用,一般情况下不建议使用,除非真的要强制去执行)

    <26>$ git checkout -b <name> (git checkout命令加上-b参数表示创建并切换分支,相当于以下两条命令:
    $ git branch <name>
    $ git checkout <name>)

    <27>$ git merge <name> (合并指定分支到当前分支)

    <28>$ git branch -d <name> (删除分支,不能删除当前所在的分支)

    <29>$ git branch -m <oldname> <newname> (更改分支名)

    <30> 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

    <31>$ git log --graph --pretty=oneline --abbrev-commit (看到分支合并图。)

    <32>在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

    那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

    <33>$ git merge --no-ff -m "merge with no-ff" <name> (合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。)

    <34>$ git tag (标签相关命令)
    (1)$ git tag 不加任何参数,表示显示标签列表(按字母顺序,非时间顺序)
    (2)$ git tag <tagname> (默认给最近的一个提交打上标签)
    (3)$ git tag <tagname> <commit_id> (给commit_id指定的提交打上标签)
    (4)$ git show <tagname> (显示该标签相关的那次提交的相关信息)
    (5)$ git tag -d <tagname> (删除该标签)
    (6)$ git push <远程分支名> <标签名> (把某个标签(必须是本地已经存在的标签,否则推送失败)推送到远程服务器上)
    (7)删除远程标签的步骤
    先删除本地的标签git tag -d 标签名,再删除远程的标签 git push origin :refs/tags/标签名
    注意:标签与commit挂钩,只要commit存在于多个分支,那么这几个分支都能看见这个标签

    <35>修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

    <36>$ git stash (保存工作现场)

    <37>$ git stash list (查看工作现场列表)

    <38>$ git stash pop (恢复工作现场,恢复的同时删除stash内容)

    <39>$ git stash apply <stash id> (你可以多次stash,恢复的时候,先用git stash list查看stash列表,然后用命令git stash apply <stash id>恢复指定的stash)

    <40>开发一个新feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过$ git branch -D <name>强行删除。

    <41>多人协作的工作模式:

    首先,可以试图用$ git push origin <branch-name>推送自己的修改;

    如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    如果合并有冲突,则解决冲突,并在本地提交;

    没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

    这就是多人协作的工作模式,一旦熟悉了,就非常简单。

    <42>$ git remote -v (查看远程仓库信息)

    <43>本地新建的分支如果不推送到远程,对其他人就是不可见的

    <44>从本地推送分支,使用$ git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交

    <45>$ git fetch拉取远程仓库的变更到本地仓库

    <46>git pull 不建议使用 等同于fetch之后merge

    <47>在本地创建和远程分支对应的分支,使用$ git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    <48>建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

    <49>从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

    <50>使用.gitignore文件
    (1)为什么要使用.gitignore 文件?
    大量与项目无关的文件全推到远程仓库上,同步的时候会非常慢,且跟编辑器相关的一些配置推上去之后,别人更新也会受其影响。所以,我们使用该文件,对不必要的文件进行忽略,使其不被git追踪

    一般情况下,.gitignore文件,在项目一开始创建的时候就创建,并推送到远程服务器上。这样大家初次同步项目的时候,就是用到该文件,避免以后,团队成员把与项目无关的文件,传到远程服务器上


    *.log 表示忽略项目中所有以.log结尾的文件
    123?.log 表示忽略项目中所有以123加任意字符的文件
    /error.log 表示忽略项目中根目录中的error.log 这个文件
    src/main/test/* 表示忽略/src/main/test/目录下的所有文件
    *.class
    **/java/ 匹配所有java目录下的所有文件
    !/error.log 表示在之前的匹配规则下,被命中的文件,可以使用!对前面的规则进行否定

    (2)对于已经提交到远程或本地仓库的文件,.gitignore配置之后不会生效。我们必须先删除本地暂存区里的文件,之后再加上.gitignore 文件,最后再把变更提交到远程仓库上。
    git rm --cached 文件名 从暂存区删除某个文件
    git rm -rf --cached 文件夹 表示递归删除暂存区该文件夹的所有东西

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    Scapy 工具介绍
    ubuntu虚拟机使用open-vm-tools代替vmware-tools
    docker、vmware和PD的区别
    ubuntu查看OpenGL版本
    SQL Server 常用近百条SQL语句(收藏版)
    Intellij IDEA 如何去掉 @Autowired 注入警告
    awtk-linux-fb 使用 double framebuffer 闪烁的问题
  • 原文地址:https://www.cnblogs.com/wuxunyan/p/9592397.html
Copyright © 2011-2022 走看看