学习使用Git来管理代码

2024-02-05 星期一

Git是什么?

Git是一个开源的版本控制系统,它可以帮助我们管理代码,同时保证我们的代码是最新的。

什么是版本控制?

版本控制是一种系统,它记录一个或多个文件的变化,以便将来能够查看特定版本的内容。就像现在的软件里面会显示当前的版本一样。

安装

在你的电脑上,安装Git。可以访问Git的官网 https://git-scm.com/ 下载安装程序。根据你的操作系统(Windows、Mac 或 Linux),选择合适的安装包。

Git的基本概念

仓库(repository)

Git仓库是一个存放代码的地方(就是一个文件夹),它可以是本地的,也可以是远程的。

分支(branch)

Git分支你可以理解为像树枝一样的东西。每个分支是独立的,你修改一个分支的时候,不会影响到其他的分支,你可以在不同的分支上工作。

提交(commit)

提交是Git中的一种操作。每次提交都会生成一个唯一的标识符和历史记录,它会记录你的代码的变更以及提交者的名字,可以用来回滚。

合并(merge)

合并是Git中的一种操作。合并是将两个分支合并到一个分支上的操作。比如两个分支都是实现了不同的功能,我们需要将它们合并到一个main分支上。

Git工作流程

工作区

Git工作目录是一个Git仓库的根目录,也就是当前的目录。

暂存区

它是工作区与本地库之间的一个临时存储区。在 Git 中,当你对文件进行修改后,这些修改首先会处于工作目录中。为了将这些修改纳入下一次提交(commit),你需要先将它们添加到暂存区。

作用

暂存区允许开发者选择性地控制哪些修改应该包括在下一次提交中。这意味着你可以修改多个文件,但只选择其中一部分进行提交,从而使每次提交都是有意义的并且具有特定目的。这种机制有助于保持项目历史的清晰和组织性,也方便在需要时回滚或检查特定的变更。

本地库

提交到Git仓库的文件都会被放在本地库中。

远程库

就是在服务器上存放的仓库。

Git的基本命令

配置Git

配置相关命令。

设置用户

设置当前Git仓库的用户信息。以后提交代码的时候,会使用这个用户信息。

bash
git config user.name "Your Name"
git config user.email "Your Email"

加上--global参数,可以设置全局用户信息。

查看用户

查看Git的用户信息。

bash
git config user.name
git config user.email

查看配置

查看当前Git仓库的配置。

bash
git config --list

排除文件

可以在工作目录下创建一个.gitignore文件,用来排除不需要提交到Git仓库的文件。

bash
touch .gitignore

Git仓库创建和克隆

初始化

Git会在你的工作目录上,初始化Git仓库,会在当前文件夹下创建一个.git文件夹。

bash
git init

克隆

下载一个远程Git仓库到本地。

bash
git clone <url>

基础工作流

添加暂存区

将文件添加到暂存区。

bash
git add <file>

如果使用.会添加当前目录下的所有文件。

从暂存区删除

将文件从暂存区删除。

bash
git rm <file>

如果使用.会删除当前目录下的所有文件。

查看仓库状态

查看Git仓库的状态。

bash
git status

提交

提交文件到Git仓库,每个提交都需要包含一个提交信息。

bash
git commit

快捷输入信息,使用-m参数

bash
git commit -m "message"

查看提交

查看Git仓库的提交。

bash
git log

添加-p参数,可以查看提交的详细信息

查看提交历史

查看Git仓库的提交历史。

bash
git reflog

撤销提交

关于撤销的操作,有使用resetrevert两种。

使用reset

主要用于将当前分支的头部移动到指定的状态,也可以用来操作暂存区(staging area)和工作目录的状态。它可以更改提交历史。

用法:

  • --soft:仅仅移动 HEAD 指针,不改变暂存区和工作目录。
  • --mixed(默认):移动 HEAD 指针,并重置暂存区以匹配指定提交,但不改变工作目录。
  • --hard:移动 HEAD 指针,并重置暂存区和工作目录,以匹配指定提交。这会丢弃自那个提交以来的所有更改。
bash
git reset <commit>

使用场景:你可以更改分支的历史,包括重置暂存区和工作目录到某个特定的状态。这对于本地分支的操作比较有用,尤其是在还没有推送到远程仓库的情况下。

使用revert

用于撤销一个或多个先前的提交,它通过创建一个新的提交来实现,这个新提交是对要撤销的提交的逆操作。

bash
git revert <commit>

使用场景:你可以安全地撤销之前的提交,而不影响项目的历史记录。这对于已经推送到远程仓库的更改尤其重要,因为它不会给其他协作者带来麻烦。

推送和拉取

推送

将文件推送到远程仓库。

bash
git push

拉取

将远程仓库的文件或者分支拉取到本地仓库。

bash
git pull

分支和合并

创建分支

bash
git branch <name>

切换分支

bash
git checkout <name>

添加-b参数,可以创建并切换分支

查看分支

bash
git branch

合并分支

将指定分支合并到当前分支,用法:

  • --ff(默认):当合并可以快进时,只进行快进合并(默认行为),如果希望可能时保持线性历史,可以使用此选项。
  • --no-ff:不自动创建合并提交,即使合并可以通过快进完成,Git 也会生成一个合并提交。这对于保持项目历史中的分支结构很有帮助。
  • --no-commit:执行合并操作但在自动提交前停止,允许你检查和可能继续修改合并结果之前的合并。这个选项不会完成合并,只会更新工作区和索引(暂存区)以反映合并结果。
  • --ff-only:只在合并可以快进时才合并,否则合并会失败。这对于确保不会创建额外的合并提交很有用,例如,在严格要求线性历史的项目中。
  • --squash:将所有合并的提交压缩成一个单独的提交。这可以保持目标分支的历史简洁,但是从各个原始提交中带来的更改会保留下来。需要注意的是,这种合并不会记录哪些分支被合并了,因为它不创建一个真正的合并提交。
bash
git merge <name>

添加-m参数,可以添加合并信息

远程仓库

添加远程仓库

bash
git remote add <name> <url>

查看远程仓库

bash
git remote -v

删除远程仓库

bash
git remote remove <name>

推送到远程仓库

将当前分支推送到远程仓库的指定分支

bash
git push <name> <branch>

从远程仓库拉取

从远程仓库拉取当前分支,不会自动合并

bash
git fetch <name>

从远程仓库拉取指定分支,并自动合并。

bash
git pull <name> <branch>

Rebase

git rebase 是 Git 版本控制系统中的一个强大命令,用于修改提交历史。它的主要作用是将一个分支上的更改重新应用到另一个分支的顶部。这通常用于保持一个干净、线性的提交历史,或者在将更改合并到主分支之前整理、修改或更新提交。

作用

  1. 创建线性历史

当你在一个分支上工作时,主分支可能已经进展了。使用 rebase,你可以将你的分支更改放到主分支当前的末端,就像你是在主分支的最新状态上开始工作那样。这使得项目历史看起来像是线性发展的,没有并行发展的分支。

  1. 清理提交历史

rebase 允许你修改、重排、合并或删除提交。这对于清理你的提交历史、创建更清晰的、更可读的历史非常有用。例如,你可以将多个“修复打字错误”的提交合并为一个提交,以保持历史的整洁。

  1. 解决分支冲突

通过 rebase,你可以逐个地将提交应用到基底分支的顶部,这使得解决冲突变得更容易和更有条理。相比合并(merge)可能一次性引发多个冲突,rebase 允许你在每次应用单个提交时处理冲突,使得整个过程更加可控。

  1. 准备拉取请求(Pull Request)

在多人协作的项目中,rebase 可以用来更新特性分支,确保它可以干净地合并到主分支中。在你的拉取请求被合并之前,将你的分支与主分支同步(通过 rebase)意味着你的更改可以直接被快进合并(fast-forward merge),避免不必要的合并提交。

bash
git rebase <branch>
~ cd ../

Comment / 留言区