Git指令集


写在前面

Git是一个分布式版本控制系统,广泛用于软件开发和其他需要版本控制的项目中。Github和GitLab两个计算机领域绕不开的平台,都基于Git进行版本控制和协作开发。本文档将介绍一些常用的Git指令,帮助你更好地理解和使用Git。我们以Github为例进行说明。

Git配置

在使用Git之前,我们需要进行一些基本的配置,主要包括设置用户名和邮箱地址。这些信息会被记录在每次提交中,用于标识提交的作者。

打开Git Bash,执行以下命令进行配置:

git config --global user.name "你的用户名"
git config --global user.email "你的邮箱地址"

如果去掉--global参数,则表示只对当前仓库进行配置。

如果想查看当前的配置信息,可以执行以下命令:

git config --list

远程仓库关联

Github其实就是一个代码托管平台,用户可以在上面创建远程仓库来存储和管理代码。要将本地仓库与远程仓库关联,有以下两种方式:

  1. git clone:用于从远程仓库克隆代码到本地。
    例如我们在E:\Projects目录下打开Git Bash,执行以下命令:

    git clone <远程仓库地址>

得到的结果是Git会在E:\Projects目录下创建一个新的文件夹,文件夹名称与远程仓库名称相同,里面包含了远程仓库的所有代码和历史记录。结构图如下:

当前目录
├─ repo/
│ ├─ .git/
│ ├─ README.md
│ └─ ...
  1. git init:在本地创建一个新的Git仓库,然后手动关联到远程仓库。
    例如我们在E:\Projects目录下打开Git Bash,执行以下命令:

    git init
    git add .
    git commit -m "initial commit"
    git remote add origin <远程仓库地址> //关联远程仓库
    git branch -M main //把当前分支强制重命名为main
    git push -u origin main

Git会在E:\Projects目录下创建一个.git文件夹,表示这是一个Git仓库。结构图如下:

├─ 当前目录
│ ├─ .git/
│ ├─ README.md
│ └─ ...

注意以上两种方法均需要在远程仓库平台(如Github)上提前创建好远程仓库。

文件提交

在掌握怎么提交文件之前,我们需要先了解Git的工作区、暂存区和本地仓库(版本库)三个概念:

工作区

工作区是我们在电脑上看到的文件和文件夹的实际位置。我们在工作区进行文件的编辑、添加和删除等操作。

暂存区

暂存区是一个临时存储区域,用于保存我们准备提交到本地仓库的文件快照。当我们执行git add命令时,文件会被添加到暂存区。

本地仓库

本地仓库是我们电脑上存储版本历史记录的地方。当我们执行git commit命令时,暂存区的文件会被提交到本地仓库,形成一个新的版本,这个版本会有唯一的标识符且不可更改。

了解了这三个概念后,我们就可以在.git所在的目录下执行相关指令来提交文件了。

常用指令

  1. git add <文件名>:将指定文件添加到暂存区。如果要添加所有修改过的文件,可以使用git add .
  2. git status:查看哪些文件在暂存区中。不在暂存区代表未被git跟踪。
  3. git diff:查看工作区暂存区之间的差异。
  4. git commit -m "提交信息":将暂存区的文件提交到本地仓库,并附上提交信息。
  5. git log:查看提交历史记录。
  6. git diff –cached:查看暂存区本地仓库之间的差异。
  7. git push origin <分支名>:将本地仓库的更改推送到远程仓库的指定分支上。

文件拉取

文件拉取有两种操作方式:

  1. git pull origin <分支名>:从远程仓库的指定分支拉取最新的更改并合并到当前分支。
  2. git fetch origin <分支名>:从远程仓库获取最新的更改,但不进行合并。需要手动执行git merge命令将更改合并到当前分支。

第二种方式的安全版:

git checkout <分支名>        //切换到指定分支
git fetch origin <分支名> //从远程仓库获取最新的更改
git diff origin/<分支名> //查看远程分支和本地分支的差异
git merge origin/<分支名> //将远程分支的更改合并到当前分支

分支管理

分支是Git的一个重要特性,允许我们在同一个仓库中并行开发不同的功能或修复不同的bug。常用的分支管理指令如下:

创建分支

git checkout -b <分支名>   //创建并切换到新分支
git push -u origin <分支名> //将新分支推送到远程仓库并关联
git branch <分支名>        //只创建新分支
git push -u origin <分支名> //将新分支推送到远程仓库并关联
  • 这里分支名常用feature-xxx(新功能)、bugfix-xxx(修复bug)、hotfix-xxx(紧急修复)等命名规范。

  • 创建的分支自动继承当前分支的代码和历史记录。

切换分支

git checkout <分支名>      //切换到指定分支

查看分支

git branch                 //查看本地分支
git branch -r //查看远程分支
git branch -a //查看所有分支

合并分支

git checkout <目标分支>     //切换到想要的当前分支
git merge <源分支> //将源分支合并到当前分支(源分支是本地分支)
或者
git fetch origin <源分支> //从远程仓库获取最新的更改
git merge origin/<源分支> //将远程分支合并到当前分支

当没有冲突时,Git会自动完成合并操作,然后执行add和commit操作。如果有冲突,Git会提示你手动解决冲突,解决后你需要手动执行add和commit操作。

这里特别说明一下origin/<源分支>代表的是本地记录的远程分支快照,不是远程仓库本身,而是你上次fetch/pull时,Git在本地保存的一个远程分支指针。因此为了确保合并的是最新的远程状态,建议先执行git fetch origin <源分支>命令。

不难看出,merge操作实际上是将两个分支的代码进行整合,生成一个新的提交记录。并且这一行为发生在本地仓库中。

删除分支

git branch -d <分支名>      //删除本地分支
git push origin --delete <分支名> //删除远程分支

查看提交历史

git log

git log命令用于查看提交历史记录,在文件提交模块有提到过,这里补充一个常用的参数:

git log --oneline        //以简洁的单行格式显示提交历史

git log命令还有很多其他参数,可以根据需要现学现用,这里就不过度展开了。

git blame

git blame <文件名>命令用于查看文件的每一行最后一次修改的提交记录,包括提交者、提交时间和提交信息等。这个命令对于追踪代码的变更历史非常有用。

同样git blame命令也有很多参数,可以使用git blame --help命令查看详细的帮助信息。

恢复和回退

在使用Git的过程中,有时我们可能需要恢复文件到某个特定的状态。例如你写一个.py文件,写着写着红温了,文件改废了,但你又不知道改了哪里,这时候你就非常想回到上一次的提交重新来过。Git提供了多种方式来实现文件的恢复和回退,下面介绍几种常用的方法。

重中之重:恢复和回退一定要在操作之前知道后果是什么,否则你是真的欲哭无泪啊!

checkout

git checkout <commit> -- <文件名>    //将工作区的文件恢复到<commit>提交的状态,同时自动add到暂存区

这个命令会将指定文件恢复到提交的状态,丢弃工作区中的所有修改。注意,这个操作是不可逆的,一旦执行,工作区中的修改将无法找回。

易踩的坑: 如果去掉文件名,执行git checkout <commit>会把你的所有工作区的文件恢复到指定提交时的状态,但是此时,你的HEAD指针会被移动到该提交上,处于分离头指针状态。如果你在这个状态下进行新的提交,这些提交将不会属于任何分支,容易导致丢失。此时你执行git checkout <分支名>可以回到正常状态,但是这也会导致工作区的文件回到该分支的最新状态,即checkout之前的状态。所以,这一操作一般用来历史,而不是历史.

reset

–soft

git reset --soft <commit>    //将当前分支的HEAD指针移动到<commit>提交,保留暂存区和工作区的修改

用大白话说就是add还在,commit没了。
常常用在你想修改提交说明的时候。

–mixed (默认)

git reset --mixed <commit>    //将当前分支的HEAD指针移动到<commit>提交,保留工作区的修改,清空暂存区

用大白话说就是add没了,commit没了,工作区还在。
常常用在你想重新选择要提交的文件的时候。

–hard

git reset --hard <commit>    //将当前分支的HEAD指针移动到<commit>提交,清空暂存区和工作区的修改

用大白话说就是add没了,commit没了,工作区也没了。
常常用在你这次改动彻底废了,想回到某个提交重新开始的时候。

revert

git revert命令用于撤销某个提交的更改,但不会删除该提交记录。相反,它会创建一个新的提交,内容是对指定提交的反向更改。

git revert <commit>    //撤销<commit>提交的更改,在本地仓库生成一个新的提交

常常用在你已经将更改推送到远程仓库,但又想撤销某个提交的情况下。因为它不会修改提交历史,所以不会影响其他协作者的工作。

你可以理解为在团队协作过程中不能轻易修改远程仓库的历史提交记录。

reflog

reflog是Git的一个强大功能,用于记录HEAD指针的移动历史。可以说是我们在误操作后找回丢失提交的最后一道防线。

git reflog    //查看HEAD指针的移动历史
git reset --hard <reflog条目> //将当前分支的HEAD指针移动到指定的reflog条目

reflog条目通常以HEAD@{n}的形式表示,其中n是一个整数,表示从当前HEAD位置向后数的第n次移动。

总结

本文档介绍了Git的基本概念和常用指令,包括配置、远程仓库关联、文件提交、文件拉取、分支管理、查看提交历史以及恢复和回退等内容。掌握这些指令将帮助你更有效地使用Git进行版本控制和协作开发。
纸上得来终觉浅,绝知此事要躬行。希望大家在实际应用中学习Git,而不是看着Blog纸上谈兵。
Git功能强大,本文档只是冰山一角,建议在实际使用中不断学习和探索更多高级功能。祝你在使用Git的旅程中一切顺利!

参考资料

Lyrics Sharing

是不是我能给的没他多
是否再绚烂的星河
天亮都要失色
听说你为他做的
件件是我 曾经求而不得
我够不着的烟火
偏偏降落 在别人窗口
那晚的风
吹到今天都还未凉透
才松开手
你却已握紧别的温柔

文章作者: Cordial-Kid
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Cordial-Kid !
  目录