Git

Git&Github cookbook

Git&GitHub所有知识点

Posted by Kylin on February 12, 2023

Git&Github cookbook

概念

  • 查看git版本
git version
  • 配置ssh
ssh-keygen -t ed25519 -C "你的邮箱地址"

在系统中创建 SSH 公私钥之后,并将公钥放到 GitHub 指定位置。如此操作即可生成 GitHub 账户对于当前系统中的 Git 授权。

ssh授权优点:

  • 免密码推送,执行 git push 时不再需要输入用户名和密码了;
  • 提高数据传输速度。
  • 查看本地仓库所关联的远程仓库信息
git remote -v

当我们在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 main(20年之前是master)。注意主机名origin指代的是仓库地址,即该仓库在github上的地址

  • 使用ssh克隆项目到本地
git clone + [仓库地址]     // 注意地址选ssh的

当我们在 GitHub 上创建一个仓库时,同时生成了仓库的默认主机名 origin,并创建了默认分支 main(20年之前是master)。

注意主机名origin指代的是仓库地址,即该仓库在github上的地址。克隆远程仓库到本地时的默认设置 :创建 main 分支并自动跟踪远程同名分支。

  • issue\tags都不跟随fork,只在当前repo里面存在

基础操作

  • git config 类指令(本地配置)
// 查看配置信息
git config -l 

// 修改配置(不推荐),global代表了再任何仓库里都默认设置这个username
// username、email是标识提交名称的,表明了在远程仓库是谁提交的
git config --global user.name "Mona Lisa"

// 修改配置(推荐)
vim ~/.gitconfig
//在文件中添加
[user]
        name = KylinC
        email = k1017856853@icloud.com
// 设置命令别名
git config --global alias.[别名] [原命令]

uid310176-20190514-1557819719173

  • Git本地库有三大区域:工作区、暂存区、版本区。一个重要概念:被提交到版本库的文件处于“被跟踪(tracked)”的状态

document-uid310176labid9805timestamp1548755776759

  • git add 类指令
// 提交到stage
git add [文件名]
// 提交全部文件到stage
git add .
  • git diff 类指令
// 查看仓库状态:目前分支位置(相对上一次pull&push的commit数量)、追踪文件修改列表、未追踪文件列表
git status

//查看当前所处分支、远程分支、当前提交状态、远程状态
git branch -avv

// 查看工作区(working)和版本库(commit)的区别,前提是文件已经tracked!
git diff

// 查看工作区(working)和暂存区(stage)的区别,前提是文件已经tracked!
git diff --cached
  • git log 类指令(查看commit历史记录)
// 查看提交历史(时间倒序,最后commit在前)
git log

// 查看提交历史(时间正序,最早commit在前)
git log --reverse

// 救命命令,这是存在于本地分支的log完整库,只要不删本地,一定可以回退(随你咋搞)
git reflog

// 查看某分支的提交历史,不写分支名查看当前所在分支
git log [分支名] 

// 一行显示提交历史
git log --oneline 

// 其中 n 是数字,查看最近 n 个提交
git log -n 

// 查看指定贡献者的提交记录
git log --author [贡献者名字] 

// 图示法显示提交历史
git log --graph 

document-uid310176labid9805timestamp1548755946170

git log会输出紫色框中的版本号,这是根据当前commit文件、作者、时间使用SHA-1算法生成的唯一hash标识。在进行版本号相关操作时,只需要前4位就可以直接操作。

  • git commit 类指令
// 使用vim写commit备注
git commit

// 将备注写为参数
git commit -m "messsge is here"

// 将未添加到暂存区的修改,也就是工作区的修改也一并提交,但会略过未被跟踪的文件
git commit -am xxxxx

在github上看到的时间是commit时间,而不是push时间

  • git reset 类指令
// 删除暂存区文件(从暂存区撤回到工作区)
git reset -- [文件名]
git restore [文件名]
git rm --cached [文件名]
// 删除暂存区全部文件(从暂存区撤回到工作区)
git reset -- 

// 撤销最近的一次提交(从版本库撤回到暂存区)
git reset --soft HEAD^
// 撤销最近的二次提交(从版本库撤回到暂存区)
git reset --soft HEAD^^
// 撤销最近的n次提交(从版本库撤回到暂存区)
git reset --soft HEAD~n

// 硬回退(相比软回退,直接删除当前分支,转到之前某一分支)
git reset --hard [版本号]
// 根据git reflog中的标签回退,慎用hard
git reset --hard HEAD@{2} 
  • git push
// 推送到远程主机同名分支
git push
// 推送到[主机地址] [分支]
git push [主机地址] [分支]
// 强制推送,比如和主分支出现分叉的时候
git push -f
git push --force

// 新分支push
git push [主机名] [本地分支名]:[远程分支名]

// 新分支push,默认远程分支与本地分支一致
git push [主机名] [分支名]

// 新分支push,默认远程分支与本地分支一致,并且直接关联新分支
git push -u [主机名] [分支名]

分支管理 (git最好的功能)

  • git pull 类指令
// 将远程仓库的分支信息拉取到本地仓库
// 注意,仅仅是更新了本地的远程分支信息,也就是执行 git branch -avv 命令时,查看到的 remotes 开头的行的分支信息。
git fetch

// 使本地 master 分支基于远程仓库(remote)的 master 分支
git rebase origin/main

// 拉取远程分支到本地,已经 merge,并且更新了remote
git pull

git pull = git fetch + git rebase origin/main

git fetchgit pull 是两个常用的 Git 命令,它们的主要区别在于它们对远程仓库的更新方式不同。

git fetch 用于从远程仓库抓取最新版本,但是不会自动合并到当前分支。它只会更新本地仓库的指针(例如:HEAD)和分支指针(例如:origin/master),以反映最新版本。这样可以让你检查远程仓库的变化,并决定是否要合并到本地分支。

相反,git pull 在远程仓库的更新上更加简单方便。它结合了 git fetchgit merge 的操作,用于从远程仓库抓取最新版本并自动合并到当前分支。

总的来说,如果你想保持对远程仓库的变化有更好的控制,并在合并前检查代码,使用 git fetch 更为适合。如果你希望一步到位,快速获取最新版本,那么 git pull 更加方便。

  • git branch 类指令
// 创建新的分支,在哪个分支上创建,提交记录(版本号)就和哪个分支一致
git branch [分支名] 

// 切换分支
git checkout [分支名] 

// 创建并切换分支
git checkout -b [分支名]

// 关联远程分支,之后就可以直接git push了
// 如果是设置当前所在分支跟踪远程分支,最后一个参数本地分支名可以省略不写
git branch -u [主机名/远程分支名] [本地分支名] 
git branch --set-upstream [主机名/远程分支名] [本地分支名] 

// 取消关联本地[分支名]的远程分支,可以省略表示当前分支
git branch --unset-upstream [分支名] 

需要注意的点:新建分支并无跟踪任何远程分支,即没有remote

  • 远程分支删除操作(可以在任意一个本地分支操作)
// 删除分支
git push [主机名] :[远程分支名]
git push [主机名] --delete [远程分支名]

// 删除多个分支
git push [主机名] :[远程分支名] :[远程分支名] :[远程分支名] 

其原理是推送空分支到远端

  • 本地分支的操作
// 删除一个/多个本地分支,当前分支不能被删除
git branch -D [分支名]
git branch -D [分支名] [分支名]

// 分支改名,原分支在当前分支可以省略不写
git branch -m [原分支名] [新分支名]
  • gitignore下载地址

https://github.com/github/gitignore

  • 关闭issue

commit中出现以下字样就会关闭issue

fixes #xxx
fixed #xxx
closes #xxx
close #xxx
closed #xxx
  • pull request 方法

在github页面内操作,提 PR 既可以在仓库内,也可以跨用户跨仓库。

Create a merge commit :这种方式会在组长仓库的 master 分支上生成一个新的提交,且保留 PR 中的所有提交信息。这是一种常规操作,用得最多。

Squash and merge :压缩合并,它会把 PR 中的全部提交压缩成一个。此方法的优点就是让提交列表特别整洁。一个 PR 里有很多提交,每个提交都是很细小的改动,保留这些提交没什么意义,这种情况就使用此方法合并 PR。

Rebase and merge :这种方法不会生成新的提交,例如 PR 中有 6 个提交,用此方法合并后,组长仓库也会新增 6 个提交。注意,这些提交的版本号与组员的提交不同,此外完全一样。

注意:从 A 向 B 提 PR 后,在 PR 合并或关闭前,A 上所有新增的提交都会出现在 PR 里。

  • git remote 类命令
// 添加远程主机,可以是别人仓库的地址,可以同时存在多个远程主机(但是主机名不能重复)
// 注意,主仓库的地址使用 https 开头的,不能说ssh地址
git remote add [主机名] [主仓库的地址]

多人协作开发时,主仓库的主机名通常定义为 up 或 upstream

  • 同步主仓库

例:远程主机为up,分支为master

// 直接pull
git pull --rebase up master 

// 先fetch,再pull
git fetch up
git rebase up/master
git pull --rebase = git fetch + git rebase
  • git tag
// 在本地创建标签(版本号)
// “-m [备注信息]” 可以不写
// 如果是给当前分支最新的提交创建标签,[提交版本号] 可以省略
// 标签文件储存在 .git/refs/tags 下
git tag [标签名] -m [备注信息] [提交版本号] 

// 显示仓库中的全部标签列表
git tag

// 现实标签详情
git show [标签名]

// 删除标签
git tag -d [标签名] 

// 推送标签到远程主机
git push origin [标签名]

// 推送所有本地标签到远程
git push origin --tags

// 删除远程标签,命令里的标签名其实就是文件名
git push origin :refs/tags/[标签名]

//本地标签需要另外手动删除

注意:标签是在提交的基础上创建的,如果仓库的多个分支中都有这个提交版本,那么这些分支上就有关于这个提交的相同的标签。

  • 依据 tag 签出版本=指定某个提交版本创建一个新的分支
// 切换到之前的某个提交版本
git checkout [标签名]

// 将此提交版本固定到一个新分支上并切换到此分支
git checkout -b [新的分支名]