Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
该篇将讲解以下几点:
Git的安装
Git的配置
Git的工作流程
Git 的安装 在使用 Git 前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。Git 各平台安装包下载地址为:http://git-scm.com/downloads
Linux 平台上安装 Git
各大 Linux 平台可以使用包管理器(apt-get、yum 等)进行安装。
在Debian系上安装Git
1 apt update && apt install -y git
在红帽系(如CentOS/RedHat)上安装Git
注:由于笔者不常用FreeBSD、OpenBSD、Alpine等其他发行版的Linux系统,所以在Git的安装上就不提及这些系统了
MacOS 安装 Git MacOS安装Git有很多种方法,像用安装包安装、Brew包管理器、MacPorts包管理器、Xcode安装
安装包安装(最简单) 可以到SourceForge 上下载最新的软件安装包,根据指引进行安装即可使用Git
注:该方法目前仅适合Intel芯片的MacOS,SourceForge上没找到支持M芯片的安装包
通过包管理器(如HomeBrew、MacPorts)
用HomeBrew安装Git 在安装好包管理器后,我们在终端中输入brew install git等待进度条跑完即可使用Git
用MacPorts安装Git 通过以下命令进行安装
1 2 3 4 5 6 sudo port selfupdate # 搜索最新可用的 Git 端口和变体: port search git port variants git # 安装带有 bash 完成功能的 Git、OS X 钥匙链助手和文档: sudo port install git +bash_completion +credential_osxkeychain +doc
安装 git-credential-osxkeychain 助手(作为补充,因为按照上面的MacPorts或HomeBrew进行操作,则助手应该已经安装好了)
Bitbucket 支持通过 SSH 和 HTTPS 推送和提取您的 Git 存储库。要通过 HTTPS 使用私有存储库,每次推送或拉取时都必须提供用户名和密码。git-credential-osxkeychain 助手允许您在 OSX 钥匙链中缓存用户名和密码,这样您就不必每次都重新键入了。
1 2 3 4 5 6 7 8 git credential-osxkeychain # 可通过该命令查看是否安装好助手 # 使用 curl 下载 git-credential-osxkeychain(或者通过浏览器下载),然后将其移至 /usr/local/bin curl -O http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain sudo mv git-credential-osxkeychain /usr/local/bin/ # 将文件设为可执行文件: chmod u+x /usr/local/bin/git-credential-osxkeychain # 将 git 配置为使用 osxkeychain 凭证助手。 git config --global credential.helper osxkeychain
Xcode安装 当你在App Store安装完Xcode后,进入终端输入git --version此时如果MacOS中没有git,会通过xcode安装git并显示版本
如果想要给旧系统像MacOS 12安装Xcode,但已经无法从app store上下载,可以去到macOS 版本对应的 Xcode 版本,以及 Xcode 历史版本下载 上下载dmg安装包进行安装
Windows 安装 Git Windows安装Git可以到官网上下载软件安装包,根据指引下一步即可,在此不做过多赘述。
Git 的配置 1 2 3 4 5 6 7 Git 提供了一个叫做 git config 的命令,用来配置或读取相应的工作环境变量,这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。 这些变量可以存放在以下三个不同的地方: - /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。 - ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。 - 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。在 Windows 系统上,Git 会找寻用户主目录下的 .gitconfig 文件。主目录即 $HOME 变量指定的目录,一般都是 C:\Documents and Settings\$USER。 此外,Git 还会尝试找寻 /etc/gitconfig 文件,只不过看当初 Git 装在什么目录,就以此作为根目录来定位。
一般来说,我们使用Git只需要配置一个name和一个email,再进阶一点的话就是配置credential进行登录凭证的一个存储。但如果我们需要生成patch文件并通过邮箱进行发送,那我们还需要配置smtp等相关信息。以下是相关的配置命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # 配置用户名和邮箱 git config --global user.name *** git config --global user.email ****@**.*** # 配置凭证存储 git config --global credential.helper cache # 缓存密码,默认15分钟 git config --global credential.helper 'cache --timeout=3600' # 可以自定义缓存时间(例如设置1小时,单位:秒) git config --global credential.helper store # 永久保存凭据(密码会明文存储在用户目录的.git-credentials文件中) # 首次操作时输入一次用户名和密码后,后续就会自动使用保存的凭据。 # 配置smtp等相关信息 git config --global sendemail.smtpencryption tls # 加密方式,可选 tls 或 ssl git config --global sendemail.smtpserver smtp.example.com # SMTP 服务器地址,在邮件服务商的文档中可以找到 git config --global sendemail.smtpuser your@email.com # 登录邮箱账号 git config --global sendemail.smtppass "your-application-specific-password" # 登录密码(建议使用应用专用密码) # 查看当前配置 git config --list # 查看所有Git配置 git config user.name # 查看用户名配置 git config user.email # 查看邮箱配置 # 如果需要清除已保存的密码,可以使用: git credential-cache exit # 清除缓存的凭据 rm ~/.git-credentials # 删除store方式保存的凭据(需要手动编辑文件)
Git 的工作流程 在这里举一个最简单的工作流程
flowchart LR
A["在代码托管平台<br/>创建仓库"] --> B["git clone<br/>克隆仓库到本地"]
B --> C[编辑文件]
C --> D["git add<br/>添加到暂存区"]
D --> E["git commit<br/>编写提交信息"]
E --> F["git push<br/>推送到远程仓库"]
在此借用菜鸟编程 关于git-workflow的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 1. 工作区 (Working Directory) —— 你的书桌 这是你实际修改文件的地方。你在这里写代码、删删改改。 2. 暂存区 (Staging Area) —— 你的待邮寄篮子当你觉得作业写得差不多了,你会把它放进一个篮子里,准备打包。 关键指令:git add 意义:告诉 Git,这些改动我确认要提交了,先帮我记着。 3. 本地仓库 (Local Repository) —— 你的个人保险箱你把篮子里的东西打包好,贴上标签(提交信息),锁进自己的保险箱。 关键指令:git commit 意义:改动正式成为了项目历史的一部分。即便你之后改乱了,也可以随时从这里找回。 4. 远程仓库 (Remote) —— 老师的收件箱(如 GitHub/GitLab)最后,你把保险箱里的代码通过网络发送给远程服务器,方便其他人查看或合作。 关键指令:git push 意义:备份代码,并与团队共享进度。 知识点说明 git stash (贮藏区):作业写了一半,突然要改另一个急活,但又不想把没写完的作业提交。这时可以先用 stash 把代码藏进抽屉,等忙完再拿出来继续写(pop)。 git pull (拉取):看看老师(远程仓库)那里有没有别人交的新作业,直接同步到你的书桌上。 git fetch & merge:先看看远程有什么更新(fetch),确认没问题后再合并(merge)到自己的代码里
相关命令及说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 # ===== git clone :克隆远程仓库到本地 ===== git clone <url> # 克隆仓库到当前目录(目录名与仓库名相同) git clone <url> <dir> # 克隆仓库并指定本地目录名 git clone -b <branch> <url> # 克隆指定分支 git clone --depth 1 <url> # 浅克隆,只拉取最近一次提交(节省空间) # ===== git checkout:切换分支或恢复文件 ===== git checkout <branch> # 切换到已有分支 git checkout -b <new-branch> # 创建并切换到新分支 git checkout -b <new-branch> <remote>/<branch> # 基于远程分支创建并切换 git checkout -- <file> # 撤销工作区某个文件的修改(恢复到上次提交状态) git checkout . # 撤销工作区所有文件的修改 # ===== git branch:管理分支 ===== git branch # 查看本地所有分支(* 标记当前分支) git branch -a # 查看本地和远程所有分支 git branch <new-branch> # 创建新分支(不切换) git branch -d <branch> # 删除已合并的分支 git branch -D <branch> # 强制删除分支(未合并也会删除) git branch -m <old> <new> # 重命名分支 git branch --set-upstream-to=<remote>/<branch> # 设置当前分支跟踪的远程分支 # ===== git add:将修改添加到暂存区 ===== git add <file> # 添加指定文件到暂存区 git add . # 添加当前目录下所有改动(新增、修改)到暂存区 git add -A # 添加所有改动(包括删除操作)到暂存区 git add -p # 交互式选择要暂存的代码块 # ===== git commit:将暂存区内容提交到本地仓库 ===== git commit -m "<message>" # 提交并附上描述信息 git commit -am "<message>" # 自动暂存已跟踪文件的修改并提交(跳过 git add) git commit --amend # 修改最近一次提交(可修改提交信息或追加文件) git commit --amend --no-edit # 追加暂存区内容到上次提交,保持提交信息不变 # ===== git pull:拉取远程更新并合并到当前分支 ===== git pull # 拉取并合并当前分支对应的远程分支 git pull <remote> <branch> # 拉取指定远程仓库的指定分支并合并 git pull --rebase # 拉取后用 rebase 方式整合,保持提交历史更整洁 # ===== git push:将本地提交推送到远程仓库 ===== git push # 推送当前分支到其跟踪的远程分支 git push <remote> <branch> # 推送到指定远程仓库的指定分支 git push -u <remote> <branch> # 推送并设置该分支的默认上游(之后直接 git push 即可) git push --force # 强制推送(慎用!会覆盖远程历史) git push <remote> --delete <branch> # 删除远程分支 # ===== git merge:合并分支 ===== git merge <branch> # 将指定分支合并到当前分支 git merge --no-ff <branch> # 禁止快进合并,保留分支合并节点(推荐) git merge --squash <branch> # 将目标分支的所有提交压缩成一个后合并 git merge --abort # 合并冲突时,放弃合并并恢复到合并前状态
引用 该篇引用了以下网站及文章:git-scm.com 博客园-lotus 菜鸟编程 Atlassian