Git没有那么难

Git 使用笔记

概念理解

  • 未索引文件 / Untracked Files
    未索引文件,指一个文件从未接受过任何git操作
    [VS Code]这类文件在VS Code的git面板里,其前会有一个U字母图标

  • 工作区 / Working Directory
    添加文件、修改文件、删除文件等等操作,都发生在工作区里
    [VS Code]当你修改了任何文件,这些文件就会出现在VS Code中的git面板里的更改区域下,这个更改区域就是工作区

  • 暂存区 / Staged Changes
    工作区里的文件,可以通过git add命令来添加到暂存区里,以便进行下一步的git commit操作
    [VS Code]对更改区域的文件点击加号,这个文件就会被移动到暂存的更改区域下,这个区域就是暂存区

  • 区别工作区和暂存区
    一个文件可以在git add操作后,又再次进行修改,这时候它会同时出现在工作区和暂存区里,工作区里保存的是git add以后所进行的那些修改
    当你对这个文件进行git commit的操作时,工作区里的修改不会被提交,只有暂存区里的所保存的那些修改内容才会被提交

  • 版本库
    一个文件的修改一旦提交后,就会从暂存区里消失,转而保存在git的版本库里。可以通过git log命令来查看版本库(每一次的提交历史)
    可以通过各类操作,把一个文件恢复到版本库里记录的某个状态(即恢复到某一次提交时那个文件当时所保存的内容)
    而工作区和暂存区的内容,一旦没有最终提交,而是被撤销了,是找不回来的

  • 远端 / Remote
    前面的概念都是在一个本地的git仓库里发生的
    可以通过git remote add命令把一个本地仓库和一个远端仓库(即服务器)联系起来,之后便可以通过git pushgit pull等命令来进行本地和远端之间的操作

  • HEAD
    HEAD指的是版本库里,最后的一次提交。

常用命令

配置

  • 添加用户名:git config --global user.name <用户名>
  • 设置用户邮箱: git config --global user.email <邮箱>

必须设置用户名和邮箱后,才可以git push等进行远端操作

杂项

  • 查看当前仓库状态:git status
  • 查看版本库记录:git log,每条提交记录会有一个hash值

暂存操作

  • 添加文件到暂存区:git add <文件或文件夹路径>(相当于VS Code里点击加号)
    如果执行git add .,则会递归地把当前目录下的所有文件添加到暂存区

提交操作

  • 提交修改:git commit -m <提交信息>
    这个操作会把暂存区里的所有修改一次性提交,但不会影响到工作区
  • 修改最后一次提交:git commit --amend -m <提交信息>,这回修改最后一次提交的提交信息
    如果执行这个命令式,暂存区里有内容,则会把当前暂存区的内容也一起合并提交进去
  • 撤销提交:git revert ,hash值可以通过git log命令查看,是一个字符串
    这会把这一次commit之后的所有commit从版本库里撤销,commit的内容回到暂存区

比较操作

  • 查看工作区所做的修改:git diff
  • 查看暂存区和最后一次提交的差异:git diff --cached
  • 对比两次提交的差异:git diff ..

以上三个命令,后接<文件路径>,可比较单个文件

撤销操作

  • 撤销暂存区的所有文件到工作区:git reset HEAD

  • 撤销单个文件/文件夹:git reset HEAD <文件/文件夹路径>

  • 把最后一次提交后所做的任何更改:git reset --hard HEAD
    详见git reset命令

  • 撤销单个文件:git checkout -- <文件路径>

  • 撤销某个提交后的所有提交:git reset <模式>
    这个命令适用于提交还没有发布到远端的情况

  • 用某个提交重新覆盖它之后的所有提交:git revert
    这个命令适用于提交已经发布到远端的情况,它的效果与reset的相似,但不是直接撤销,而是通过重新提交某个旧提交来覆盖它之后所做的修改

reset接受-soft--mixed--hard三种参数,默认是--mixed

  • --soft:只撤销提交,所撤销的内容内容出现在暂存区
  • --mixed:撤销提交和暂存,所撤销的内容出现在工作区
  • --hard:完全撤销,包括工作区,但不包括未索引文件(新建立的文件)

分支操作

  • 查看本地分支:git branch
  • 查看远端分支:git branch -r
  • 查看所有分支:git branch -a
  • 重命名当前分支:git branch -m <分支名>
  • 合并分支:git merge <分支名>,把某个分支的内容合并到当前分支
  • 重设分支的根基:git rebase <分支名>,把当前分支的所有提交暂存到某个地方,再把<分支名>所指的分支合并过来,然后再重新把那些暂存的提交应用上去。
    重新应用提交的过程中,如果有冲突,解决冲突后执行git rebase --continue
    过程如果出现错误,想退出rebase,执行git rebase --abort

结果中标星号的分支表示当前所处的分支

  • 切换分支:git checkout <分支名>
  • 新建分支:git branch <分支名>,分支将会在当前分支的状态下建立
  • 新建并切换到该分支:git checkout -b <分支名>,分支将会在当前分支的状态下建立
  • 删除分支: git branch -d <分知名>,把参数改成-D可以强制删除正常情下不允许删除的分支
  • 根据某个远端分支新建本地分支:git checkout -b <本地分支名> -t <远端分支名>
  • 设置本地分支的上游分支:git branch -u <主机名>/<远端分支名> <本地分支名>git branch --set-upstream-to=<主机名>/<远端分支名> <本地分支名>
  • 设置当前分支的上游分支:git branch -u <主机名>/<远端分支名>

存储操作

  • 存储修改:git stash,会把当前分支下的工作区和暂存区的内容存储到一个临时的地方
    可以通过git stash save <备注>来为本次存储添加备注内容
    注意,未索引文件不会被存储,必须先对其进行git add操作

  • 查看所有存储:git stash list

  • 提取某次存储的内容到当前分支:git stash apply stash@{<序列号>},提取后,该条存储依然存在

  • 提取某次存储的内容到当前分支并删除该条存储:git stash pop stash@{<序列号>},提取后,该条存储会被删除,无法再找回

  • 删除某次存储:git stash drop stash@{<序列号>}

以上条命令若不含stash@{<序列号>},默认会对最后的一次存储进行操作

远端操作

  • 克隆远端仓库:git clone <远端仓库地址> <本地目录名>

  • 连接远端仓库:git add remote <主机名> <远端仓库地址>,一般把远端版本库命名为origin

  • 修改主机名:git remote rename <原主机名> <新主机名>

  • 修改远端仓库地址:git remote set-url <主机名> <远端仓库地址>

  • 断开远端仓库:git remote rm <主机名>

  • 显示远端仓库信息:git remote show <主机名>

  • 获取远端的最新分支列表:git remote update <远端版本库命名>

  • 拉取远端分支到本地:git fetch <主机名> <远端分支名>

  • 推送本地分支到远端:git push <主机名> <本地分支名>:<远端分支名>

  • 拉取远端分支并合并到本地分支:git pull <主机名> <本地分支名>:<远端分支名>

以上两个命令,若本地分支为当前分支,当前分支名可省略
若本地分支已经设置了上游分支,远端分支名也可以省略
若远端仓库只有一个,主机名也可以省略

  • 删除远端分支:git push <主机名> -d <远端分支名>git push <主机名> :<远端分支名>
  • push的同时设置为上游分支:git push -u <...>
  • push本地仓库版本较旧的分支,强制覆盖掉远端仓库把本较新的分支:git push --force/-f <...>
  • pull的时候采用rebase方式而不是默认的merge方式:git pull --rebase <...>

你可能感兴趣的:(Git没有那么难)