git笔记

  1. 创建版本库

     git init
    
  2. 首次提交

     git add 1.txt 2.txt
     git commit -m "first commit"
    
  3. 检查状态

     git status 
     git diff 1.txt
    
  4. 删除

     git rm 2.txt
    
  5. 显示历史

     git log
     git log --graph
     git log -n 3 # only the last three commits
     git log --oneline #only one line per commit
     git log --stat #only show statistics
    
  6. push

     1.先pull再push
     2.指定目标版本库的路径及其分支
         git push /projects/***.git master
    
  7. 撤出暂存区

     git reset HEAD 1.txt
    
  8. 忽略

    • .gitignore文件

      demo/会忽略所有包含demo的路径,比如/src/demo/sss

      /demo/就只会忽略确定的路径

      在子目录下创建.gitignore文件,就只会影响该目录下的

* 如果某个文件已经修改过之后,再在.gitignore中写进这个文件,仍然会被提交。**解决:**使用  update-index命令的--assume-unchanged选项

* 忽略某个文件

        git update-index --assume-unchanged foo.txt
  停止忽略:
        
        git update-index --really-refresh
  1. 储藏

    先不提交之前的修改,将修改保存在本地。

     git stash
    

    查看

     git stash  list
    

    恢复

     git stash pop
    

分支

  1. 查看

     git branch 
     git branch -a #所有
    
  2. 切换

     git checkout branch1
     
     git checkout -b branch2 #创建并切换
    
    • 切换前存在未提交的修改

        git commit --all
        git checkout branch2
        
        或者放弃修改强制提交
        git checkout --force branch2
        
        或者储存修改再切换
        git stash
        git checkout branch2
      
  3. 创建分支

    • 为当前提交创建分支

        git branch branch2
      
    • 为任意一批提交创建分支

        git branch branch3 78788b2c
      
    • 从现有分支创建分支

        git branch new-branch old-branch
      
  4. 重置分支

     git reset --hard 39ea21a
    
  5. 删除分支

    • 删除已经被终止的分支

        git branch -d branch1
      
    • 删除一个打开的分支,强制删除

        git branch -D branch2
      
  6. 恢复删除

    • 散列值恢复

        git branch branch1 7232jjj
      
    • 不知道散列值

        git reflog #查看散列再恢复
      
  7. 合并分支

     git merge branch1
    
    • 取消合并

        git reset --merge
      
    • 快进合并

      优点:简化版本库的历史记录;

      缺点:不能根据已经合并的历史记录看过去发展;

      优化:

        git merge --no-ff branch1
      
  8. 冲突

    • 冲突标志

      <<<<HEAD与======之间为当前分支内容

      ======与>>>>>branch1之间为另一分支内容

    • 显示共同祖辈,3路显示格式

        git config merge.conflictstyle diff3
      

      |||||与======之间是祖辈内容

    • 解决冲突

      1. 编辑受影响的文件;

        或者

      采用--ours或--theirs 选项,只采用自己的或者别人的

            git checkout --theirs file1/
      
      1. 注册修改

         git add .
        
      2. 提交

         git commit 
        
      3. log

        • 只查看来自分支b,而不是来自a的

            git log a..b
            git log --graph --oneline --decorate a b
          
  9. 变基

    git rebase master
  1. 交换

    • clone

      1. 查看本地和远程版本库不同

         git diff feature-a clone/feature-a
        
      2. 查看远程版本库的新增提交

         git log --oneline feature-a..clone/feature-a
        
      3. 将远程版本库的签出到本地

         git checkout -b feature-b clone/feature-b
         或者
         git fetch clone clone/feature-b:my-feature-b
        
    • 获取数据

      1. fetch
      2. pull=fetch+merge
    • 显示源版本库

        git remote --verbose
      
  2. 标签

    • 创建标签推送

        git tag 1.2.3.4 master -m "demo tag"
        git push origin 1.2.3.4 
      
  3. 子模块与子树

    区别:带子模块的主版本库只能发布模块版本库;而模块版本库的内容带有子树的话,该模块版本库就被导入了主版本库中。

    • 嵌入子模块

      1. 链接目录,绝对路径

         git submodule add /global-path-to/sub sub
        
      2. 在config文件注册子模块

         git submodule init
        
      3. 选择版本

         cd sub
         git checkout v1.0
        
      4. 将.gitmodules文件和子目录添加并提交

         cd ..
         git add .gitmodules
         git add sub
         git commit -m "submodule added"
        
    • 克隆带子模块的项目

        git submodule init
        git submodule update
      
    • 更新子模块

        cd sub
        git fetch 
        git checkout v2.0
        cd ..
        git add sub
        git commit -m "new versio of sub module"
      
    • 子模块修改提交

        cd sub
        git add sub1.txt
        git commit -m "change sub module"
        git push
        
        #提交病推送主版本的修改
        cd ..
        git add main1.txt
        git add sub
        git commit -m "new version of submodule"
        git push 
      

子树

  • 嵌入子树

       git subtree add --prefix=sub /global-path-to/sub v2.0
       
       #若历史记录与主版本库无关,可以:
       git subtree add --squash --prefix=sub /global-path-to/sub master
    
  • 更新子树

      git subtree pull --prefix=sub /global-path-to/sub v2.1
    
  1. 垃圾回收

    • gc
    • 默认两星期
  2. 中央版本库

    • 空目录纳入管理

      在文件夹中创建.gitignore文件即可

    • 行尾中止符设置

        git config --global core.autocrlf input
        还有false和true两种参数
      
    • 共享版本库

      1. Git daemon搭建
      2. HTTp协议共享版本库
      3. SSH协议共享版本库
  1. 基于特性分支的开发

    1. 创建特性分支

      1. 更新master分支

         git checkout master
         git pull --ff-only
         #--ff-only参数表示只允许进行快进式合并,如果存在一些本地修改,该合并就会被取消
        
      2. 创建特性分支

         git checkout -b feature
        
      3. (可选)在中央版本库维护特性分支

         git push --set-upstream origin feature-a
         #--set-upstream参数将本地的特性分支与远程版本库中的分支连接起来,在pull和push中都可以省去origin
        
    2. 在master集成某一特性

      1. 更新master分支

         git checkout master
         git pull --ff-only
        
      2. 合并特性分支

         git merge feature-a --no-ff --no-commit
        

        --no-ff参数防止快进式合并;
        --no-commit用于指示git,不要因为接下来可能失败的测试而停止任何提交。

      3. 做一下回归测试,并为其创建一次提交

        • 如果测试引发了错误,就reset丢弃当前执行的合并

            git reset --hard HEAD
          

          然后纠正错误,再从第1步走一遍;

        然后提交
        
            git commit -m "Delivering feature-a"
    4. 将master分支传递至中央版本库

            git push 
            
        * 如果在这个过程中,master分支上有其他特性分支集成进来,可能就会出现冲突;

                git reset --hard ORIG_HEAD
                git pull
                
            然后再从**第1步**走一遍;
    5. 删除或者继续使用特性分支

        * 删除

                git branch -d feature-a
                git push origin :feature-a
                
        *继续使用,并且将master分支的新修改传递到该分支
        
                git checkout master
                git pull --ff-only
                git chekout feature-a
                git merge --no-ff master
  1. 二分法排错

  2. 列出提交历史,找出起初正确的一个版本good,和最近出错的版本

      git log --oneline
    
  3. 执行二分法查错

      git bisect start 20202020 30303030
      #第一个参数是bad提交,第二个是good 
    
  4. 若给出的版本扔出错,则

      git bisect bad
      
      否则
      
      git bisect good
    

    直到提示找到错误第一次出现的地方为止

  5. 停止二分查找

      git bisect reset
    
  6. 基于构建服务器的工作流

    • 概述

      last-build分支指向master分支最后构建成功的那个版本;
      buildhistory分支会包含所有构建成功的版本。

    • 过程

      1. 预备构建服务器

        • 创建一个空版本库

            mkdir buildrepo
            cd buildrepo
            git init
          
        • 获取中央版本库master分支

            git remote add -t master origin <central repo>
            #<central repo>表示链接到中央版本库的URL
            git fetch
          
        • 创建build-history分支

            #查看主分支的第一次提交
            git log --oneline --first-parent origin/master | tail -1
            #3a05e26 init
            git checkout -b build-history 3a05e26
          
      2. 构建服务器上的git

        • 获取中央版本库的修改

            git fetch
          
        • 检查是否有构建需要

            git diff --shortstat --exit-code origin/master
          
        • 清理工作区

            git reset --hard HEAD
          
        • 将修改纳入本地build-history分支

            git merge --no-ff --no-commit origin/master
          
        • 完成构建

        • 提交

            git commit -m "build 001"
          
        • 标记最后一次被成功构建的版本

            git branch --force last-build HEAD^2
            git push --force origin last-build:last-build
          
  7. 发行版交付

    • 概述

      1. 开发放在master分支;
      2. 发行版在stable分支;
      3. 稳定工作放在codefreeze分支;
      4. 补丁工作放在hotfix分支;
      5. codefreeze和hotfix分支只活动在项目的稳定阶段和排错阶段;
      6. 稳定阶段和排错阶段的修改最终会合并到master分支。
    • 过程

      1. 创建stable分支

         git log --oneline --first-parent | tail -1
         #3a05e26 init
         git branch stable 3a05e26
        
      2. 创建发行版

        • 创建codefreeze分支

            git checkout -b codefreeze master
          
        • 稳定codefreeze

            git checkout master
            git merge codefreeze
          
        • 创建发行版

          // 先检查stable分支中是否有codefreeze中没有包含的,存在就重新合并,再测试

                    git  log codefreeze..stable --oneline
                    
            
            不存在就:
            
                git checkout stable 
                git merge codefreeze --no--ff -m "Release-2.0.0"
                git tag -a release-2.0.0 -m "Release-2.0.0"
                git branch  -d codefreeze
        * 更新master分支

                git checkout master
                git merge stable -m "Done release-2.0.0"
                
 3. 创建补丁

     * 创建hotfix分支并排错

            
                git checkout -b hotfix-a1 stable
        
     * 验证补丁被并行化创建的可能性,即查看属于stable分支但是不属于该hotfix分支的修改

                git log hotfix-a1..stable --oneline
                
     * 发布补丁

                git checkout stable 
                git merge hotfix-a1 --no-ff -m "Hotfix-Release-2.0.1"
                git tag -a release-2.0.1 -m "Hot...."

    
     * 将补丁更新到其他分支

                git checkout codefreeze
                git merge stable -m "Hotfix 2.0.1"
                git checkout master
                git merge  codefreeze -m "Hotfix 2.0.1"
  1. 其他可能会用到的命令

    • 创建归档,导出不包含Git元数据的tar或zip

        git archive HEAD --format=tar > archive.tar
      
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,671评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,442评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,524评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,623评论 1 275
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,642评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,584评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,953评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,621评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,865评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,608评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,698评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,378评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,958评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,940评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,173评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,419评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,425评论 2 342

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,626评论 9 163
  • 最近使用Git时感到有些生疏,所以利用晚上空余时间将廖雪峰Git教程重新系统的学习一边并做了笔记,温故知新。 Gi...
    LannisZheng阅读 652评论 1 3
  • 晓真导师:只用一招,轻松获得顾客的信任 文字都有一种魔力,无论是写出来的字还是说出来的话。听者有意,如果精彩都会走...
    989a546170ec阅读 106评论 0 2
  • 弟弟说: 你怎么有这么多生日? 是呀! 农历六月正生日,闰六月又一个生日,公历(户籍上的身份证)的...
    张邦祥阅读 174评论 0 1
  • 五月份进单位时,我常常因为专业不对口,心生卑怯,做事小心翼翼,担心自己没办法像其他同事在工作中如鱼得水。 好在有一...
    女萝阅读 426评论 1 2