学习使用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
仓库的用户信息。以后提交代码的时候,会使用这个用户信息。
bashgit config user.name "Your Name" git config user.email "Your Email"
加上
--global
参数,可以设置全局用户信息。
# 查看用户
查看Git的用户信息。
bashgit config user.name git config user.email
# 查看配置
查看当前Git
仓库的配置。
bashgit config --list
# 排除文件
可以在工作目录下创建一个.gitignore
文件,用来排除不需要提交到Git
仓库的文件。
bashtouch .gitignore
# Git仓库创建和克隆
# 初始化
Git会在你的工作目录上,初始化Git
仓库,会在当前文件夹下创建一个.git
文件夹。
bashgit init
# 克隆
下载一个远程Git
仓库到本地。
bashgit clone <url>
# 基础工作流
# 添加暂存区
将文件添加到暂存区。
bashgit add <file>
如果使用
.
会添加当前目录下的所有文件。
# 从暂存区删除
将文件从暂存区删除。
bashgit rm <file>
如果使用
.
会删除当前目录下的所有文件。
# 查看仓库状态
查看Git
仓库的状态。
bashgit status
# 提交
提交文件到Git
仓库,每个提交都需要包含一个提交信息。
bashgit commit
快捷输入信息,使用-m
参数
bashgit commit -m "message"
# 查看提交
查看Git
仓库的提交。
bashgit log
添加
-p
参数,可以查看提交的详细信息
# 查看提交历史
查看Git
仓库的提交历史。
bashgit reflog
# 撤销提交
关于撤销的操作,有使用reset
和revert
两种。
# 使用reset
主要用于将当前分支的头部移动到指定的状态,也可以用来操作暂存区(staging area)和工作目录的状态。它可以更改提交历史。
用法:
--soft
:仅仅移动 HEAD 指针,不改变暂存区和工作目录。--mixed
(默认):移动 HEAD 指针,并重置暂存区以匹配指定提交,但不改变工作目录。--hard
:移动 HEAD 指针,并重置暂存区和工作目录,以匹配指定提交。这会丢弃自那个提交以来的所有更改。
bashgit reset <commit>
使用场景:你可以更改分支的历史,包括重置暂存区和工作目录到某个特定的状态。这对于本地分支的操作比较有用,尤其是在还没有推送到远程仓库的情况下。
# 使用revert
用于撤销一个或多个先前的提交,它通过创建一个新的提交来实现,这个新提交是对要撤销的提交的逆操作。
bashgit revert <commit>
使用场景:你可以安全地撤销之前的提交,而不影响项目的历史记录。这对于已经推送到远程仓库的更改尤其重要,因为它不会给其他协作者带来麻烦。
# 推送和拉取
# 推送
将文件推送到远程仓库。
bashgit push
# 拉取
将远程仓库的文件或者分支拉取到本地仓库。
bashgit pull
# 分支和合并
# 创建分支
bashgit branch <name>
# 切换分支
bashgit checkout <name>
添加
-b
参数,可以创建并切换分支
# 查看分支
bashgit branch
# 合并分支
将指定分支合并到当前分支,用法:
--ff
(默认):当合并可以快进时,只进行快进合并(默认行为),如果希望可能时保持线性历史,可以使用此选项。--no-ff
:不自动创建合并提交,即使合并可以通过快进完成,Git 也会生成一个合并提交。这对于保持项目历史中的分支结构很有帮助。--no-commit
:执行合并操作但在自动提交前停止,允许你检查和可能继续修改合并结果之前的合并。这个选项不会完成合并,只会更新工作区和索引(暂存区)以反映合并结果。--ff-only
:只在合并可以快进时才合并,否则合并会失败。这对于确保不会创建额外的合并提交很有用,例如,在严格要求线性历史的项目中。--squash
:将所有合并的提交压缩成一个单独的提交。这可以保持目标分支的历史简洁,但是从各个原始提交中带来的更改会保留下来。需要注意的是,这种合并不会记录哪些分支被合并了,因为它不创建一个真正的合并提交。
bashgit merge <name>
添加
-m
参数,可以添加合并信息
# 远程仓库
# 添加远程仓库
bashgit remote add <name> <url>
# 查看远程仓库
bashgit remote -v
# 删除远程仓库
bashgit remote remove <name>
# 推送到远程仓库
将当前分支推送到远程仓库的指定分支
bashgit push <name> <branch>
# 从远程仓库拉取
从远程仓库拉取当前分支,不会自动合并
bashgit fetch <name>
从远程仓库拉取指定分支,并自动合并。
bashgit pull <name> <branch>
# Rebase
git rebase
是 Git 版本控制系统中的一个强大命令,用于修改提交历史。它的主要作用是将一个分支上的更改重新应用到另一个分支的顶部。这通常用于保持一个干净、线性的提交历史,或者在将更改合并到主分支之前整理、修改或更新提交。
# 作用
- 创建线性历史
当你在一个分支上工作时,主分支可能已经进展了。使用 rebase,你可以将你的分支更改放到主分支当前的末端,就像你是在主分支的最新状态上开始工作那样。这使得项目历史看起来像是线性发展的,没有并行发展的分支。
- 清理提交历史
rebase 允许你修改、重排、合并或删除提交。这对于清理你的提交历史、创建更清晰的、更可读的历史非常有用。例如,你可以将多个“修复打字错误”的提交合并为一个提交,以保持历史的整洁。
- 解决分支冲突
通过 rebase,你可以逐个地将提交应用到基底分支的顶部,这使得解决冲突变得更容易和更有条理。相比合并(merge)可能一次性引发多个冲突,rebase 允许你在每次应用单个提交时处理冲突,使得整个过程更加可控。
- 准备拉取请求(Pull Request)
在多人协作的项目中,rebase 可以用来更新特性分支,确保它可以干净地合并到主分支中。在你的拉取请求被合并之前,将你的分支与主分支同步(通过 rebase)意味着你的更改可以直接被快进合并(fast-forward merge),避免不必要的合并提交。
bashgit rebase <branch>