Git基础学习

Git基础学习

八月 09, 2021

前言:

身为程序员,在工作中必不可少的要要用到git。这里就系统的学习一下Git相关的基础知识。


Git的基础概念

工作区

想要弄懂Git是怎么对代码进行管理的,首先就需要了解Git的工作区域是如何构成的。只有彻底弄懂了Git工作区域的构成,你才可以在适当的区域使用合适的命令。下图所示为Git的4个工作区和工作区之间的一些常见操作。

Git的工作区域和流程示意图

4个工作区分别是:

  • Workspace:工作区,就是平时编写代码进行开发改动的地方
  • Index:暂存区,当执行git add的命令后,工作区的文件就会被移入暂存区,暂存区标记了当前工作区中那些内容是被Git管理的
  • Repository:本地仓库,位于自己的电脑上,通过git commit提交暂存区的内容,就会进入本地仓库
  • Remote:远程仓库,用来托管代码的服务器,远程仓库的内容能够被分布在多个地点的处于协作关系的本地仓库修改,本地仓库修改完代码后通过git push命令同步代码到远程仓库。

一般来说,Git的工作流程分为以下几步

1
2
3
4
1.在工作区开发,添加,修改文件
2.将修改后的文件放入暂存区
3.将暂存区的文件提交到本地仓库
4.将本地仓库的修改推送到远程仓库

HEAD

HEAD始终指向当前所处分支的最新的提交点。当你所处的分支变化了,或者产生了新的提交点,HEAD的指向也会发生变化。

HEAD

分支

在了解了工作区域以后,还需要了解分支这个概念。这部分的内容我暂时没有想到较好的描述方式。简单的来说Git维持一条主线,名称为master。当我们需要对master主线上的代码进行修改时,需要从master主线检出一条分支,在分支上进行修改,这样就不会影响他人继续从master检出分支。当我们对于分支的开发完成后,再将其合并到master中。

分支示意图

Git基本操作

git add

添加文件到暂存区

1
2
3
4
# 添加某个文件到暂存区,后面可以跟多个文件,以空格区分
git add xxx
# 添加当前路径下更改的所有文件到暂存区
git add .

git commit

1
2
3
4
5
6
7
8
# 提交暂存的更改到本地仓库,会打开编辑器进行编辑
git commit
# 提交暂存的更改,并记录下备注
git commit -m "your message"
# 等同于 git add . && git commit -m
git commit -am
# 可以对最近一次的commit信息进行修改,并且将新的修改追缴提交到最新的commit,不过commit的has值将被修改
git commit --amend

git pull

1
2
3
4
# 从远程仓库来取代码并合并到本地,可以简写为git pull,等同于git fetch && git merge
git pull <远程主机名> <远程分之名>:<本地分之名>
# 使用rebase的模式进行合并
git pull --rebase <远程主机名> <远程分之名>:<本地分之名>

git fetch

git pull不同的是git fetch操作仅仅只会拉去远程的更改,不会自动进行merge操作,对当前的代码没有影响

1
2
3
4
# 获取远程仓库特定分之的更新
git fetch <远程主机名><分支名>
# 获取远程仓库所有分支的更新
git fetch --all

git config

git config主要用于查询和设置配置信息

1
2
3
4
5
6
7
8
9
10
11
12
# 列出当前配置
git config --list
# 列出当前repository配置
git config --local --list
# 列出全局配置
git config --global --list
# 列出系统配置
git config --system --list
# 配置用户名
git config --global user.name "username"
# 配置用户邮箱
git config --global user.email "user@email.com"

git init

1
2
# 在当前文件夹下初始化一个本地仓库
git init

git remote

git remote用于执行对于远程仓库的操作

1
2
3
4
5
6
7
8
9
10
11
12
# 查看远程仓库名,默认origin
git remote
# 列出所有远程仓库,及其URL或Gitjian xie
git remote -v
# 添加远程仓库,并设置简写
git remote add origin(简写) <url>
# 展示远程仓库的信息
git remote show origin(简写)
# 重命名远程仓库
git remote rename origin ori
# 删除远程仓库,高危操作,一旦删除,所有和这个远程仓库相关的远程跟踪分支以及配置信息都将被删除
git remote remove origin

git clone

1
2
3
4
# 克隆远程仓库到本地,并复制所有的版本记录
git clone <url>
# 克隆指定分支到指定路径
git clone <分支名> <path>

git branch

git branch用于进行分支管理

1
2
3
4
5
6
7
8
9
10
11
12
# 新建本地分支,但不切换
git branch <branch-name>
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看本地和远程所有分支
git branch -a
# 删除本地分支
git branch -D <branch-name>
# 重新命名分支
git branch -m <old-branch-name> <new-branch-name>

Git的简单使用场景

在上一部分中,罗列一些基本的Git指令,但是你可能还不知道要在什么情况下使用它们。在这一部分中,将讲解一些实际场景中,我们将如何运用Git命令。

新建仓库

1
2
3
4
5
6
7
8
9
10
# 方式一: clone
git clone <url> <path>

# 方式二: 使用init remote pull
# 初始化本地仓库
git init
# 添加远程仓库
git remote add origin <url>
# 拉取远程仓库主分支代码
git pull origin master

提交代码

1
2
3
4
5
6
# 将当前路径下工作区的代码提交到暂存区
git add .
# 将暂存区代码提交到本地仓库
git commit -m "描述信息"
# 将本地仓库当前分支修改推送到远程仓库
git push origin <branch-name>

分支操作

1
2
3
4
5
6
7
8
# 切换到指定分支
git chechout <branch_name>
# 从指定分支创建并切换到新分支
git checkout <branch_name> -b <new branch_name>
# 使用删除分支的commit hash恢复分支
git branch <branch_name> <hash_val>
# 合并分支到当前分支
git merge <branch_name>

删除文件

1
2
3
4
5
6
7
8
# 删除工作区文件,同时也从暂存区删除对应文件的记录
git rm <file1> <file2>
# 从暂存区删除文件,但工作区仍保留
git rm --cached <file>
# 取消暂存区已经暂存的文件
git reset HEAD <file>
# 撤销上一次对文件的操作,丢弃所有修改内容
git checkout --<file>

隐藏变更

首先说明一下为什么需要隐藏变更。当我们在当前分支开发的时候,需要临时切换到其他分支,但是一旦分支进行切换,工作区和暂存区的内容将会丢失,所以Git并不允许在工作区和暂存区还有文件的时候进行分支切换。这个时候有两个办法,一个是将工作区和暂存区的内容提交到本地仓库

1
2
git add .
git commit -m "wip"

但是这种方法容易导致commit记录混乱,回退困难。

较好的方法就将变更隐藏到栈中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 隐藏当前变更到栈中
git stash
# 查看当前栈中所有隐藏的变更
git stash list
# 应用栈顶隐藏的变更
git stash apply
# 应用栈顶第二位隐藏的变更
git stash@{2}
# 由于git stash apply只是应用隐藏,并不对栈进行操作,所以需要手动删除指定隐藏
git stash drop stash{0}
# 从栈中弹出隐藏
git stash pop
/*
在某些情况下,你可能想应用储藏的修改,在进行了一些其他的修改后,又要取消之前所应用储藏的修改。
Git没有提供类似于 stash unapply 的命令,但是可以通过取消该储藏的补丁达到同样的效果:
*/
git stash show -p stash@{0} | git apply -R