Skip to content

Latest commit

 

History

History
218 lines (168 loc) · 15.7 KB

GitLearningNote.md

File metadata and controls

218 lines (168 loc) · 15.7 KB

Git学习笔记

作者:Luvoy,鸣谢:廖雪峰

写在前面

本笔记参考了廖雪峰老师的Git教程

学习东西时如果只追求速度,那么很容易学了就忘,必须时常复习。

子曰:温故而知新,可以为师矣。

然而复习时光看是不行的,容易眼高手低,遂整理问题和答案,并且用跳跃查看以起到遮掩的目的。

其他链接:

国外网友制作的Git Cheat Sheet

Git的官方网站

复习问题

开始

  1. 简述Git诞生过程?谁因为什么用什么发明的?查看答案
  2. 集中式和分布式版本控制系统有什么区别呢? 查看答案
  3. 安装完成git后需要设置什么?global参数有什么作用?查看答案

创建版本库

  1. 什么是版本库?如何初始化版本库?如何添加文件?查看答案
  2. 如何查看仓库的状态?如何查看文件具体修改了什么内容?查看答案
  3. 如何看到git的日志信息?如何只输出commit id和commit的信息?commit id是用什么计算出来的?查看答案

版本回退

  1. Git中用什么表示当前版本?上一个版本?往前n个版本?查看答案
  2. 如何把当前版本回退到上一个版本?--hard参数有什么意义?回退的原理是什么?查看答案
  3. 忘记commit id和版本如何回退?未commit但是有修改的其他文件会不会被回退?查看答案
  4. 什么是工作区?什么是版本库?add和commit在这些区域上执行了什么操作?查看答案
  5. 某文件经历了:修改1->add->修改2->commit,提交的是哪次修改?为什么?查看答案
  6. 什么命令可以撤销上一次修改?(让这个文件回到最近一次git commit或git add时的状态?)查看答案
  7. 如何删除文件?错删文件怎么办?查看答案

远程仓库

  1. 如何创建并在github上添加SSH KEY?查看答案
  2. 如何在github上创建远程仓库,并将本地库推送到远程?查看答案
  3. 如何将远程仓库克隆到本地?查看答案

分支管理

  1. 分支有什么用?如何创建分支?如何查看当前分支?如何合并分支?如何删除分支?查看答案
  2. 主分支可以看到其他分支的修改和提交吗?查看答案
  3. 在某一分支A上修改文件并提交, 然后切换到另一分支B上修改提交, 然后将A合并到B上, 会发生什么? 如何解决?查看答案
  4. 用什么命令可以直观地查看分支的合并情况?查看答案
  5. 通常情况下合并分支Git会使用Fsat forward模式, 这种模式有什么特点? 如何不使用这种模式?查看答案
  6. 实际开发中应该怎样进行分支管理比较好?查看答案
  7. 突然需要创建新分支, 但是当前分支上的工作暂时无法提交怎么办?查看答案
  8. 在master分支上修复的bug,想要合并到当前dev分支, 而不是再修复一遍, 有什么方法吗?查看答案
  9. 还没有合并的分支如何删除? 这用于什么场景?查看答案

远程与协作

  1. 如何查看远程仓库信息?查看答案
  2. 远程origin下只有一个master分支, 如何创建一个新分支?查看答案
  3. 如果一个用户A在他的设备上向origin下的dev分支提交并推送了东西, 然后B也想向dev推送,应该怎么做?[查看答案
  4. rebase操作有什么用?查看答案
  5. 如何删除远程分支?查看答案

标签管理

  1. 如何打标签? 有什么用? 查看答案
  2. 如何把标签推送到远程?查看答案

使用github

  1. 如何参与一个开源项目?查看答案
  2. 查看答案
  3. 查看答案
  4. 查看答案

答案

  1. Git由linux系统之父Linus,在管理linux版本时,因为其他版本控制系统太难用或者收费,自己用C语言两周写出来的分布式版本控制系统。返回问题

  2. 集中式相当于图书馆,任何修改都必须上传到服务器上,版本库也存放在服务器上,必须联网。

    分布式相当于每个人电脑里都有完整的版本库,修改文件只需把修改发送给拥有相同版本库的其他人就可以了。不需要服务器存储,可以有服务器用来交换好传输。返回问题

  3. git config --global user.name "Tom"
    git config --global user.email "[email protected]"
    

    global参数是将这台计算机上所有Git仓库都用这个配置返回问题

  4. 版本库又叫版本仓库repository,可看作一个目录,目录下的文件被Git管理起来,追踪增删改查记录

    • 初始化版本库:

      • 在某一文件夹下输入命令
        git init
        
    • 向版本库添加文件:

      • 将一个或多个文件放入此文件夹下并输入命令
        git add 文件名
        
      • 将文件提交到仓库
        git commit -m "wrote a file"
        

      git有两个区域,工作区暂存区,git add把工作区的修改提交到暂存区,git commit把暂存区的修改保存到本地库,git push把本地库的记录,推送至远程库。返回问题

  5. 使用git status命令查看仓库状态,使用git diff命令查看文件变化返回问题

  6. 使用git log命令查看仓库日志,加上--pretty=oneline参数可以将每次修改按一行显示。其中第一列是commit id,由SHA1计算得出。返回问题

  7. HEAD表示当前版本,HEAD^表示上一版本,HEAD^表示上上版本,往上100个版本是HEAD~100。返回问题

  8. git reset --hard 某版本即可回退到某一版本。此时,回退只是把HEAD的指向修改返回问题

  9. 用命令git relog可以看到历史命令。没有commit 的文件,用reset,也会恢复到之前的版本。返回问题

  10. 文件夹目录是工作区(working directory),而.git文件夹是Git版本库(Repository),版本库包括缓存区(stage)和第一个分支(master),指向master的指针是HEAD。add命令会把文件修改添加到暂存区,commit把暂存区全部提交到当前分支。提交后,工没有对工作区修改,那么工作区就是干净的返回问题

  11. 只会提交第一次修改,因为git必须先把文件添加到暂存区再提交。返回问题

  12. git checkout -- file可以撤销修改,如果文件修改后没有add就撤销,则退回到和版本库一样的状态;如果已经add后修改再撤销,则退回到add时的状态。git reset可以将暂存区的修改回退到工作区返回问题

  13. git checkout -- file已经删除了文件,可以git rm file确认在仓库中删除并且commit。

    如果是误删,可以用checkout --file回退,但是这个文件必须add过才行。返回问题

  14. ssh-keygen -t rsa -C "email"创建ssh key

    然后在github的个人主页,settings->ssh keys-> add ssh key

    注意把公钥里所有的文本都粘贴上去。返回问题

  15. 在github个人页上创建一个repository,然后在本地用

    git remote add origin [email protected]:UserName/GitName.git

    然后使用git push -u origin master

    将本地库内容推送到远程。-u是做关联,以后可省。返回问题

  16. 在某目录下使用命令git clone [email protected]:UserName/GitName.git

    这是SSH协议, 必须在github个人设置里加入SSHKEY才可以

    没有SSH就用http吧: git clone https://github.com/UserName/GitName.git返回问题

    • 分支的作用: 每个人可以在自己的分支上干活, 互不影响, 想提交就提交, 等开发完后, 再一次性合并到原来的分支上
    • 创建分支: git branch 分支名
    • 查看分支: git branch
    • 切换分支: git checkout 分支名或者git switch 分支名
    • 创建+切换分支: git checkout -b 分支名或者git switch -c 分支名
    • 合并某分支到当前分支: git merge 要合并的分支名
    • 删除分支: git branch -d 分支名 返回问题
  17. 在dev分区修改了文件,然后切换到主分区,查看status,是可以看到状态的,就可以在主分区来add 和commit dev 分区的改动;

    如果在dev分区修改了文件,并且add和commit 了 那么切换到主分区就看不到修改了

    所有分支, 工作区和暂存区是公共的 返回问题

  18. 会出现冲突, 因为两个分支文件不一样, 无法合并. 应该具体修改后重新提交, 此时会自动合并.返回问题

  19. 推荐使用

    git log --graph --pretty=oneline --abbrev-commit
    

    返回问题

  20. Fast-forward是快进模式, 直接把当前分支指向要要合并的分支, 但是这种模式下, 删除分支后, 会丢失分支信息. 禁用Fast-forward模式, git在merge时会生成一个新的commit. 使用--no-ff参数即可.返回问题

  21. master分支应该是非常稳定的, 仅用来发布新版本, 工作都在dev分支上, 不同的人协作时, 都创建自己的分支往dev分支上合并返回问题

    • 使用git stash命令, 将当前工作现场储存起来.
    • 使用git stash list命令, 查看已经储藏的工作
    • 使用git stash apply恢复, 然后git stash drop删除, 或者git stash pop弹栈

    返回问题

  22. git cherry-pick <commit>命令, 将在其他分支做的commit, 在当前分支上复制重现一下返回问题

  23. git branch -D <分支名>强制删除, 用于开发了一个新的实验功能, 但是突然要放弃的时候.返回问题

  24. git remote -v查看远程仓库信息返回问题

  25. 在本地创建一个分支, 比如dev, 然后添加文件, 提交修改后, 用git push origin dev即可在远程创建新的分支并提交返回问题

  26. 这样推送往往会失败, 因为远程分支比本地的要新, 应该先用git pull抓取远程的版本到本地, 才能推送自己的. 要注意建立本地分支和远程分支的关联: git branch --set-upstream-to=origin/<branch-name> <branch-name>返回问题

  27. rebase操作可以把本地未push的分叉提交历史整理成直线;目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。返回问题

  28. git push origin --delete <分支名>删除远程分支返回问题

    • 命令git tag <tagname>用于新建一个标签,默认为HEAD,后面也可以指定一个commit id
    • 命令git tag -a <tagname> -m "descriptions"可以指定标签信息
    • 命令git tag可以查看所有标签

    标签相当于给某次提交起了别名返回问题

    • git push不能把标签推送到远程
    • 必须显式地操作git push origin <tagname>
    • 或者一次性推送全部标签git push origin --tags
    • 命令git tag -d <tagname>可以删除一个本地标签
    • git push origin :refs/tags/<tagname>可以删除一个远程标签

    返回问题

    1. 找到别人的开源项目, 点击fork,相当于在自己账号下克隆了该仓库
    2. 然后在本地克隆自己账号的这个仓库, 这三者关系如下
    ┌─ GitHub ────────────────────────────────────┐
    │                                             │
    │ ┌─────────────────┐     ┌─────────────────┐ │
    │ │ twbs/bootstrap  │────>│  my/bootstrap   │ │
    │ └─────────────────┘     └─────────────────┘ │
    │                                  ▲          │
    └──────────────────────────────────┼──────────┘
                                       ▼
                            ┌─────────────────┐
                            │ local/bootstrap │
                            └─────────────────┘
    
    1. 对自己的本地仓库做出想要的修改, 然后推送到自己的远程仓库
    2. 如果希望项目原有者接受你的修改, 必须pull request 返回问题
  29. 返回问题

  30. 返回问题