Git Tips
中文教程
- Git 教程 - 廖雪峰的官方网站
- Pro Git 中文版
- Git - Book Git - Book(简体中文)
- Git 教程 | 菜鸟教程
- Git 教程 - w3cschool
- git 使用简易指南
- Git 的核心概念
- Git 远程操作详解 - 阮一峰的网络日志
- Learn Git Branching
基础
基本概念
- workspace: 工作区,就是你在电脑里能看到的目录。
- index/stage: 索引(或者叫作暂存区),英文叫
stage,一般存放在.git目录下的index文件(.git/index)中,所以我们经常将暂存区有时也叫作索引(index)。 - repository: 仓库,工作区有一个隐藏目录
.git,这个不算工作区,而是 Git 的版本库。 - remote: 远程仓库,就是托管在远程服务器上的仓库,比如 GitHub、GitLab、Gitee 等。远程版本可以连接到本地克隆,以使更改保持同步,所有用户通过它来交换修改。
- HEAD: 代表你当前的工作目录。使用
checkout可移动 HEAD 指针到不同的分支、标记 (tags) 或提交。 - clone: 克隆远程仓库,包含所有提交和分支。克隆是指存在于计算机上而非网站服务器其他位置的仓库副本,或者是复制的操作。在克隆时,可在首选编辑器中编辑文件,使用 Git 跟踪更改而无需保持在线。您克隆的仓库仍与远程版本连接,以便当您在线时将本地更改推送到远程,以保持同步。
- origin: 远程仓库的默认名称。默认情况下,克隆时会创建一个名为
origin的远程仓库,指向您克隆的仓库。您可以通过运行git remote add <name> <url>来添加其他远程仓库。例如,您可以将一个名为upstream的远程仓库添加到您的克隆中,以便您可以将本地更改推送到上游仓库。 - add: 添加,就是将文件添加到暂存区。使用
add可将文件添加到暂存区,然后使用commit将文件提交到 git 本地仓库中。 - commit: 提交,就是你的项目可能会有多个提交,每次提交都有一个提交说明,可以记录你在此次提交中做了什么更改,为什么要做这些更改,以及更改是否有问题等等。
- branch: 分支,就是你的项目可能会有多个分支,比如
master、dev、feature_x等等,每个分支都是完整的一个项目,可以进行不同的开发工作。 - master/main: 默认分支的名称。默认情况下,克隆时会创建一个名为
master/main的分支,指向您克隆的仓库。您可以通过运行git branch <name>来添加其他分支。例如,您可以将一个名为dev的分支添加到您的克隆中,以便您可以在dev分支上进行开发,而不会影响master/main分支。 - push: 推送,就是将本地的提交推送到远程仓库。使用
push可将本地提交推送到远程仓库,以便其他人可以查看它们。您可以将本地分支推送到远程仓库中的新分支,或者您可以将本地分支推送到远程仓库中的现有分支,从而更新远程仓库中的分支。如果您没有权限推送到远程仓库中的分支,则会收到拒绝推送的错误。您可能需要首先使用pull将远程仓库中的更新拉取到本地仓库,然后再推送到远程仓库中。 - pull: 拉取,就是将远程仓库的提交拉取到本地仓库。使用
pull可将远程仓库中的更新拉取到本地仓库。您可以将远程仓库中的分支拉取到本地仓库中的新分支,或者您可以将远程仓库中的分支拉取合并到本地仓库中的现有分支。 - fetch:获取,就是将远程仓库的提交拉取到本地仓库。使用
fetch可将远程仓库中的更新拉取到本地仓库。与pull不同,fetch不会将更改合并到您的工作目录中。您必须手动将拉取到的更改合并到您的工作目录中。 - checkout: 检出,就是切换分支。使用
checkout可切换分支。您可以切换到现有分支,或者您可以切换到新分支,从而创建新分支。 - merge: 合并,就是将两个分支合并。使用
merge可将两个分支合并。您可以将一个分支合并到当前分支,或者您可以将一个分支合并到另一个分支中。 - rebase: 变基,就是将一个分支变基到另一个分支。使用
rebase可将一个分支变基到另一个分支。您可以将当前分支变基到另一个分支中,或者您可以将一个分支变基到另一个分支中。 - tag: 标签,就是给一个提交打上标签。使用
tag可给一个提交打上标签。您可以使用标签来标记特定的提交,例如 v1.0、v2.0 等等,每个标签都是一个版本,可以进行不同的开发工作。
常用命令
- git init: 初始化一个 Git 仓库
- git clone: 克隆一个远程仓库
- git add: 添加文件到暂存区
- git commit: 提交暂存区到仓库区
- git status: 查看仓库状态
- git diff: 查看变更内容
- git log: 查看提交日志
- git reset: 回退版本
- git rm: 删除文件
- git mv: 移动或重命名文件
- git branch: 分支操作
- git checkout: 切换分支或恢复工作区文件
- git merge: 合并分支
- git tag: 打标签
- git remote: 远程仓库操作
- git push: 推送到远程仓库
- git pull: 从远程仓库拉取
- git fetch: 从远程仓库获取
- git stash: 暂存当前工作进度
- git stash pop: 恢复暂存的工作进度
- git stash list: 查看暂存的工作进度列表
- git stash drop: 删除暂存的工作进度
- git config: 配置 Git 环境
- git help: 帮助
术语表
- Git: 一个开源的分布式版本控制系统,Git 是一个开源项目,用于以文本文件跟踪更改。它由 Linux 操作系统的作者编写。
- GitHub: 一个托管和协作管理 Git 仓库的平台。
- HEAD: 代表你当前的工作目录。使用 checkout 可移动 HEAD 指针到不同的分支、标记 (tags) 或提交。
- detached HEAD 游离 HEAD:如果您操作的是游离的 HEAD,Git 将会警告您,这意味着 Git 不指向某个分支,并且您的任何提交都不会出现在提交历史记录中。例如,在检出并非任何特定分支最新提交的任意提交时,您操作的是"游离的 HEAD"。
- stash 储藏:工作时需要切换其他分支修改 bug 但当前分支任务还未完成不能 commit(log 上会有大量不必要的记录),这样可以使用
git stash,将工作区内所有未提交的修改(包括暂存的和非暂存的)都保存起来形成新的本地储藏推入到 Git 的栈中,用于后续恢复。 - commit 提交: 一个 Git 对象,是仓库快照的哈希值,包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。提交或"修订"是对一个文件(或一组文件)的个别更改。在进行提交以保存工作时,Git 会创建唯一的 ID(也称为 "SHA" 或"哈希"),用于记录提交的特定更改以及提交者和提交时间。提交通常包含一条提交消息,其中简要说明所做的更改。
- SHA 提交 ID:用于识别提交的 40 字符校验和哈希。
- branch 分支: 一个轻型可移动的 commit 指针,一个包含所指对象校验和(40 个字符长度 SHA-1 字串,外加一个换行符)的文件。分支是仓库的平行版本。它包含在仓库中,但不影响主要或 master 分支,可让您自由工作而不中断"即时"版本。在执行所需的更改后,可以将分支合并回 master 分支以发布更改。
- checkout 检出:在命令行上使用
git checkout创建新分支,将当前的工作分支更改为不同的分支,甚至使用git checkout [branchname] [path to file]从不同的分支切换到不同版本的文件。"检出"操作会使用对象数据库中的树对象或 blob 更新工作树的全部或部分,以及更新索引和 HEAD(如果整个工作树指向新分支)。 - rebase 变基/衍合:要将一系列变更从一个分支重新应用到不同的基础分支,并将分支的 HEAD 重置为结果。
- clone 克隆: 克隆远程仓库,包含所有提交和分支。克隆是指存在于计算机上而非网站服务器其他位置的仓库副本,或者是复制的操作。在克隆时,可在首选编辑器中编辑文件,使用 Git 跟踪更改而无需保持在线。您克隆的仓库仍与远程版本连接,以便当您在线时将本地更改推送到远程,以保持同步。
- remote 远程: 托管于服务器上的仓库或分支版本。远程版本可以连接到本地克隆,以使更改保持同步,所有用户通过它来交换修改。
- origin 源:默认上游仓库。大多数项目至少有一个它们跟踪的上游项目。
- fork 复刻: 其他用户仓库在您的帐户上的个人副本。分叉允许您自由更改项目而不影响原始上游仓库。您也可以在上游仓库中打开拉取请求,并使分叉同步最新的更改,因为两个仓库仍然互相连接。
- issue 议题:议题是提议的与仓库相关的改进、任务或问题。(对于公共仓库)任何人都可创建议题,然后由仓库协作者调解。每个议题都包含自己的讨论线程。您也可以使用标签将议题归类并分配到某人。
- pull request 拉取请求: 一处用于比较和讨论分支上引入的差异,且具有评审、评论、集成测试等功能的地方。
- pull 拉取:拉取是指提取与合并更改。例如,如果有人编辑了您操作的远程文件,您要将这些更改拉取到本地副本,以使其保持最新。
- fetch 获取:在使用
git fetch时,您将从远程仓库添加更改到本地工作分支,而不提交它们。与git pull不同,提取可让您在更改提交到本地分支之前先进行审查。 - diff 差异:差异是指两个提交之间的更改或保存的更改之间的区别,它将从视觉上描述文件自上次提交后添加或删除的内容。
- merge 合并:合并是从一个分支(在相同的仓库中或来自一个分叉)提取更改,然后将其应用到另一个分支。这通常是作为"拉取请求"(可视为请求合并)或通过命令行完成。
- push 推送:推送是指将提交的更改发送到远程仓库。例如,如果您在本地更改内容,便可推送这些更改,让其他人访问。
- ssh-key SSH 密钥:SSH 密钥是一种使用加密消息向在线服务器标识自己的方法。就好像您的计算机使用唯一密码登录其他服务一样。GitHub 使用 SSH 密钥将信息安全地传输到您的计算机。
- license 许可:一种可随附于项目的文档,告知们能够对您的源代码执行哪些操作,不能执行哪些操作。
- gitignore 忽略文件:gitignore 文件是一种告知 Git 忽略特定文件的方法。例如,您可能希望忽略编译的二进制文件,因为它们可以在任何时候重新生成。
config
设置 autocrlf 换行符处理
autocrlf = true表示要求 git 在提交时将 crlf 转换为 lf,而在检出时将 crlf 转换为 lf。autocrlf = false表示提交和检出代码时均不进行转换。autocrlf = input表示在提交时将 crlf 转换为 lf,而检出时不转换。
#Linux
git config --global core.autocrlf input
#Windows
git config --global core.autocrlf true
关闭 safecrlf 检查
关闭 safecrlf 检查,防止在 Windows 上提交时出现 warning: LF will be replaced by CRLF in ... 的警告。
autocrlf = true拒绝提交包含混合换行符的文件。safecrlf = false允许提交包含混合换行符的文件。safecrlf = warn提交包含混合换行符的文件时给出警告。
git config --global core.safecrlf false
Add
忽略文件
note
The problem is that .gitignore ignores just files that weren't tracked before (by git add). Run git reset name_of_file to unstage the file and keep it. In case you want to also remove the given file from the repository (after pushing), use git rm --cached name_of_file.
# ignore staged file(to unstage file)
git reset <file>
# untrack file
git rm --cached <file>
# untrack folder
git rm -r --cached <folder>
push
同时推送 commit 和 tag
# since [git 2.4.x](https://github.com/git/git/commit/d0e8e09cd8828b278a56d4ebfc52d662ff8038d8)
git push --atomic origin <branch name> <tag>
# Since [git 1.8.3 (April 22d, 2013)](https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.3.txt#L155-L156)
git push --follow-tags
fetch
浅克隆转换为正常克隆
How to convert a Git shallow clone to a full clone? - Stack Overflow
git fetch --unshallow
# get access to all the branches on origin
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin