Skip to main content

Git Tips

中文教程

基础

基本概念

  • 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: 分支,就是你的项目可能会有多个分支,比如 masterdevfeature_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

How to ignore certain files in Git - Stack Overflow

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

Push git commits & tags simultaneously - Stack Overflow

# 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

参考