Git:修订间差异
(未显示同一用户的18个中间版本) | |||
第9行: | 第9行: | ||
*2014年05年28日,发布git 2.0 版 | *2014年05年28日,发布git 2.0 版 | ||
*2020年03月23日,发布git 2.26 版 | *2020年03月23日,发布git 2.26 版 | ||
=== 仓库托管服务 === | |||
很多公司提供了Git仓库的托管服务。 | |||
{| class="wikitable" | |||
! 名称 | |||
! 公司 | |||
! 描述 | |||
|- | |||
| [[GitHub]] | |||
| 微软 | |||
| 提供付费账户和免费账户,都可以建立公开或私有的代码仓。。截止2023年,Github是世界上最大的代码托管网站和开源社区。 | |||
|- | |||
| [[CODING]] | |||
| 腾讯 | |||
| 提供付费账户和免费账户 | |||
|- | |||
| [[GitLab]] | |||
| GitLab | |||
| | |||
|- | |||
| Gitee | |||
| OSCHINA | |||
| | |||
|} | |||
=== 安装 === | |||
Linux中一般默认已经按照git, Windows中安装如下; | |||
*1.下载安装程序,https://git-scm.com/download/win | |||
*2.点击安装 | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 《Pro Git》 中文版V2:1.5 起步 - 安装 Git] | |||
}} | |||
== 快速入门 == | |||
=== 基本原理 === | |||
{{#drawio:git工作原理}} | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/起步-Git-是什么? 《Pro Git》 中文版V2:起步-Git-是什么?] | |||
}} | |||
=== 使用示例 === | |||
<syntaxhighlight lang="bash" > | |||
# 设置一次Git的全局用户名和邮箱 | |||
git config --global user.name "Your Name" | |||
git config --global user.email yourname@example.com | |||
# 在一个目录下,初始化git仓库 | |||
# 会在该目录自动生成一个.git目录 | |||
git init | |||
</syntaxhighlight> | |||
=== .git 目录 === | |||
所有git工作目录下都有个<code>.git</code>目录,该目录包含几乎所有git操作和数据内容。当使用<code>git init</code>初始化目录会自动生成该文件夹。 | |||
{| class="wikitable" | |||
! 名称 | |||
! 描述 | |||
|- | |||
| config | |||
| 该项目的特有配置, | |||
|- | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
|} | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/Git-内部原理-底层命令与上层命令 《Pro Git》 中文版V2:10.1 Git 内部原理 - 底层命令与上层命令] | |||
}} | |||
==配置== | |||
{| class="wikitable" | |||
|- | |||
! 命令 | |||
! 描述 | |||
|- | |||
|查看配置 | |||
|<code>git config --list</code>查看所有配置信息<br /><code>git config user.name</code> 查看某一项配置 <br /> <code>git config --list --show-origin</code> 查看所有的配置以及它们所在的文件 <br /> | |||
|- | |||
|设置用户信息 | |||
|配置全局用户名称和邮箱,<syntaxhighlight lang="bash" > | |||
git config --global user.name "Your Name" | |||
git config --global user.email yourname@example.com | |||
</syntaxhighlight> | |||
如果某个项目想要使用不同的用户名称与邮件地址时,在项目目录,使用不带<code>--global</code>设置用户信息。 | |||
|} | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-设置与配置《Pro Git》 中文版V2:附录 C: Git 命令 - 设置与配置] | |||
}} | |||
==创建仓库== | |||
{| class="wikitable" | |||
|- | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| git init | |||
| 初始化一个Git仓库 | |||
| <code>git init myproject</code> | |||
|- | |||
| git clone | |||
| 克隆一个Git仓库到本地 | |||
| <nowiki>git clone https://github.com/git/git.git</nowiki> | |||
|- | |||
|} | |||
==快照== | |||
{| class="wikitable" | |||
|- | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| git add | |||
| 添加文件到暂存区 | |||
| <code>git add README.md</code> </br> <code>git add .</code> | |||
|- | |||
| git commit | |||
| 提交更新到本地仓库 | |||
| <code>git commit -m "Update README"</code> | |||
|- | |||
| git status | |||
| 查看文件状态 | |||
| git status | |||
|- | |||
| git diff | |||
| 比较工作区和暂存区差异 | |||
| git diff | |||
|- | |||
| [https://git-scm.com/docs/git-reset/zh_HANS-CN git reset] | |||
| 重置当前HEAD到指定状态。可以使用<code>git log --oneline</code>或<code>git reflog</code>查看要回滚的版本。 <br /><br />参数:<br /><code>--soft</code>:本地仓库回滚,但是暂存区和工作区保持不变。<br /><code>--mixed</code>:本地仓和暂存区回滚,默认参数,等同于git reset。<br /><code>--hard</code>:本地仓、暂存区和工作区都回滚。注意,如果工作区有没有提交的代码就找不回。 | |||
|<code>git reset --soft HEAD~1</code> <br /><code>git reset HEAD~1</code><br /><code>git reset --hard HEAD~1</code> <br /><code>git reset --hard cba9527</code> | |||
|- | |||
| git rm | |||
| 从暂存区和工作区删除文件 | |||
| git rm README.md | |||
|- | |||
| git mv | |||
| 移动或重命名文件、目录 | |||
| git mv file.txt file2.txt | |||
|- | |||
| [https://git-scm.com/docs/git-clean/zh_HANS-CN git clean] | |||
| 删除工作区未跟踪文件。 <br /><br />常用参数:<br /><code>-d</code> <br /><code>-f</code>直接删除。<br /><code>-i</code>交互模式,显示会做什么,并以交互方式清理文件。 | |||
| <code>git clean -i</code><br /><code>git clean -di</code><br /><code>git clean -df</code> | |||
|} | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-快照基础《Pro Git》 中文版V2:附录 C: Git 命令 - 快照基础] | |||
}} | |||
==分支管理== | |||
{| class="wikitable" | |||
|- | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
| git branch | |||
| 列出/创建/删除分支 | |||
|<code>git branch</code>列出所有分支 </br> <code>git branch -v</code> </br><code>git branch dev</code>创建名称为dev分支 | |||
|- | |||
| git checkout | |||
| 切换分支,或者检出内容到工作目录。 | |||
| <code>git checkout dev</code>切换到dev分支 <br /><code>git checkout -b main</code> 创建一个新的 main 分支并立即切换到该分支。 <syntaxhighlight lang="bash" > | |||
git checkout -b main | |||
git push origin main | |||
git branch -d master | |||
</syntaxhighlight> 将master分支重命名为main分支。1.创建 main 分支。2.main 分支推送到远程存储库,并覆盖旧的 master 分支。3.删除旧的 master 分支 | |||
|- | |||
| git log | |||
| 查看提交历史记录 | |||
|<code>git log</code> </br><code>git log --oneline</code> | |||
|- | |||
| git tag | |||
| 打标签,创建、列出、删除标签。 | |||
| <code>git tag</code>列出标签 </br><code>git tag -l "v2.3.5*"</code>列出v2.3.5开头标签 | |||
|- | |||
| git merge | |||
| 合并一个或者多个分支 | |||
| | |||
|- | |||
| git mergetool | |||
| 解决合并冲突 | |||
| | |||
|- | |||
| git stash | |||
| 暂存当前工作目录状态 | |||
| | |||
|} | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/附录-C:-Git-命令-分支与合并《Pro Git》 中文版V2:附录 C: Git 命令 - 分支与合并] | |||
}} | |||
==远程== | |||
{| class="wikitable" | |||
|- | |||
! 命令 | |||
! 描述 | |||
! 示例 | |||
|- | |||
|git clone | |||
|克隆远程仓库 | |||
| | |||
|- | |||
|git remote -v | |||
|查看远程仓库列表。用于查看当前仓库已经配置的远程仓库列表,以及它们的URL。 | |||
|<code>git remote -v</code> | |||
|- | |||
|git remote show <远程仓库名> | |||
|查看特定远程仓库的详细信息。默认情况下,有一个 origin 的远程仓库名,它是 Git 的默认远程仓库名称。多个远程仓库时,可以使用不同的名称来管理。 | |||
| <code>git remote show origin</code> 显示origin远程仓库的信息,包括远程仓库地址,分支等信息。 | |||
|- | |||
| git remote add <远程仓库名> <URL> | |||
| | |||
| | |||
|- | |||
| git fetch <远程仓库名> | |||
| 获取远程代码 | |||
| | |||
|- | |||
|git pull <远程仓库名> <分支名> | |||
| 拉取远程代码及立即合并,相当于git fetch后执行git mergin。 | |||
| <code>git pull origin main</code> 从远程的"origin"仓库的"main"分支中拉取最新的更改并将其合并到你的本地分支中。 | |||
|- | |||
| git push <远程仓库名> <本地分支名>:<远程分支名> | |||
|推送本地更改 | |||
| <code>git push origin main</code> 将本地当前分支推送到远程origin仓库的main分支。 <br /> <code>git push origin --delete test</code>删除远程名称为test的分支,注意先备份数据。 | |||
|- | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| | |||
| | |||
|} | |||
==Hooks 钩子== | |||
Git 钩子(Hooks )用于在特定的重要动作发生时触发自定义脚本。分为客户端的和服务器端的。 | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90 中文版V2:8.3 自定义 Git - Git 钩子 ] | |||
}} | |||
===快速入门=== | |||
钩子默认位于Git目录下<code>.git/hooks</code>目录中,文件名为钩子名称(没有扩展名),如<code>pre-commit</code>,该文件将在commit前运行。初始化git项目时,hooks目录下有很多示例脚本,都是以<code>.sample</code>结尾,如果要启用去掉这个后缀。 | |||
以下示例使用<code>post-commit</code>钩子在每次提交时将最新的 commit ID 写入一个 version.txt 文件。 | |||
*创建钩子:<code>touch .git/hooks/post-commit</code>。 | |||
*编辑钩子: | |||
<syntaxhighlight lang="bash" > | |||
#!/bin/sh | |||
# 获取最新的短 commit ID | |||
COMMIT_ID=$(git rev-parse --short HEAD) | |||
# 将 commit ID 写入临时文件 | |||
echo $COMMIT_ID > version.txt.tmp | |||
# 如果 version.txt 不存在或内容不同于临时文件,才更新 version.txt | |||
if [ ! -f version.txt ] || ! cmp -s version.txt.tmp version.txt; then | |||
mv version.txt.tmp version.txt | |||
git add version.txt | |||
git commit --amend --no-edit --allow-empty | |||
else | |||
rm version.txt.tmp | |||
fi | |||
</syntaxhighlight> | |||
* 使 post-commit 钩子可执行:<code>chmod +x .git/hooks/post-commit</code> | |||
{{了解更多 | |||
|[https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90 中文版V2:8.3 自定义 Git - Git 钩子 ] | |||
}} | |||
==设置== | |||
=== Linux终端显示当前Git分支 === | |||
进入用户的Home目录,编辑.bashrc文件 | |||
<syntaxhighlight lang="bash"> | |||
cd ~ | |||
vim .bashrc | |||
</syntaxhighlight> | |||
将下面代码加入.bashrc文件末尾,并保存: | |||
<syntaxhighlight lang="bash"> | |||
function git_branch { | |||
branch="`git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //"`" | |||
if [ "${branch}" != "" ];then | |||
if [ "${branch}" = "(no branch)" ];then | |||
branch="(`git rev-parse --short HEAD`...)" | |||
fi | |||
echo " ($branch)" | |||
fi | |||
} | |||
export PS1='\u@\h \[\033[01;36m\]\W\[\033[01;32m\]$(git_branch)\[\033[00m\] \$ ' | |||
</syntaxhighlight> | |||
保存并退出,执行加载命令 | |||
<syntaxhighlight lang="bash"> | |||
source ./.bashrc | |||
</syntaxhighlight> | |||
==资源== | ==资源== | ||
===官网=== | ===官网=== | ||
* | *Git 官网:https://git-scm.com/ | ||
* | *Git 文档:https://git-scm.com/doc | ||
* Git 文档 参考 https://git-scm.com/docs | |||
* | *Git 文档:书籍《Pro Git》中文版 :https://git-scm.com/book/zh/v2 | ||
== | ===文章=== | ||
*[https://zh.wikipedia.org/wiki/Git 维基百科:git] | *[https://zh.wikipedia.org/wiki/Git 维基百科:git] | ||
[[分类:编程工具]] | [[分类:编程工具]] |
2024年5月20日 (一) 07:20的最新版本
git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。
简介
时间轴
- 2002年,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。
- 2005年,Andrew Tridgell违反的BitKeeper使用原则,进行逆向工程,导致无偿使用BitKeeper的许可被收回。 林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间编写出git第一个版本。
- 2005年07月11日,发布git 0.99 版
- 2005年12月21日,发布git 1.0 版
- 2014年05年28日,发布git 2.0 版
- 2020年03月23日,发布git 2.26 版
仓库托管服务
很多公司提供了Git仓库的托管服务。
名称 | 公司 | 描述 |
---|---|---|
GitHub | 微软 | 提供付费账户和免费账户,都可以建立公开或私有的代码仓。。截止2023年,Github是世界上最大的代码托管网站和开源社区。 |
CODING | 腾讯 | 提供付费账户和免费账户 |
GitLab | GitLab | |
Gitee | OSCHINA |
安装
Linux中一般默认已经按照git, Windows中安装如下;
- 1.下载安装程序,https://git-scm.com/download/win
- 2.点击安装
了解更多 >> 《Pro Git》 中文版V2:1.5 起步 - 安装 Git
快速入门
基本原理
了解更多 >> 《Pro Git》 中文版V2:起步-Git-是什么?
使用示例
# 设置一次Git的全局用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email yourname@example.com
# 在一个目录下,初始化git仓库
# 会在该目录自动生成一个.git目录
git init
.git 目录
所有git工作目录下都有个.git
目录,该目录包含几乎所有git操作和数据内容。当使用git init
初始化目录会自动生成该文件夹。
名称 | 描述 |
---|---|
config | 该项目的特有配置, |
配置
命令 | 描述 |
---|---|
查看配置 | git config --list 查看所有配置信息git config user.name 查看某一项配置 git config --list --show-origin 查看所有的配置以及它们所在的文件 |
设置用户信息 | 配置全局用户名称和邮箱,git config --global user.name "Your Name"
git config --global user.email yourname@example.com
如果某个项目想要使用不同的用户名称与邮件地址时,在项目目录,使用不带 |
了解更多 >> Git》 中文版V2:附录 C: Git 命令 - 设置与配置
创建仓库
命令 | 描述 | 示例 |
---|---|---|
git init | 初始化一个Git仓库 | git init myproject
|
git clone | 克隆一个Git仓库到本地 | git clone https://github.com/git/git.git |
快照
命令 | 描述 | 示例 |
---|---|---|
git add | 添加文件到暂存区 | git add README.md git add .
|
git commit | 提交更新到本地仓库 | git commit -m "Update README"
|
git status | 查看文件状态 | git status |
git diff | 比较工作区和暂存区差异 | git diff |
git reset | 重置当前HEAD到指定状态。可以使用git log --oneline 或git reflog 查看要回滚的版本。 参数: --soft :本地仓库回滚,但是暂存区和工作区保持不变。--mixed :本地仓和暂存区回滚,默认参数,等同于git reset。--hard :本地仓、暂存区和工作区都回滚。注意,如果工作区有没有提交的代码就找不回。
|
git reset --soft HEAD~1 git reset HEAD~1 git reset --hard HEAD~1 git reset --hard cba9527
|
git rm | 从暂存区和工作区删除文件 | git rm README.md |
git mv | 移动或重命名文件、目录 | git mv file.txt file2.txt |
git clean | 删除工作区未跟踪文件。 常用参数: -d -f 直接删除。-i 交互模式,显示会做什么,并以交互方式清理文件。
|
git clean -i git clean -di git clean -df
|
了解更多 >> Git》 中文版V2:附录 C: Git 命令 - 快照基础
分支管理
命令 | 描述 | 示例 |
---|---|---|
git branch | 列出/创建/删除分支 | git branch 列出所有分支 git branch -v git branch dev 创建名称为dev分支
|
git checkout | 切换分支,或者检出内容到工作目录。 | git checkout dev 切换到dev分支 git checkout -b main 创建一个新的 main 分支并立即切换到该分支。 git checkout -b main
git push origin main
git branch -d master
|
git log | 查看提交历史记录 | git log git log --oneline
|
git tag | 打标签,创建、列出、删除标签。 | git tag 列出标签 git tag -l "v2.3.5*" 列出v2.3.5开头标签
|
git merge | 合并一个或者多个分支 | |
git mergetool | 解决合并冲突 | |
git stash | 暂存当前工作目录状态 |
了解更多 >> Git》 中文版V2:附录 C: Git 命令 - 分支与合并
远程
命令 | 描述 | 示例 |
---|---|---|
git clone | 克隆远程仓库 | |
git remote -v | 查看远程仓库列表。用于查看当前仓库已经配置的远程仓库列表,以及它们的URL。 | git remote -v
|
git remote show <远程仓库名> | 查看特定远程仓库的详细信息。默认情况下,有一个 origin 的远程仓库名,它是 Git 的默认远程仓库名称。多个远程仓库时,可以使用不同的名称来管理。 | git remote show origin 显示origin远程仓库的信息,包括远程仓库地址,分支等信息。
|
git remote add <远程仓库名> <URL> | ||
git fetch <远程仓库名> | 获取远程代码 | |
git pull <远程仓库名> <分支名> | 拉取远程代码及立即合并,相当于git fetch后执行git mergin。 | git pull origin main 从远程的"origin"仓库的"main"分支中拉取最新的更改并将其合并到你的本地分支中。
|
git push <远程仓库名> <本地分支名>:<远程分支名> | 推送本地更改 | git push origin main 将本地当前分支推送到远程origin仓库的main分支。 git push origin --delete test 删除远程名称为test的分支,注意先备份数据。
|
Hooks 钩子
Git 钩子(Hooks )用于在特定的重要动作发生时触发自定义脚本。分为客户端的和服务器端的。
了解更多 >> 中文版V2:8.3 自定义 Git - Git 钩子
快速入门
钩子默认位于Git目录下.git/hooks
目录中,文件名为钩子名称(没有扩展名),如pre-commit
,该文件将在commit前运行。初始化git项目时,hooks目录下有很多示例脚本,都是以.sample
结尾,如果要启用去掉这个后缀。
以下示例使用post-commit
钩子在每次提交时将最新的 commit ID 写入一个 version.txt 文件。
- 创建钩子:
touch .git/hooks/post-commit
。 - 编辑钩子:
#!/bin/sh
# 获取最新的短 commit ID
COMMIT_ID=$(git rev-parse --short HEAD)
# 将 commit ID 写入临时文件
echo $COMMIT_ID > version.txt.tmp
# 如果 version.txt 不存在或内容不同于临时文件,才更新 version.txt
if [ ! -f version.txt ] || ! cmp -s version.txt.tmp version.txt; then
mv version.txt.tmp version.txt
git add version.txt
git commit --amend --no-edit --allow-empty
else
rm version.txt.tmp
fi
- 使 post-commit 钩子可执行:
chmod +x .git/hooks/post-commit
了解更多 >> 中文版V2:8.3 自定义 Git - Git 钩子
设置
Linux终端显示当前Git分支
进入用户的Home目录,编辑.bashrc文件
cd ~
vim .bashrc
将下面代码加入.bashrc文件末尾,并保存:
function git_branch {
branch="`git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //"`"
if [ "${branch}" != "" ];then
if [ "${branch}" = "(no branch)" ];then
branch="(`git rev-parse --short HEAD`...)"
fi
echo " ($branch)"
fi
}
export PS1='\u@\h \[\033[01;36m\]\W\[\033[01;32m\]$(git_branch)\[\033[00m\] \$ '
保存并退出,执行加载命令
source ./.bashrc
资源
官网
- Git 官网:https://git-scm.com/
- Git 文档:https://git-scm.com/doc
- Git 文档 参考 https://git-scm.com/docs
- Git 文档:书籍《Pro Git》中文版 :https://git-scm.com/book/zh/v2