Git常用指令

基本概念

生成ssh

git --version # 查看git版本

git config [--config] user.name [yourname] #查看[修改]全局用户名
git config [--config] user.email [yourname] #查看[修改]全局用户邮箱
#本地git的用户名和邮箱尽量和github保持一致。如果邮箱不一致,会导致github无法统计contributions

git clone <远程仓库地址> #克隆仓库代码到本地

git remote add <远程仓库名> <远程仓库地址> #把远程仓库绑定到本地仓库,<远程仓库名>可自定义,常用origin
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 生成ssh密钥

ssh -T git@github.com #测试github连接

其中:

  • -t rsa t 即 Type,指定了使用RSA加密算法生成密钥,加密类型还有其他可惜类型,比如ed25519 ecdsa
  • -b 4096 指定密钥的位数(Bit-length),密钥位数越高,安全性越强,但生成和使用时可能略慢。默认 RSA 密钥长度为 3072 位。
  • -C "your_email@example.com" 添加注释(Comment),用于标识密钥的用途或所有者‌。通常用邮箱作为注释,方便识别密钥归属,注释会附加在生成的公钥文件末尾。
    执行后会生成公钥和私钥,分别默认保存在/.ssh/id_rsa/.ssh/id_rsa.pub。公钥可分享给Git服务商,如在GitHub的 settings - SSH and GPG key页面,点击New SSH key,复制公钥的内容然后保存,然后可使用ssh -T git@github.com测试连接。输入下面类似内容表示成功。

git status

显示文件的状态。选项:

  • -s: --short,以简短格式输出
  • -l: --long,以长格式输出,这是默认的
  • -b: --branch,即使是简短格式,也输出分支信息
  • -uno -unormal -uall: 未追踪文件显示规则。默认为-uall
    • no 显示未追踪的文件
    • normal 显示未追踪的文件或文件夹
    • all 显示未追踪的文件或文件夹,以及文件夹中的文件

简短形式下状态码的含义:

  • '' :未修改的
  • M :modified,修改过的
  • T :文件类型已更改
  • A :新增的
  • D :删除
  • R :重命名
  • U :更新但未合并
    当文件在 暂存区工作目录 中均存在变更时,会显示双状态码(两列字符),其中第一列表示暂存区状态,第二列表示工作目前状态。

git add

将文件的修改添加至暂存区(Stage)。此命令不会将文件提交到版本库,只是为了下一步的提交做准备。

git add <文件名> #将单个文件添加到暂存区

git add . #将当前目录下的所有更改(包括新增、修改和删除)添加到暂存区

git add -p #交互式地添加文件的部分更改到暂存区

git commit

将暂存区的修改提交到本地版本库,形成一个新的提交(Commit)。

git commit -m "commit message" #提交暂存区的内容并附带提交信息

git commit --amend #修改上一次的提交信息,或将新的更改合并到上一次提交

git pull

从远程获取代码并合并本地的版本。其实就是 git fetch 和 git merge 的简写。

git pull <远程仓库名> <分支名> #拉取远程主机的指定分支

git pull origin master:brantest #将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git push

将本地版本库的提交推送到远程版本库(如 GitHub、GitLab 等)并合并。

git push <远程主机名> <本地分支名>:<远程分支名> #如果本地分支名与远程分支名相同,则可以省略冒号

#下面两行命令是等效的,都是将本地主分支 main 的推送到远程的 main 分支
git push origin main
git push origin main:main

git checkout

用于切换分支、恢复文件、回到指定提交的历史版本。

git checkout <分支名> #切换到指定的分支。如果分支不存在,可以创建并切换到新分支
#切换分支
git checkout feature-branch #将当前的工作区切换到 feature-branch 分支上

git checkout - #切换到前一个分支

git checkout -b new-branch-name #创建一个新的分支并切换到该分支,相当于执行了下面俩条命令
git branch <new-branch-name>
git checkout <new-branch-name>
#恢复文件到暂存区版本(上次add后的版本,如果没有add,就是上次commit的版本)
git checkout -- <filename>

#回退到指定提交的版本,同时更新工作区和暂存区
git checkout <commit-hash> -- <filename>

git checkout 可能会导致未保存的更改丢失,尤其是当你在切换分支或恢复文件时未保存当前工作区的更改。
在 Git 2.23 之后,引入了两个更明确的命令:git switchgit restore,用于替代部分 git checkout 的功能:

  • git switch:用于切换或创建分支
  • git restore:用于恢复工作区文件或从历史提交中恢复文件

git reset

用于撤销提交或修改,可以重置暂存区或当前分支的状态。

git reset HEAD~1 #将当前分支的最后一次提交撤销,并将更改保留在工作区

git reset --hard HEAD~1 #将当前分支的最后一次提交和更改完全撤销,工作区也将被重置

git reset <filename> #将指定文件从暂存区移除,但保留工作区的更改

HEAD说明:

  • HEAD 表示当前版本,等同于 HEAD~0
  • HEAD^ 上一个版本,等同于 HEAD~1
  • HEAD^^ 上上一个版本,HEAD~2
  • 以此类推...

git cherry-pick

将其他分支或提交历史中的某一个或多个特定提交应用到当前分支。常用于将某些独立的更改从一个分支引入另一个分支,而不用合并整个分支或变基。cherry-pick不会影响原始分支的提价历史。

#将指定提交的更改应用到当前分支,并形成一个新的提交
git cherry-pick <commit-hash> 

#挑选多个提交,这些分支会依次应用到当前分支
git cherry-pick <commit1> <commit2> <commit3>

#选择指定范围内的所有提交
git cherry-pick <commit-start>^..<commit-end>

cherry-pick过程中,如果遇到冲突,需要手动解决冲突,然后执行以下命令继续:

git cherry-pick --continue
#如果不想继续,可以使用以下命令取消这次操作
git cherry-pick --abort

git merge

将其他分支合并到当前分支

git merge <branch-name> #将指定分支的提交合并到当前分支

git merge --abort #如果合并过程中发生冲突且无法解决,可以使用此命令取消合并

git rebase

将一个分支的修改移到另一个分支上。可以帮助保持提交历史的线性,减少合并时的冲突。

git rebase <branch-name>

git rebase -i <branch-name> #交互式变基

git diff

查看工作区或暂存区的文件改动详情。

# 1.查看工作区中位暂存的修改
git diff

# 2.查看已暂存,但未提交的修改
git diff -staged
或
git diff -cached

# 3.查看两个提交之间的差异
git diff <commit1> <commit2>

# 4.查看特定文件的更改内容
git diff <filename>

# 5.查看当前工作区或暂存区与指定提交的差异
git diff <commit>

# 6.比较分支之间的差异
git diff <branch1>..<branch2>

常用选项

  • git diff --name-only:只显示有改动的文件名称,不显示具体内容
  • git diff --stat:显示更改的统计信息,如每个文件修改、添加或删除的行数
  • git diff -w:忽略空白字符的差异