Git

153 阅读2分钟
  • 创建repository:

    1. 选择合适的地方

      $ pwd
      /Users/zewenhua/IdeaProjects/DataStructureAndAlgorithms
      
    2. 将目录变成Git可以管理的repository

      $ git init
      
    3. 把文件添加到repository

      1. 添加到repository
        $ git add readme.txt
      
      1. 提交到repository
        $ git commit -m "wrote a readme file"
      
  • 时光机穿梭

    掌握工作区状态:

    $ git status
    

    查看修改内容:

    $ git diff readme.txt
    
    • 版本回退

      • 查看版本历史记录(--pretty=oneline 简略信息):

        $ git log --pretty=oneline
        
      • 回退版本:在Git中,HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^ 表示上上一个版本,HEAD~100 表示上100个版本。

        回退到上一个版本:

        $ git reset --hard HEAD^
        

        指定回到某个(过去或未来)版本: (如: 回到commit id为 1094adb... 的版本;版本号前几位即可,Git自动寻找)

        $ git reset --hard 1094a
        

        如回退后失去commit id,可查询命令记录:

        $ git reflog
        
    • 工作区与暂存区

      • 工作区(Working Directory): 电脑里能看到的目录
      • 版本库(Repository): 工作区中的隐藏目录.git 为Git的版本库
        • Git版本库 = 暂存区(stage/index)+ 自动创建的第一个分支master,以及指向master的指针HEAD
        • 添加文件:
          • 第一步git add 把文件修改添加到暂存区;
          • 第二步git commit 把暂存区的所有内容提交到当前分支。
    • Git管理修改而非文件

      查看工作区和版本库最新版本的区别:

      $ git diff HEAD -- readme.txt
      
    • 撤销修改

      • 将readme.txt在工作区的修改全部撤销(其实是用版本库里的版本替换工作区的版本),分为两种情况:

        • 还没放到暂存区,则回到和版本库一样的状态
        • 已经添加到暂存区,则回到添加到暂存区后的状态
        $ git checkout -- readme.txt
        
      • 将readme.txt在暂存区的修改全部撤销:

        $ git reset HEAD readme.txt
        
    • 删除文件

      工作区删除文件:

      $ rm test.txt
      

      现有两种选择:

      • 版本库中删除文件:

        $ git rm test.txt
        $ git commit -m "remove test.txt"
        
      • 误删,从版本库中恢复:

        $ git checkout -- test.txt
        

        注意:从来没有被添加到版本库就被删除的文件,无法恢复!

  • 远程仓库

    • 添加远程库

      1. 登录GitHub,创建一个新的仓库

      2. 关联本地仓库与远程仓库

        $ git remote add origin git@github.com:ZewenHua/DataStructureAndAlgorithms.git
        
      3. 把本地库的所有内容推送到远程库

        $ git push -u origin master
        

        -u : 本地master分支和远程master分支关联起来,以后推送和拉取可以简化命令

    • 从远程库克隆

      $ git clone git@github.com:ZewenHua/DataStructureAndAlgorithms.git
      
  • 分支管理

    • 创建与合并分支

      • 创建+切换分支(2种方式)

        $ git checkout -b dev
        
        $ git switch -c dev
        

        创建分支

        $ git branch dev
        

        切换分支

        $ git checkout dev
        
        $ git switch dev
        
      • 查看当前分支

        $ git branch
        
      • 合并分支

        $ git checkout master
        $ git merge dev
        
      • 删除分支

        $ git branch -d dev
        

        如果分支没有合并过

        $ git branch -D dev
        
    • 分支管理策略

      • 禁用Fast Forward

        $ git merge --no-ff -m "merge with no-ff" dev
        
      • 分支策略

        • master分支非常稳定,仅用来发布新版本,平时不在上面干活
        • 每个人都有自己的分支,不时往dev分支合并
        • 要发布版本时,把dev分支合并到master
    • Bug分支

      场景:正在做工作,接到一个修复一个代号101的bug任务,当前正在dev上进行的工作还没提交,工作只进行到一半,没法提交。

      1. 将当前工作现场“储藏”起来,以便以后恢复现场后继续工作

        $ git stash
        
      2. 假定在master分支上修复,切换master创建临时分支,且建立关联

        $ git checkout master
        $ git checkout -b issue-101
        $ git push origin issue-101
        $ git branch --set-upstream-to=origin/issue-101
        $ git pull
        
      3. 修复bug,提交

        $ git add readme.txt
        $ git commit -m "fix bug 101"
        [issue-101 4c805e2] fix bug 101
         1 file changed, 1 insertion(+), 1 deletion(-)
        
      4. 修复完成后,切换到master,合并,删除issue-101分支

        $ git switch master
        $ git merge --no-ff -m "merged bug fix 101" issue-101
        $ git branch -d issue-101
        
      5. 回到dev分支干活;查看,此时工作区是干净的

        $ git switch dev
        $ git status
        
      6. 查看工作现场列表

        $ git stash list
        stash@{0}: WIP on dev: f52c633 add merge
        
      7. 恢复工作现场

        恢复+删除stash内容

        $ git stash pop
        

        恢复

        $ git stash apply stash@{0}
        

        删除stash内容

        $ git stash drop stash@{0}
        

        清空stash内容

        $ git stash clear
        
      8. dev分支上修复同样的bug,Git提供了赋值一个特定提交到当前分支的命令

        $ git cherry-pick 4c805e2
        [master 1d4b803] fix bug 101
         1 file changed, 1 insertion(+), 1 deletion(-)
        
    • 多人协作

      • 查看远程库信息(-v显示详细信息)

        $ git remote -v
        origin  git@github.com:michaelliao/learngit.git (fetch)
        origin  git@github.com:michaelliao/learngit.git (push)
        

        如果没有推送权限,就看不到push的地址

      • 克隆分支(只能看到master

        $ git clone git@github.com:michaelliao/learngit.git
        

        想要在dev分支上开发,必须创建origindev分支到本地

        $ git checkout -b dev origin/dev
        
      • 工作模式

        1. 试图推送自己的修改

          $ git push origin dev
          
        2. 如推送失败,则因为远程分支比本地更新,把最新提交抓下来合并

          $ git pull
          

          如果提示no tracking information表示没有指定本地dev分支与远程origin/dev分支的链接,则设置链接,再pull

          $ git branch --set-upstream-to=origin/dev dev
          Branch 'dev' set up to track remote branch 'dev' from 'origin'.
          $ git pull
          
        3. 如合并有冲突,解决冲突,本地提交

          $ git add env.txt
          $ git commit -m "fix env conflict"
          
        4. 再推送

          $ git push origin dev
          
      • Rebase

  • 标签管理

    tag就是让人容易记住的名字,根某个commit绑在一起。

    • 创建标签

      $ git tag v0.9 f52c633
      $ git tag -a v0.1 -m "version 0.1 released" 1094adb
      

      查看所有标签

      $ git tag
      
    • 操作标签

      • 删除标签

        $ git tag -d v0.1
        
      • 推送某标签到远程

        $ git push origin v1.0
        

        推送所有未推送的标签到远程

        $ git push origin --tags
        
      • 删除已推送的标签

        1. 先删除本地

          $ git tag -d v0.9
          
        2. 远程删除

          $ git push origin :ref/tags/v0.9