Git笔记

Git笔记

Git工作流和命令

GitSVN的区别

SVN:简单、集中,适合流程明确、团队小的项目。

Git:分布式、灵活,适合大型团队、多分支并行开发,对协作和容错要求高的项目。

对比点 Git(分布式) SVN(集中式)
存储方式 内容寻址(K/V 数据库,基于哈希) 文件增量存储
使用流程 add → commit → push (更复杂) 直接 commit (更简单)
网络依赖 本地操作无需联网 必须依赖远程仓库
协作模式 每人一个完整仓库,可多远程 单一中央仓库
分支管理 轻量级,快速切换 较重,切换和合并操作慢
容错能力 远程挂了也能本地提交 远程挂了无法继续
  • 1.存储方式不同

    Git的版本库是在本地,而SVN的版本库是在远程服务器上。(版本库存放每次的提交记录,包括文件变动、提交人/时间、备注等等)

    Git按照原数据的方式将文件的一个版本存入了一个类似于K/V数据库,而SVN是按照文件变化的方式进行一个存储。Git的内部有一个类似于K/V的数据库,把他理解为是一个Map<K.V>,我们将内容存储到Git的数据库内后,Git会返回一个key给我们,这个key是唯一的,相同内容始终对应相同 key,避免重复存储;而SVN每次提交会记录文件的差异(增删改),属于集中式的版本控制。

  • 2.使用方式不一样

    SVN 操作流程较少,学习门槛低;Git 的流程更复杂,但本地操作不依赖远程,灵活度高。

    从本地把文件推送到远程服务,SVN只需要commit,其他开发者执行 update 就能获取最新版本;

    而Git需要addcommitpush 三个步骤。使用SVN开发者只要把文件修改了,只要commit,其他开发人员就可以直接checkout下来,但是Git就不相同了,Git如果要从本地将修改后的文件提交进入远程仓库,再从远程仓库将其他开发者修改后的文件checkout下来需要以下几个步骤:

    • (1).首先把修改后的文件通过add添加到我们的暂存区;
    • (2).然后通过commit命令将暂存区的文件提交到历史存储区;
    • (3).最后通过push命令将本地仓库的文件存入到远程仓库;
    • (4).要通过clone命令将远程仓库的文件拉到本地仓库;
    • (5).通过pull/fetch从远程仓库获取最新内容
    • (6).最后通过checkout切换分支或恢复指定版本的文件;
  • 3.管理模式不一样

    Git是一个分布式的管理系统,而SVN是远程集中式的管理系统,如果说SVN的远程仓库挂掉了,那我的本地项目再也不能做提交,也不能做分支的切换,也不能够干和版本管理相关的任何事情,这就是集中式管理的缺陷;

    而Git是在项目本地内有一个Git仓库,也就是说在本地一个项目包含一个完整Git仓库,远程仓库能干的事情本地的Git仓库也能干,即使远程仓库宕机,本地依然可以。本地仓库和远程仓库通过四种主要传输协议相关联(本地协议、Http协议、SSH协议、Git协议)。Git还支持远程仓库里面的多个远程仓库。

Git解决冲突

常见的冲突场景,git merge <branch>git pullgit rebasepull的底层其实就是fetch+merge/rebase

Git 解决冲突的核心就是 人工决定保留哪一部分修改编辑文件标记解决完成合并

避免冲突的最好建议:经常git pullgit fetch,保持更新,减少大规模合并;小步提交,不要一次性改动太多文件;避免多人同时改动同一块代码;保持提交历史线性,减少复杂merge

  • 查看冲突文件

    1
    git status
  • 手动编辑冲突文件

    删除 <<<<<<<=======>>>>>>>,保留最终想要的内容。

    1
    2
    # 例如决定保留两者的结合
    print("我是当前分支的代码 + 我是要合并进来的代码")
  • 标记为已解决

    1
    git add <conflicted_file>
  • 完成合并

    • 如果是merge

      1
      git commit
    • 如果是rebase

      1
      git rebase --continue

扩展:

SVN

Git使用代理

在 Git 中设置代理:注意代理端口要修改成你的代理软件监听的端口。

全局 HTTP/HTTPS 代理

1
2
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

如果代理是 socks5,改成:

1
2
git config --global http.proxy socks5://127.0.0.1:1080
git config --global https.proxy socks5://127.0.0.1:1080