# git - 常用命令

文档类,记录 git 常用命令

# git 基础概念

  • 远程仓库:就是代码最终提交的归宿。
  • 远端分支本地副本:主要储存了远程仓库各分支数据在本地的一个副本。可以打开项目下的 .git 文件,里面有个 refs/remotes,这里就主要存的就是远程仓库的分支信息,一般执行 push 或者 pull、fetch 都会往这里进行更新。
  • 本地仓库:这里就是我们经常会打交道的区域,在执行 commit 之后,本质上就是提交到了这个区域。可以查看你的 .git 目录下的 refs/heads 目录,里面存的就是我们本地的分支代码信息。
  • 暂存区:这个区域就是我们每次执行 git add 之后会存到的区域,用来与本地仓库之间做一个缓存,同时也是 Git 底层设计上来说也算是比较重要的一个区域,它能帮助 Git 在做 diff 的时候提高查找性能。
  • 工作区:这个一般就是我们写代码的地方,比如 vscode 打开的项目,可以进行代码编辑的地方。

# 命令概述

  • git stash
  • git clone
  • git init
  • git remote
  • git branch
  • git checkout
  • git add
  • git commit
  • git rm
  • git push
  • git pull
  • git fetch
  • git merge
  • git log
  • git reset
  • git reflog
  • git revert
  • git cherry-pick
  • git tag
  • git rebase

# git stash

把暂存区的改动临时存储起来。

  • git stash save 'xxx':储存变更,并命名 xxx
  • git stash list:查看储存区所有提交列表
  • git stash pop:弹出并应用最近的一次储存区的代码提交
  • git stash drop stash@{n}:删除某次储存记录,n 可以通过 git reflog 查看
  • git stash clear:清除所有 stash 信息

它的数据将被存在仓库 .git 文件下的 refs/stash 里。

# git clone

  • git clone xxx.git:把一个仓库代码拉到本地
  • git clone xxx.git -b branch1:把一个仓库代码拉到本地之后,基于默认分支(main/master)创建新的分支

# git init

  • git init:初始化一个 git 仓库,创建 git 配置到 .git 文件夹

# git remote

  • git remote add <name> <url>: 添加一个远程版本库关联
  • git remote rm <name>: 删除某个远程版本库关联

栗子:git - 配置/修改远程仓库地址

# git branch

  • git branch:查看本地所有分支信息
  • git branch -r:查看远程仓库所有分支
  • git branch -a:查看本地和远程仓库所有分支

# git checkout

  • git checkout -b branch1:基于当前分支创建并切换到新分支

# git add

添加工作区的文件到暂存区

  • git add [file1] [file2]: 添加一个或多个文件到暂存区
  • git add .:把当前目录下得所有文件改动都添加到暂存区
  • git add -A:把当前仓库内所有文件改动都添加到暂存区

# git commit

将暂存区文件提交到本地仓库

  • git commit [file1] ... -m [message]:将暂存区的内容提交到本地 git 版本仓库中
  • git commit -am [message]: 相当于 git add -Agit commit -m [message]

# git rm

  • git rm .env:将 .env 文件从 git 仓库中删除
  • git rm -r dist:将 dist 文件夹从 git 仓库中删除

如果已经 git add 到暂存区了,那就需要 (use --cached to keep the file, or -f to force removal)

# git push

推送本地分支到远程仓库

  • git push:推送当前分支到远程仓库对应分支
  • git push --set-upstream origin branch1:推送当前分支到远程仓库 branch1 分支,并关联,下次可以直接使用 git push

# git pull

合并远程分支到本地分支

  • git pull:合并远程仓库对应分支到当前本地分支
  • git pull origin branch1:合并远程仓库 branch1 分支到当前本地分支

# git fetch

获取远程仓库分支的最新代码,并不合并到本地仓库

  • git fetch:更新远程仓库分支,可以查看到远程分支最新的改动
  • git fetch:更新的时候,如果远程分支已经删了,那本地记录这边也删除对应的远程分支

# git merge

  • git merge master:合并 master 分支到当前分支
  • git merge origin/master:合并远程 master 分支到当前分支

# git log

查看提交记录

# git reset

回退版本

  • git reset [--soft | --mixed | --hard] [HEAD]

# 关于 HEAD

  • HEAD 表示当前版本
  • HEAD^ 上一个版本
  • HEAD^^ 上上一个版本
  • HEAD^^^ 上上上一个版本
  • HEAD~n 回撤 n 个版本,这种也是更加方便的

# 参数

基于 git reset HEAD^ 进行说明。

  • --soft:重置最新一次提交版本,不会修改暂存区和工作区。
  • --mixed:默认参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
  • --hard:重置所有提交到上一个版本,并且修改工作区,会彻底回到上一个提交版本,在代码中看不到当前提交的代码,也就是工作区改动也被干掉了。

栗子:

  • 我改动了我的 README 文件,在我们的工作区就产生了一次改动,但是这个时候还没有提交到暂存区,在 status 里会显示为工作区修改的标记
  • 接着我们执行 git add,这个时候你查看暂存区,会发现这次改动被提交进去了,同时被 status 标记为已被提交至暂存区
  • 然后再执行 git commit,这个时候就完成了一次提交

接下来我们想撤回这次提交,以上三种参数所体现的表现会是这样的:

  • --soft:我们对 README 的更改状态现在变成已被提交至暂存区,也就是上面 2 的步骤。
  • --mixed: 我们对 README 的更改变成还未被提交至暂存区,也就是上面 1 的步骤。
  • --hard:我们对 README 的所有更改全没了,git log 中也找不到我们对 README 刚刚那次修改的痕迹。

git 暂存区和工作区

# git reflog

查看所有 git 操作记录,包括提交,回退等等

# git revert

回退某次 commit 提交的内容,和 reset 的区别是会产生新的 commit

# git cherry-pick

将指定提交合并到当前分支

  • git cherry-pick master commitId1 commitId2 commitId4 将 master 上的提交 1,2,4 合并到当前分支

# git tag

打标签

# 轻量标签

  • git tag v1.0.0

# 附注标签

  • git tag -a v1.0.1 -m "发布正式版 1.0.1"

附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。

  • git push origin tagName:推送标签
  • git tag:查看标签
  • git tag -l v1.0.1:筛选标签
  • git tag -d v1.0.1:删除标签
  • git push origin --delete v1.0.2:删除远程标签
  • git push origin :refs/tags/v1.0.1:删除远程标签,将“:”前面空值替换到远程

# git rebase

类比 merge,合并两个分支,相同的提交只保留一个,并且不会产生新的提交记录。

# 参考

上次更新: 11/21/2022, 9:49:58 AM