Git快速入门

124 阅读9分钟

一、安装GIT

  1. 安装homebrew
  2. 安装xcode

二、基础配置

git config —-global user.name "Your name"

git config -—global user.email "yourEmail@example.com"

查看设置是否成功

git config user.name

基本操作

addcommit

添加

git add <file>

提交

git commit -m <message>

代理

git config --global http.proxy "<http://127.0.0.1:8080>"
git config --global https.proxy "<http://127.0.0.1:8080>"

三、时光机

git status

查看现在仓库的状态,会返回现在仓库哪些文件改动过和其他的信息

git diff

看得是工作区该文件与版本库中当前分支上该文件之间的差异

严格地说,不一定,还可能是缓存区和仓库的区别,但在此处,我们简单的理解为上述情况。

  • 如何看懂diff的结果

    diff –-git a/f1 b/f1
    index 8f86bb9..d74049c 100644
    - a/f1
    +++ b/f1
    @@ -1,7 +1,7 @@  
    code
    code
    code
    -code
    +code
    code
    code
    code
    
    1. 第一行表示结果为git格式的diffdiff --git a/f1 b/f1 进行比较的是,a版本的f1(即变动前)和b版本的f1(即变动后)。
    2. 第二行表示两个版本的git哈希值和最后的六位数字是对象的模式index 7a67204..8213f76 100644 index区域的7a67204对象,与工作目录区域的8213f76对象进行比较。100代表普通文件,644代表文件具有的权限(同linux文件权限)
    3. 第三四行表示进行比较的两个文件a/f1+++ b/f1 "-“表示变动前的版本,”+++"表示变动后的版本。
    4. 第五行表示代码变动的位置用两个@作为起首和结束@@ -1,7 +1,7 @@ "-1,7″分成三个部分:减号表示第一个文件(即f1),"1″表示第1行,“7″表示连续7行。 合在一起,就表示下面是第一个文件从第1行开始的连续7行。 同样的,”+1,7″表示变动后,成为第二个文件从第1行开始的连续7行。
    5. 第三部分是变动的具体内容code 变动的行,上下文各显示3行。将两个文件上下文合并显示在一起。 每一行最前面的标志位:“-”代表第一个文件删除的行用红色表示,“+”表示第二个文件新增的行用绿色表示,无标志表示该行无变动。

提交修改的步骤

提交修改的步骤和添加文件的步骤是一样的

  1. git add modified_file_name
  2. git commit -m "comment"

版本回退

查看过去的版本

git log -n 3 --pretty=oneline

其中

  • -n 3 → 查看过去的三个版本

  • --pretty=oneline → 美化结果为一行

    如果希望以图的形式展示分支结构

  • --graph

    结果

    # 美化的
    # commit_id ... comment
    9cda832cca9f6c1cf77eae5afa42e3b5d7af3580 (HEAD -> master) add version 3
    272ad41ad60b17bd6e00506da5166953dcfc4ede add version 2
    e245982e0e475d8a2c84209adaff560b7e42eadb add version 1
    
    # 不美化的
    commit 272ad41ad60b17bd6e00506da5166953dcfc4ede
    Author: dong1iu <dong1iu@qq.com>
    Date:   Sun Jun 13 13:51:24 2021 +0800
    
        add version 2
    
    commit e245982e0e475d8a2c84209adaff560b7e42eadb
    Author: dong1iu <dong1iu@qq.com>
    Date:   Sun Jun 13 13:50:51 2021 +0800
    
        add version 1
    dong1iu@IMAC-dong1iu gittest % git log -n 1
    commit 9cda832cca9f6c1cf77eae5afa42e3b5d7af3580 (HEAD -> master)
    Author: dong1iu <dong1iu@qq.com>
    Date:   Sun Jun 13 13:52:11 2021 +0800
    

回到过去的版本

git reset --hard HEAD^

HEAD指向的版本就是当前版本

工作区、暂存区和库

⭐网络上很多博客关于这一部分的讲述都是不清晰的,我整理了廖雪峰git教程下网友的评论,以下是我认为正确的内容

逻辑结构

  1. 工作区(woking directory)

  2. 版本库

    1. 暂存区(stage or index)
    2. 库(head)

添加过程

注意: git的任务是完成版本管理,所以在底层其实就是移动数据。

初始化完成后,三个区域都是空的

在编辑一个新的readme.md文件(v1)后,工作区会出现一个新的untracked文件,此时你add到缓存区,然后修改readme.md文件(v2)。到现在为止,你的工作区和缓存区很明显是不同的,指令git diff就是比较你的工作区和缓存区的不同。

现在,你在不add的情况下,直接将没有重新add的缓存区commit到你的库(head),自然你的库中应该是保存的你第一次编辑的readme.md文件(v1)。注意,此时你的缓存区不是"清空"的状态,而是和commit前保持一样的状态,区别是你的缓存区和head的状态一致,所以git status提示你的nothing to commit, working tree clean

那么如何比较你的工作区和库呢?答案是git diff HEAD -- filename

总结

比较工作区和缓存区 → git diff

比较工作区和库 → git diff HEAD -- filename

比较缓存区和库 → git diff -cached

比较不同库版本 →git diff 243550a 24bc01bgit diff commit_id1 commit_id2

git add操作 → git checkout -- filename

注意:

  1. git add本质是把暂存区的数据同步为工作区的数据,而checkout是将工作区的数据同步为stage中的数据。
  2. --不能少,有空格,不然命令会出错,变成了“切换到另一个分支”的命令,
  3. git checkout --filename在新版git中现在被git restore替代
  4. 原来的git reset HEAD 可以使用 git restore --staged 代替
  5. 原来的git checkout branchName 可以用 git switch branchName 代替。

撤销addgit restore --staged <file>...

unstage操作,取消add操作

删除文件

在工作区删除文件

rm filename

从库中删除文件

git rm filename

git commit -m "delete filename"

恢复被删除的文件

git restore filenamegit checkout -- filename

原理上来说,缓存区的文件和版本库的文件是一致的,所以你可以从缓存区恢复你的文件。

回滚单独的某个文件

git checkout commit_id filename

远程仓库

如何连接到你的远程仓库

  1. 注册你的github账号

  2. 创建SSH key

    ssh-keygen -t rsa -C "youremial@example.com"

    一般在用户主目录/.ssh下,里面有id_rsaid_rsa.pub两个文件,前者是私钥,后者是公钥。

    注意:千万不要丢失自己的私钥!!!

  3. 添加公钥到github账号

    Account settings → SSH and CPG keys → new ssh key

添加远程库

创建新的仓库

在github仓库主页上 new repository

关联本地仓库

git remote add origin git@github.com:dong1iu/learngit.git

远程库的名字就是origin

推送

git push -u origin master

第一次时使用-u代表关联,把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。以后可以简单是使用git push origin master

notes: -f参数可以强制推送

删除远程库连接

git remote -v → 查看远程库信息

git remote rm origin → 删除本地仓库连接远程仓库(比如github上的learngit仓库)的连接。

注意:

git push origin -d dev → 删除远程数据库上的分支

如何理解Origin

origin其实只是一个别名,按照我的理解,他是代表你本地仓库到远程仓库这个连接的名字。因为你push的时候需要知道你push到哪儿去了,所以你要指名这个连接,而完整的连接名太长,也不方便记忆和理解,所以使用origin来作为别称。另外,你从github上clone代码的时候,github会自动的把这个连接称为origin。

从远程库克隆

git clone git@github.com:dong1iu/gitskills.git

分支管理

首先我们要明白git分支的工作原理

请参看廖雪峰分支管理

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点

image.png

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev

image.png

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

image.png

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

image.png

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

image.png

创建和合并分支

创建分支

git branch branchname

切换分支

git switch branchname

注意:当你切换分支时,HEAD的位置会变化,也就是说,你在某个分支上做的变化,在另一个分支上是看不到的

查看分支

git branch

* dev
  master

星号代表当前HEAD所在分支

创建并切换分支

git switch -c branchname

合并某分支到当前分支

git merge branchname

删除分支

git branch -d branchname

删除远程上的分支

git push origin -d dev

分支冲突

在分支master和分支dev中分别修改readme.md的最后一行然后add并commit,merge的时候会发生冲突

此时处理的方式

  1. 放弃merge

    git merge --abort

  2. 修改冲突的文件并提交

    1. vim conflict_file

      <<<<<<< HEAD
      Creating a new branch is quick & simple.
      =======
      Creating a new branch is quick AND simple.
      >>>>>>> dev
      
    2. git add conflict_file

    3. git commit -m "merge conflict fixed"

分支策略

默认的情况下,git的merge采用fast forward策略,这种策略比较快,但是在改模式下,删除分支后会失去信息,使用--no-ff参数禁用fast forward策略

标签管理

创建标签

查看便签

git tag

添加便签

git tag <name>

给过去的commit_id添加标签

git tag <name> <commit_id>

查看已有的便签

git tag

查看标签信息

git show <tag>

其他说明

  1. -a指定标签名,-m指定说明文字
  2. 标签不是按时间顺序列出,而是按字母排序的

操作标签

删除

git tag -d v0.1

推送某个标签

git push origin v1.0

Github

查看当前的远程库

git remote -v

提取远程仓库

从远程仓库下载新分支与数据

git fetch

从远端仓库提取数据并尝试合并到当前分支

git merge

推送到远程仓库

git push -u origin master

删除远程仓库中的分支

git push origin -d dev → 删除远程数据库上的分支