目录

Git用法

1 创建 git 仓库:

mkdir project_name
cd project_name
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitee.com:guohp1128/project_name.git
git push -u origin "master"
  1. 本地创建一个项目文件夹project_name,初始为git工程,添加README.md,提交更改到本地仓库。
  2. git remote add命令将本地仓库与远程仓库url关联起来(在gitee平台新建名为project_name的仓库),并指定别名origin。

2 Git工作流程

文件存储区框图

image-20240905132752517

Git中文件的四种主要状态:

  • Untracked:未跟踪,文件在当前工作区文件夹中但还没有被Git纳入版本控制(没有add)。
  • Unmodify:未修改,文件已被Git跟踪,且文件内容与仓库中最近一次提交的内容相同。
  • Modified:已修改,当前工作区的文件内容已被修改但还没有被添加到暂存区。
  • Staged:已暂存,文件修改已被添加到暂存区,准备被提交到本地仓库中。

Git工作流程

  • HEAD代表了当前分支的最新提交(commit),本地仓库中特定分支的最新提交。

  • 所有的新增文件或更改文件操作的是工作目录,或当前工作区。

  • 如果新增文件还没有被添加到暂存区,那么它处于Untracked状态,还未纳入git版本控制中,可随意增删。使用git add可将新增文件添加到暂存区。

  • 如果你想要撤销工作目录中某个文件的更改,使其回退到最近一次提交时的状态,你可以使用:

    git restore <file>
  • 如果一个文件的更改已经添加到了暂存区,但你现在想要将更改从暂存区中移除(而工作目录中保留更改),使其回退到最近一次提交时的状态,你可以使用 --staged(或 -s)选项:

    git restore --staged <file>
  • 重置工作目录和暂存区,使回退到最近一次提交时的状态,将把 HEAD 重置到当前分支的最新提交,并重置暂存区和工作目录以匹配该提交,所有自上次提交以来的更改都将丢失。

    git reset --hard HEAD
  • 将暂存区的更改提交的本地仓库,并创建一个新的提交。

    git commit -m "commit message"
  • 将本地仓库的更改推送到远程仓库。

    git push
  • 如果你想要将远程仓库分支的更改拉取到你的本地分支,并合并。

    git pull

3 git diff比较的用法

git diff是一个功能强大的命令,它可以根据不同的参数和上下文来比较不同的对象。

命令git diff A B的含义是如何从 A 变成 B ?,既以 A 为基准,看 B‌ 改了什么。

比较输出符号说明:

  • 比较输出中的---代表‌变动前‌的文件(源文件A/旧版本)。
  • 比较输出中的+++代表变动后‌的文件(目标文件B/新版本)。
  • 输出标志-代表:相对于源文件A,目标文件B缺少什么。
  • 输出标志+代表:相对于源文件A,目标文件B新增什么。

以下是对git diff在不同场景下的使用的详细解释:

  • git diff:

    当你不带任何参数运行git diff时,它默认比较的是工作区中的当前文件状态相对于暂存区中的文件状态的差异情况。

    源文件是暂存区,目标文件是工作区。

    使用git add .可以将工作区的更改添加到暂存区。

  • git diff --cached或git diff --staged:

    当参数A是--cached时,它比较的是暂存区中的当前文件状态相对于本地仓库中最后一次提交时的文件状态的差异情况。

    源文件是本地仓库,目标文件是暂存区。

    使用git commit可以将暂存区的更改提交到本地仓库。

  • git diff origin/master HEAD:

    当参数A是origin/master时,参数B是HEAD时,它比较的是本地仓库最后一次提交后的当前文件状态相对于远程跟踪分支中的文件状态的差异情况。

    源文件是远程跟踪分支,目标文件是本地仓库。

    执行git diff origin/master HEAD前,使用git fetch origin把远程仓库的最新提交下载到本地的远程跟踪分支(origin/master)中。

    使用git push可以将本地仓库的更改提交到远程仓库。

  • git diff HEAD:

    当参数A是HEAD时,它比较的是工作区中的当前文件状态相对于本地仓库中的文件状态的差异情况。

    源文件是本地仓库,目标文件是工作区。

  • git diff origin/master:

    当参数A是origin/master(远程跟踪分支)时,它比较的是工作区中的当前文件状态相对于远程跟踪分支中的文件状态的差异情况。

    源文件是远程跟踪分支,目标文件是工作区。

4 撤销对本地仓库的最近提交

  • 混合重置(Mixed Reset):

    git reset --mixed HEAD~1 或 git reset HEAD~1(默认就是混合重置),这个命令会撤销最近的提交,并取消暂存区所有被撤销提交中的更改,但工作目录中的更改仍然保留。

5 概念理解

  • origin:

    代表默认的远程仓库名称,指向最初克隆或关联的远程仓库地址‌。当使用git clone命令克隆一个远程仓库时,Git会自动将这个远程仓库的地址设置为默认的远程仓库,并将其命名为origin。

6 分支操作

  • 查看所有分支,当前分支会有一个*标记,并且是绿色的。

    git branch

  • 查看本地仓库当前分支。

    git branch --show-current

  • 本地仓库新建一个分支,并切换到该分支。

    git switch -c new_branch_name

  • 切换到目标分支,将branch_name替换为你想要切换的分支名。

    git switch branch_name

  • 本地的更改推送到Gitee上的某一特定分支,确保你已经在本地创建了该分支,并切换到该分支。如果远程仓库中不存在该分支,上述命令将会创建它。如果分支已经存在,更改将被推送到这个远程分支上。

    git push origin your-branch-name

  • 克隆仓库中某一分支的代码。

    git clone -b branch-name repository-url

  • 本地仓库新建的分支推送到远程仓库。

    git push -u <远程仓库名> <分支名>

    -u 选项是 --set-upstream 的简写,它会设置远程跟踪分支,这样以后你就可以简单地使用 git push 和 git pull 命令而不需要指定远程仓库和分支名了。<远程仓库名>默认是origin,如果远程没有该分支名的话,命令会在远程仓库中创建对应的分支。

  • 查看本地仓库当前的分支,以及所跟踪远程仓库的URL和分支名。

    git remote -v

    输出远程仓库名、拉取URL和推送URL

    git branch -vv

    列出所有的本地分支,以及它们各自跟踪的远程分支,其中绿色带*的是本地当前分支名

7 本地更改推送到远程仓库

  • 查看本地仓库所跟踪远程仓库的URL。

​ git remote -v

​ 输出远程仓库名、拉取URL和推送URL

  • 查看本地仓库当前的分支,以及跟踪的远程分支。

​ git branch -vv

​ 列出所有的本地分支,以及它们各自跟踪的远程分支,其中绿色带*的是本地当前分支名

  • 查看工作区和暂存区的修改状态。

​ git status

  • 比较工作区与暂存区的文件之间的差异。

​ git diff

​ 按q键退出比较

  • 将工作区的所有更改添加到暂存区。

    git add .

  • 将暂存区的更改提交的本地仓库,并创建一个新的提交。

​ git commit -m "commit message"

  • 把本地仓库的当前分支的更改推送到远程仓库。

​ git push -u <远程仓库名> <分支名>

​ -u 选项是 --set-upstream 的简写,它会设置远程跟踪分支,这样以后你就可以简单地使用 git push 和 git pull 命令而不需要指定远程仓库和分支名了。<远程仓库名>默认是origin,如果远程没有该分支名的话,命令会在远程仓库中创建对应的分支。