2023-04-07-Git

2023-04-07-Git.md

Posted by lily on April 7, 2023

Git工作流程

一般工作流程如下:

  1. 在本地创建一个Git仓库。
  2. 克隆 Git 资源作为工作目录。在克隆的资源上添加或修改文件。
  3. 如果其他人修改了,你可以更新资源。在提交前查看修改。 提交修改。
  4. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。 关于三个区域的概念:
    1. 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    2. 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
    3. 你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

git工作模式

基本概念

  1. 工作区:就是你在电脑里能看到的目录。
  2. 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  3. 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

    多分支工作

    分支:就是你在工作区的一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时候都可以追踪历史,或者在将来某个时刻还原文件。

每个分支都相当于一套独立的工作区,可以在不同分支上进行不同的工作,最后再将各个分支的工作成果合并在一起。

  1. master分支:主分支,用于发布稳定版本。
  2. dev分支:开发分支,用于日常开发。
  3. 一般都是在dev分支上进行开发,开发完成后,再将dev分支合并到master分支上,发布新版本。

    分支切换原理

  4. Git 用一个指针叫 HEAD 指向当前分支。
  5. git的每个分支都会串成一个链表,每次提交,就会在链表上增加一个节点。
  6. 假如不同分支的进度相同,那么每个分支的链表都是一样的,只是 HEAD 指向不同的分支而已。
  7. 假如不同分支的进度不同,那么每个分支的链表就不一样了,HEAD 指向不同的分支,就会有不同的节点。

    分支合并原理

  8. 合并分支时,Git 会比较两个分支的最新提交,然后生成一个新的提交。
  9. 合并分支时,如果存在冲突,需要手动解决冲突,解决后,再提交。(否则可能会有文件丢失或重复
  10. 合并分支时,如果不存在冲突,Git 会进行“快进”,也就是直接将指针指向最新的提交,所以合并分支就是将指针指向最新的提交
  11. 合并分支时,如果存在冲突,Git 会生成一个新的提交(这个新的提交如何处理冲突?),这种情况下,合并就不是“快进模式”,而是”非快进模式”。

    远程仓库概念

  12. Git是分布式版本控制系统。所以本地仓库可以和远程仓库进行联系。
  13. 远程仓库就是存放在服务器上的仓库,可以是本地网络的服务器,也可以是互联网上的服务器。
  14. 本地的仓库和远程仓库可以通过ssh或者https协议进行连接。 3. 我们可以通过git clone命令将远程仓库克隆到本地。也可以通过git push命令将本地仓库的内容推送到远程仓库。实现本地仓库和远程仓库的同步。

Git常用命令

创建添加和提交

  • 初始化Git仓库,将当前目录作为git仓库,仓库名字不能有中文和空格。 git init <repoName>
  • 把文件添加到仓库 git add <filename> 或是 git add --all
  • 把文件提交到仓库 git commit -m "提交说明"
  • 查看仓库当前状态 git status
  • 查看修改内容 git diff <filename>

    查看提交历史

  • 查看提交历史,以便确定要回退到哪个版本 git log 把日志信息美化为一行 git log --pretty=oneline 在提交信息查看时,可以使用q键退出。其中前面一大串的是版本号,后面的是提交说明eaad...f0 (HEAD -> master) wrote a readme file

    版本回退

  • 回退到上一个版本HEAD^HEAD^^表示上上一个版本,HEAD~100表示上100个版本。 git reset --hard HEAD^

    hard参数的意义是,让这个版本成为当前版本,即工作区也会变成这个版本

  • 回退到指定版本 git reset --hard <commit id>,commit id是版本号的前几位。

    管理修改

  • 文件在工作区的修改全部撤销,
  • 如果已经添加到暂存区,那么撤销回到添加到暂存区的状态,
  • 如果没有添加到暂存区,那么撤销回到工作区的状态。
  • 回到最近一次commit或者add的状态 git checkout -- <filename>这里的–很重要,没有–,就变成了创建一个新分支。 git checkout -- <filename>这里的–很重要,没有–,就变成了创建一个新分支。
  • 撤销暂存区的修改,回到工作区 git reset HEAD <filename>其中 reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

    删除文件

    1. 用文件管理器把工作区文件删除了, 并且确实要删除该文件, git rm filename 再提交 git commit -m "remove filename"

      先手动删除文件,然后使用git rm 和git add效果是一样的。

    2. 误删了文件。用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原” git checkout -- <filename>

      远程仓库

  • 关联远程仓库 git remote add origin git@github.com:xxx/learngit.git
  • 把本地库的所有内容推送到远程库上 git push -u origin master第一次推送时需要加上u参数,git会把本地的master分支和远程的master分支关联起来,以后就可以使用 git push origin master推送最新修改了。
  • 获取远程库的更新 git pull origin master
  • 从远程库克隆master分支 git clone origin master
  • 解除和远程仓库的绑定 git remote rm origin
  • 查看远程库信息 git remote -v
  • 从远程仓库克隆 git clone git@github.com:xxx/gitskills.git