zoukankan      html  css  js  c++  java
  • Git---基础

     

    1. 最小配置,即配置用户信息

    Email :git会自动提取用来发送邮件(注意一定是可以收取邮件的),name :标识身份

    注意:空格不要等号

    用来处理本机多个仓库

    local命令必须在git项目中才可以使用,优先级最高

    2.本机建git仓库

    3.工作目录和暂存区

    没有commit就不会存到git仓库中

    4. 常用命令

    追踪新文件:git add .

    提交已经修改的文件到暂存器(前提是文件已经被捕获) git add -u

    git commit -m ‘ ’

    git commit -am " " 省略add操作(只将被tracked的文件添加到暂存区并提交,而将文件添加到git管理是要git add命令的)

    重命名文件 git mv oldname newname 相当于三个步骤:目录修改文件名(mv  oldname newname)git删除旧文件(git rm oldname ) git追踪新文件( git add newname) (三个命令)

    复原刚才的操作(危险命令)

    git reset --hard: 暂存区(add 了的文件 绿色的)工作区(没有add的文件 没有add-u的文件操作 红色的)上所有的操作都会消失,而且不会有提交历史 相当于返回了HEAD 对应的commit的状态

    查看提交历史 git log -4 --oneline --all(看所有分支,当然也可以指定git log temp(不要加-- 这是命令)) --graph (看图)

    创建分支  git checkout -b temp XXX(没有默认就在HEAD所在的commit创建分支,-b 创建分支命令同时会切换到所创建分支) git checkout temp 直接切换分支

    查看帮助文档  git help --web log 指定web就是在浏览器查看 log 就是你要查看的指令

    图像化界面 gitk 

    创建分支 分支名称 checkout 对应的commit 为 master :git branch checkout master

    比较暂存区与HEAD之间的差异 

    比较工作区和暂存区之间的差异

     

    暂存区恢复到和HEAD一样(变暂存区用reset)

    工作区变成暂存区(变工作区用checkout 相当于把暂存区的文件提交回来,不要当前工作区文件的内容)

    取消暂存区部分文件

    消除最近几次提交/回退到之前的提交(注意暂存区和工作区 HEAD 都会退到之前的commit)

    比较不同提交文件差异(提交的SHA1值也是可以的)

    删除文件(相当于工作区,暂存区都删除了文件)

    5.git 文件夹

    ls -al = ll 命令

    配置

    HEAD 指向

    refs 文件

    查看master文件 里面是一个对象

    git cat-file -t XX 查看对象类型  t 查看文件类型 -p 查看文件内容

    git branch -av 查看所有分支信息 -a 只是查看分支名称 -v 查看分支信息

    查看tags 文件夹:查看其中的tag文件,里面也是有一个对象(SHA 1都代表一个对象),发现对象类型是tags:查看tag对象发现里面还有一个对象, 对象类型commit

    查看objects 文件夹 :两字符的文件夹 pack文件夹(git打包的两字符文件夹)

    树 和 commit blob 类型对象 blob 就是一个文件(我们切切实实修改了的文件)

    6.三种对象:commit tree blob

    blob:只要是一样的文件就是一个blob  

    tree 文件夹  blob 文件(git 归根到底就是这两种对象在存储文件以及文件结构)

    7.一个commit创建了多少树

    find 查找所有文件

    一个commit 对象   对应着objects 文件夹下的一个文件,(内容)以及对应这一个或多个tree对象或是直接blob对象

    一个tree 对象, 对应着objects 文件夹下的一个文件,(内容)tree对象,blob对象

    一个blob对象, 对应着objects 文件夹下的一个文件, (内容) 文件内容

    8.分离头指针:没有在任何分支上

    我们当中正工作在没有任何分支上,并且还会提交了很多commit 怎么办 

    下面直接切入某个commit就会进入分离头指针状态

    分离头指针的危险在于:commit 没有 和tag或者branch绑定,日后都会被git当作垃圾进行清除(不会马上),而一旦与tag,branch进行了绑定git就不会删除

    可以看到只有HEAD没有分支

    当我们要切换到其他正常分支上:

    注意:解决:git branch dddd commitSHA1

    9.HEAD 与 branch

    HEAD :指向分支,指向commit    HEAD无论如何最终都会指向commit

    Branch:分支和tag一样都是指向commit ,远程分支也是分支指向commit

    -b 可以创建并且切换  可以指向commit也可以指向branch

    HEAD 快速指代作用 指代 

    git diff HEAD commitSHA1 /HEAD ^1 父亲节点  /HEAD~2相当于HEAD^1^1

    10.删除分支

    如果没有merged,会报错,使用D 如果是最新的commit对应的分支,并且没有branch/tags相对应,那么相应的commit也会删除

    11.修改message

    修改最新commit的message

    git commit -amend(修改完之后,commit的SHA也变了)

    git commit –amend既可以对上次提交的内容进行修改,也可以修改提交说明。

    修改旧的commit的message

    git rebase -i XXX

    变基在之前那个commit(之后的commit的sha1都会变)

    pick (use commit) 意味着commit保留,即是commit对应的那些对象保存

    rebase 变基 一定在自己的分支上进行操作,如果在公共分支上变基会影响其他人

    12.合并commit

    首先你需要一个commit,也就是一个pick,用来承接你要合并产生的新的commit

    你不要动的commit 直接pick就行  s命令是合并到前一个commit

    添加修改信息 注意# 信息不会出现,而其他的那些就是你写的message

    如何操作不连续的 改第一个commit的message同理

     

    13.变基

    git rebase -i  XXX

    进入交互式环境

    如果是第一个的话,需要自己写pick命令

    默认交互式文件中,越靠上,commit也是提前的

    当你进入变基1/2状态时

    git rebase --continue 就可以进入下一步

    git rebase --abort 来取消目前的进程 

    14.管理文件

    .gitignore  doc/ 管理doc文件 不管理doc文件夹   doc  都管理

    有两个起始commit ,如果我们把下面的tag还有分支删除掉那么下面的分支在日后就会被git清除掉,两个孤独的commit而且还不一样

    指定特定文件的差异

    15.git仓库备份

     

    我们可以push或者frech 来实现备份,当然也可以clone 注意--bare不带工作区的裸仓库

    16.连接远程仓库

    可以起别名 ,可以不止一个远程仓库(我们可以先用备份创建远程仓库,再用remote建立连接)

    17.GitHub 配置

    ssh :可以不用每次push 的时候输入密码

    第一步检测,第二部创建

    18.上传与下拉

    git push --set-upstream github --all 

    git push --set-upstream github master (代表 GitHub 这给别名仓库的master分支)

    git pull 包含两步  git fetch github(默认会把GitHub所有分支下载下来) 然后merge

    不是一个祖先 not first forwards 同一个分支如果远端和本地不是同一份祖先是不可以push的  fetch 是没问题的,本地没有远端的文件,也可以fetch

    三个独立的分支  gitk 默认只是打开当前分支的树  --all

    git merge 分支1  (当前分支与对应分支1合并:分支1说的是远程分支)

    19.合并

    merge 失败将处于当前状态:注意三种commit 状态 绿色 暂存区 红色 工作区(还未索引) 黄色 HEAD  故而有三种解决办法

    命令行下的状态

    只要merge成功,汇聚在一起 我们就可以进行push了(我们还可以使用变基进行合并)

    20.工作模型

    (两个人协调工作同一个分支,先在GitHub创建一个分支,然后让两人分别clone) 

    只要是我们git clone 下来的远程分支前都有一个origin 这表明是原始的

    基于远端分支创建本地分支

    当我们commit之后即时push到远端(由远端创建的本地分支可以直接push)

    查看分支 所有分支

    两个人同时操作一个分支,但是操作不同的文件

    两个人同时操作一个分支,操作相同文件的不同区域

    两个人同时操作一个分支,操作了相同文件的相同区域

    两个人同时操作一个分支,操作文件名和文件内容:一人修改文件名 一人修改文件内容

    两个人同时操作一个分支,两人同时修改文件名 :挨个处理

    方法一:如果我们确定远程的分支正好是我们需要的,而本地的分支上的修改比较陈旧或者不正确,那么可以直接丢弃本地分支内容,运行如下命令(看需要决定是否需要运行git fetch取得远程分支):

    $:git reset --hard origin/master

    或者$:git reset --hard ORIG_HEAD

    解释:

     git-reset - Reset current HEAD to the specified state

    --hard
                   Resets the index and working tree. Any changes to tracked files
                   in the working tree since <commit> are discarded.

    方法二:我们不能丢弃本地修改,因为其中的某些内容的确是我们需要的,此时需要对unmerged的文件进行手动修改,删掉其中冲突的部分,然后运行如下命令

    $:git add filename

    $:git commit -m "message"

    方法三:如果我们觉得合并以后的文件内容比价混乱,想要废弃这次合并,回到合并之前的状态,那么可以运行如下命令:

    $:git reset --hard HEAD

    如何取消merge,因为此时的merge已经对工作区产生影响:

    --abort 也只有在合并状态中才能使用

    处于merge 的状态

    标签理解:当我们本地合并后,远端还是在 它那个commit ,所以合并之后技术push,让远端master和本地master 同时

     

    如果我们的分支没有和远端分支绑定,第一次需要设置

    而如果我们是copy的远程分支,就直接push可以,或者我们之前设置了

    两个危险命令丢失commit 

    禁止在集成分支rebase ,宁可多提交几次修改代码也不要变基

    21.暂存区和工作区

    reset可以修改暂存区,--hard 可以修改工作区(这个让工作区和暂存区一样)

    checkout 可以修改工作区 :通过下面这个命令我们可以将工作区的文件进行修改,尤其是在合并时。并且此命令默认还会加到暂存区,我们不需要add就可以直接commit

    git checkout ${commit} /path/to/file

    reset XXX  可以直接修改暂存区

    status 只是查看当前工作区状态,没有显示的文件:说明工作区和暂存区一样,

    红色:代表修改了 文件 或是both added 这种合并冲突已经和暂存区不同了,而暂存区还是原来的

    绿色:代表我们提交了修改,暂存区已经修改的和本地一样了

    diff命令:查看暂存区的命令

    如何查看暂存区 使用 diff 命令,它可以比较快照

    "---"表示变动前的文件(暂存区文件),"+++"表示变动后的文件(工作区现实就有的文件)。

    第二部分,变动的位置用两个@作为起首和结束
    @@ -1,7 +1,7 @@
    前面的"-1,7"分成三个部分:减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。

    第一行表示结果为git格式的diff
    diff --git a/f1 b/f1
    进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。
    第二行表示两个版本的git哈希值(index区域的6f8a38c对象,与工作目录区域的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。
    index 6f8a38c..449b072 100644 

    如果是合并:可以看到有三个@@@ (标识前两个都是暂存区文件,后面的是显示文件 应该是把===也算作了一行)

    如果此时想要从暂存区提取东西是不可以的(checkout)这是因为文件还没合并导致,或者说这个文件出现了两个暂存区,有两种方式我们可以解决合并问题(出现了一个文件两个暂存区只有这时才会出现)

    1.我们强制这个文件的暂存区为一个,即指定一个分支,这样就变成正常的暂存区了,我们就可以checkout。

    注意此时 status 是不会显示这个文件,因为我们这个文件在暂存区和工作区是完全一莫一样的 (已经在暂存区了,最后直接commit就可以)

    2.手动删除》》》》  《《《《(直接修改工作区) , 然后add到暂存区然后提交

  • 相关阅读:
    转:mac下安装homebrew
    jdk1.7下载路径
    转: Mac 使用ADT的问题
    转:mac下安装Sublime Text
    转: SVN和Git的一些用法总结
    转: SVN使用教程总结(图文丰富,相当详细)
    转:Tortoise SVN 版本控制常用操作知识
    Android Java混淆(ProGuard)
    转:美团Android资源混淆保护实践
    【IPC进程间通讯之三】内存映射文件Mapping File
  • 原文地址:https://www.cnblogs.com/BlueFire-py/p/10809925.html
Copyright © 2011-2022 走看看