zoukankan      html  css  js  c++  java
  • 看完我的笔记不懂也会懂----git

    Git学习笔记

    一图看清Git

    什么是Git

    git是一个分布式版本控制系统

    首次使用Git

    //参数 --global代表机器上所有的仓库都默认使用这个配置
    git config --global user.name "Your Name"
    git config --global user.email "email@example.com"
    

    DOS常用命令

    ls          //显示指定路径上所有文件或目录的信息
    dir         //显示指定路径上所有文件或目录的信息
    pwd         //查看当前路径
    mkdir    //创建文件夹目录
    rd          //删除文件夹目录
    cd  路径    //切换至指定路径
    

    Git常用命令

    git init         //初始化当前目录作为git仓库
    git add 文件     //添加文件到git仓库的暂存区
    git commit -m   //提交文件到git仓库的版本库(当前分支)
    git status      //查看当前git仓库的状态
    git diff        //比较工作区与最后一次commit的不同
    git log         //命令显示从最近到最远的提交日志
    git log --pretty=oneline    //让输出的日志更加简洁
    git log --graph --pretty=oneline --abbrev-commit   //输出分支合并图
    git reflog      //查看最近的版本操作记录
    rm              //删除文件
    

    关于HEAD

    HEAD指向git当前的最新版本
    HEAD^指向git上一个版本 HEAD^是上上个版本
    跨越多个版本可以使用 HEAD~版本数

    版本回退

    回退到上一个commit
    git reset --hard HEAD^

    回退到指定版本
    git reset --hard SHA号

    工作区、暂存区与版本库

    工作区(work directory): 就是git init后的我们能看到的那个文件夹目录
    暂存区(stage/index): git add后文件存放的地方
    版本库(repository): git commit后文件存放的地方

    repository里面存放着

    1. stage,
    2. git自动创建的第一个分支master
    3. 一个指向master的指针HEAD

    工作区、暂存区与版本库

    git add添加文件后暂存区的状态变成这样
    添加文件后暂存区的状态

    git commit提交文件后暂存区的状态变成这样
    提交文件后暂存区的状态

    git追踪的是修改而非文件本身

    1. 新建一个文件

      git追踪的是修改
      
    2. git add进stage中

    3. 修改这个文件

      git追踪的是文件的修改 
      
    4. git commit进repository中
      问题出现了: 发现commit的是第一次的修改(即:git追踪的是修改)
      原因在于: git追踪的是文件的修改,也就是只会commit被add进stage中的文件版本
      解决方法:

      1. 第一次修改 -> git add -> git commit -> 第二次修改 -> git add -> git commit
      2. 第一次修改 -> git add -> 第二次修改 -> git add -> git commit

    撤销修改

    git checkout -- file 是用版本库的版本替换工作区的修改

    1. 还没有git add到stage,撤销工作区的修改

    2. 已经git add到stage,撤销工作区的修改(add后再修改工作区)
      上面两种情况都能用: git checkout -- file

    3. 工作区已经修改,并且已经git add到stage(修改工作区再add)
      git reset [version] file 是将stage撤销到work directory

      //先用reset把暂存区的修改撤销掉(unstage),重新放回工作区
      git reset HEAD file
      //然后用checkout丢弃工作区的修改
      git checkout -- file
      

    删除文件

    处理使用rm或者右键删除的文件

    1. 的确要删除文件 git rm file
    2. 无操作删除,想要恢复 git checkout -- file用版本库的最新版本替换工作区的修改

    创建ssh秘钥

    ssh-keygen -t rsa -C "youremail@example.com"

    远程仓库

    1. 关联远程仓库
      git remote add origin [address]

      git remote add origin [branch] [address]

    2. 将本地仓库推送至远程仓库

      //第一次推送
      git push -u [remoteName] [branchName]
      //例子
      git push -u origin master 
      
      //以后推送
      git push  [remoteName] [branchName] 
      //例子
      git push origin master
      
      //关于参数-u
      作用是:可以简化git push操作,即以后git push可以代替git push origin master
      
    3. 列出远程仓库的分支
      git remote

    4. 从远程仓库克隆
      git clone [address]

    远程仓库之远程协助

    查看远程仓库信息
    git remote
    git remote -V //显示更加详细(包含fetch和push地址)

    在本地创建和远程分支对应的分支
    git checkout -b [branchName] [remoteName]/[branchName]

    建立本地分支和远程分支的关联
    git branch --set-upstream branch-name origin/branch-name

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin <branch-name>推送自己的修改
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
    3. 如果合并有冲突,则解决冲突,并在本地提交;
    4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功
    5. 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系1. 没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

    分支管理

    1. Git中默认创建一条主分支叫做master,而HEAD指向这个主分支master,master再指向最新的commit
      master HEAD 最新commit关系

    2. 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上
      创建新分支

    3. 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
      提交在新分支

    4. 假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并
      合并分支

    5. 合并完分支后,可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支(最少要有一条master分支)
      删除分支

    分支管理相关命令

    1. 创建并切换到分支

      git checkout -b [branchName]
      git switch -c [branchName]
      

      关于参数 -b
      git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

      $ git branch dev    //创建分支
      $ git checkout dev  //切换分支
      Switched to branch 'dev'
      
    2. 创建分支
      git branch [branchName]

    3. 切换分支
      git checkout [branchName]

    4. 查看分支
      git branch

    5. 合并分支
      git merge [branchName]

    6. 删除分支

      git branch -d [branchName]
      git branch -D [branchName]  //用于当分支文件时进行强制删除
      
    7. 恢复分支

      git branch [SHA1] [Version]
      git branch e4d9s89 HEAD //例子
      

    分支之解决冲突

    1. 正常的冲突情况

      1. 新分支上修改了文件,并正常添加、提交
      2. master分支上无法看到dev分支上的改动,冲突产生
        正常冲突

      解决方法:
      直接git merge,此时的模式为fast-forward模式

    2. 第一种冲突

      1. 新分支上修改了文件,正常添加、提交

      2. master分支上也修改了文件且内容不同,正常添加、提交

      3. 在master分支上git merge时,冲突产生

        $ git merge feature1
        Auto-merging readme.txt
        CONFLICT (content): Merge conflict in readme.txt
        Automatic merge failed; fix conflicts and then commit the result.
        
      4. master分支和feature1分支各自都分别有新的提交,变成了这样:
        master分支和feature1都有新提交

      解决方法:

      1. 打开文件查看冲突处
      <<<<<<< HEAD
      Creating a new branch is quick & simple.
      =======
      Creating a new branch is quick AND simple.
      >>>>>>> feature1
      
      1. 在主分支中手动修改不同处(我们希望的内容)并添加、提交

    merge时禁用Fast Forward模式

    git merge --no-ff -m [description] [branchName]
    可以看到,不使用Fast forward模式,merge后就像这样:
    禁用Fast Forward模式

    git stash区

    作用:当分支工作没完成不能提交,但是又有新任务需要马上做时,就可以使用git stash当前分支中的work directory冻结起来

    git stash相关命令

    1. git stash 冻结当前分支的工作区
    2. git stash list 查看有哪些stash
    3. git stash apply 恢复到最近的stash,并且不删除stash信息
    4. git stash pop 恢复到最近的stash,并且删除stash信息
    5. git stash apply stash@{num} 恢复到指定的stash
    6. git stash pop stash@{num} 恢复到指定的stash
    //实例
    git status  //当前在master分支
    git switch -c dev   //创建并切换至dev分支
    //突然有紧急任务。。。。
    git stash       //冻结当前分支(dev)
    git switch -c task  /   /创建并切换至紧急任务分支
    //完成紧急任务
    git checkout master     //切换master分支,准备合并刚刚完成的紧急任务
    git merge --no-ff -m 'finish task' task     //合并刚刚完成的紧急任务
    git switch dev  //切换至dev分支
    git branch -d task  //删除已经完成任务了的task分支
    git stash list  //查看stash的列表
    git stash pop   //解冻刚刚的工作区并删除stash list信息
    

    标签管理

    打标签是将标签放在一个commit上,作用是:更方便、迅速的找到对应的commit,例如:

    1. 如果没有tag,就应该是我要恢复到sd67gh7那个commit
    2. 有tag的话,就应该是,我要恢复到version1.0

    注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

    标签的相关命令:

    查看标签
    git tag

    在当前最新commit上打下标签
    git tag [tagName]

    在指定commit上打下标签
    git tag [tagName] [SHA]

    在打标签时附带说明
    git tag -a [tagName] -m [description] [SHA]

    查看指定tag的信息
    git show [tagName]

    删除tag标签
    git tag -d [tagName]

    推送某个标签到远程
    git push origin <tagName>

    推送全部标签到远程
    git push origin --tags

    删除远程指定标签
    git push origin :refs/tags/[tagName]

  • 相关阅读:
    java实现万年历
    XCTF 逆向 re1-100
    iOS多线程开发之GCD
    Hexo Next统计文章访问量
    Name/Value 配對和物件
    Mac系统Git生成ssh公钥
    《大话数据结构》三
    C++指针和引用
    英语语法讲解第一课句子成分-表语
    String-mainipulation7
  • 原文地址:https://www.cnblogs.com/fitzlovecode/p/learn_git.html
Copyright © 2011-2022 走看看