Git-随笔

Git 中的对象

  commit

    1.本次提交的 committer

    2.本次提交的注释 comment

    3.0/1/N 个祖先(零个或一个或多个指向该提交对象的父对象指针)

    4.指向暂存内容快照的指针 (如果恢复到某个提交, 则把分支指针指向这个 commit 对象, 把此快照恢复到工作区即可)

    5.指向 tree 的指针

  tree(目录树内容及其中各个文件对应 blob 对象索引)

    1.目录树

    2.每个文件的SHA1值

    3.每个文件的大小等

    4.每个文件对应的 blob 对象索引

  blob(文件内容对象)

    1.文件内容对象

  tag

    1.标签

对象关系图

提交对象 commit 指向一个快照

分支指向提交对象 commit, 切换分支即改变分支指向的 commit对象, 可以恢复 commit 指向的快照的内容到工作区

创建分支

切换当前分支

当前分支产生提交

清理现场(提交本分支中的信息), 恢复到原没有修改的分支

原有分支产生提交

 

新建分支: 会创建一个分支, 指向当前分支所指向的提交, 即两个分支指向同一个提交

切换分支: Git 会把工作目录的内容恢复为检出某分支时它所指向的那个提交对象的快照, 如果暂存区或者工作目录里, 有未提交的修改, 会和即将检出的分支产生冲突从而阻止 Git 为你切换分支, 所以切换分支时最好保持一个清洁的工作区域, 可以使用 stashing 或者 commit amending

合并分支:

  1.可以 Fast forward, 向前移动指针, 两个分支再次指向同一个提交, 不会产生新的提交

  2.有分叉, 找出三方(两个分支和共同祖先)最佳的同源合并点, 生成一个新的快照, 并自动创建一个指向此快照的提交对象, 会产生新的提交

找出三方节点

合并内容, 并产生一个新的提交指向新的快照

若此时有冲突, Git 会合并, 但不提交 , 等手工解决冲突(一旦 add 就相当于已解决)后再手动完成这次合并提交, 提交后也会如上图

 

 远程分支

  git branch -r 查看所有远程分支

  git branch -a 查看本地和远程的所有分支

  git remote show [originname] 查看远程与本地分支关系

  只要你不和服务器通讯, 你的 origin/bname 指针就会保持原位不会移动, 当 fetch 的时候会移动, 此时执行 git merge [远程名]/[远程分支名] 会自动合并到本地分支

  Git 向远程服务器 PUSH 时, 如果远程服务器没有此分支, 则会创建此分支

  追踪远程分支的几方法:

    1.git checkout -b [本地分支名] [远程名]/[远程分支名]

    2.git push -u [远程名] [本地分支名]:[远程分支名] #第一次PUSH的时候会自动跟踪

    3.git branch --set-upstream [本地分支名] [远程名]/[远程分支名]

    4.修改配置文件

      [branch "sns"]

             remote = origin
             merge = refs/heads/sns

原文地址:https://www.cnblogs.com/JohnABC/p/4108432.html