git 详细命令

设置命令:

初始化命令

  • git init 将所在文件夹作为仓库

设置全局的用户名和邮箱;

  • git config --global set user.name '用户名'
  • git config --global set user.email '邮箱'
  • git config --list;>> 查看所有的配置项

设置单个项目的用户名和邮箱;

先进入到仓库的文件下然后执行

  • git config set user.name '用户名'
  • git config set user.email '邮箱'

提交命令

  • git add >> 将工作区代码添加到暂存区 git开始管理此文件
    • git add xx.js >> 添加一个文件
    • git add . >> 添加新增修改的文件,不包括删除的文件
    • git add * >> 和 add .相似,但是不会过滤ignore文件的限制
    • git add -u >> 添加修改的文件
    • git add -A >> 添加所有变化
  • git commit -m'提交描述' >> 暂存区提交到本地仓库
  • git push origin master >> 推送到远程仓库的指定分支;要指定本地分支
  • git push origin dev >> 推送其他分支,比如dev

关联远程库

  • git remote >> 查看远程库的信息
  • git remote -v >> 详细信息

$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

  • git rebase >> 把分叉变成直线

  • git remote add origin git@gitee.com:liaoxuefeng/learngit.git >> 关联远程库

  • git remote rm origin >> 删除已经关联的远程库

  • git remote add github git@github.com:michaelliao/learngit.git >> 默认远程库为origin,显示指定,远程库名为github,这是就可以关联两个远程库;

git remote rm origin

恢复命令

git reset

  • git reset head~ >> 将暂存区恢复到上一次最近提交;(将本地仓库代码更新到暂存区)
    • git reset head; >> 恢复所有文件
    • git reset head xx.js; >> 恢复指定文件

git reset head^ (^代表 上一个版本,^^ 上上版本以此类推):

  • 用head~ 代表最近的
  • 用head~2 代表上两个

1.reset 参数详情:
  1. git reset --mixed head~ (--mixed 为默认值可以不写)
  2. git reset --soft head~
  3. git reset --hard head~
  4. git reset ox12245(版本号);

向前向后回滚; git log 中的id号,只需前4位就可以识别。如果找不到后面的版本号,使用git reflog 命令;查看所有

参数说明
  1. --mixed 当执行了此命令后会发生两个操作
    1. 移动了head的指向
    2. 将head移动后的指向的版本更新(回滚)到暂存区

(两棵树)结果就是会改暂存区的树和git仓库的树

  1. --soft 当执行了此命令后会发生两个操作
    1. 移动了head的指向

(一颗树)结果就是会修改和git仓库的树

--soft 相当于撤销上次的Commit

  1. --hard 当执行了此命令后会发生三个操作
    1. 移动了head的指向
    2. 将head移动后的指向的版本更新(回滚)到暂存区
    3. 将暂存区指向的版本更新(回滚)到工作区域

(三颗树)结果就是会修暂存区的树和git仓库的树以及工作区的代码

--hard 存在为删除代码的危险

2. git checkout

用法一: 切换分支
  • git checkout branchName; >> 切换分支,会更新代码,暂存区、工作区的代码会出现变动
用法二: 放弃修改,更新工作区的代码从(暂存区或指定版本更新)
  • git checkout xx4548a(ID) >> 从指定版本更新暂存区和工作区

  • git checkout >> 将暂存区的代码更新到,工作区

    • git checkout -- xx.js (好像只有这个有用)
    • git checkout

checkout 就是更新工作区代码

3. reset 和 checkout 总结

  1. 文件恢复(指定文件)
    • 相同点:都可以指定文件到暂存区,并且不会修改head指向;
    • 不同:
      • reset 只会恢复到暂存区,不能恢复到工作区域
      • checkout 会恢复暂存区和工作区域

注意;上述提到 reset --hard会强制更新三颗树,但在指定文件时,reset的soft和hard命令此时不允许使用

  1. 快照恢复

    • 相同点:都是移动了head的指向并且更新工作区和暂存区的代码
    • 不同:
      • checkout >> 更安全;切换时会先尝试合并检查当前工作状态,如果不是clean 就是提示先解决;
      • reset --hard >> 会直接覆盖,暂存区和工作区

git reset --hard 分支名

reset也可以加分支进行更新,会将head指向的分支和head本身都切换,就是说主线的代码 就会丢失

head 和 commit

head: 当前commit提交
HEAD 是 Git 中一个独特的引用,它是唯一的
所谓当前 commit这个概念很简单,它指的就是当前工作目录所对应的 commit。

  • (HEAD -> master) 例如在提交记录中,这就表示指向当前commit提交;
例如上图中的当前 commit 就是第一行中的那个最新的 commit。

每次当有新的 commit 的时候,工作目录自动与最新的 commit 对应;而与此同时,HEAD 也会转而指向最新的 commit。

事实上,当使用 checkout、reset 等指令手动指定改变当前 commit 的时候,HEAD 也会一起跟过去。

HEAD、master 与 branch

这个文章很好;

diff 比较差异

工作区和git仓库

  • git diff >>> 比较当前工作区和当前commit的差异
  • git diff head>>> 比较当前工作区和当前commit的差异
  • git diff 245xxd(ID1) >>> 比较当前工作区和某个版本的差异

暂存区和git仓库

  • git diff --cached; >>> 比较当前暂存区和当前commit的差异

  • git diff --cached xa445(ID); >>> 比较当前暂存区和指定commit的差异

git仓库和git仓库

  • git diff 245xxd(ID1) 12asda(ID2) >>> 比较两个commit的差异

修改desc 和 删除误提交的文件 和 修改文件名

修改desc

  • git commit --amend; >> 执行后会进入 Linux的vim界面,利用命令进行修改,(我自己试的时候自动打开了 notepad 进行修改)
  • git commit --amend -m"修改后的描述" >>> 直接覆盖原来的desc

删除误提交的文件

  • git rm 文件名;>> 删除文件(PS:只会删除暂存区和工作区就是取消了git的跟踪,在下次提交时,不再管理,已经git commit 的文件不会被删除);所以此时还需将head的指向更新;

  • git rm -f 文件名 >>> 暴力删除(f:force)

    • 出现场景,当一个文件添加进暂存区后,又修改了工作区的文件,此时执行git rm 文件名就不能删除;

  • git rm --cached 文件名 >>> (只删除暂存区,保留工作工作区)

修改文件名

  • git mv/ren 原文件名 修改的文件名

@@ -1,3 +1,6 @@

  • ‘-’ 代表旧文件 ; ‘+’ 代表新文件
  • 1,3 代表从第一行到第三行; 1,6 代表从第一行到第六行

分支 branch 和 合并

理解:就是一个特殊的引用;和head相同,指向一个commit提交;但是不是唯一的

分支
  • git branch >> 显示当前所在分支,或者主线

  • git branch -avv >> 显示所有分支

  • git branch branch1 >> 创建分支

  • git checkout branch1 || git switch branch1 >> 跳转到分支

  • git checkout -b branch2 || git switch -c branch2 >> 创建并跳转到指定分支

  • git branch -d branch2 >> 删除指定分支(注:head所在分支不能删除,需要先用 checkout 把 HEAD 指向其他地方)

  • git branch -D >> 强行删除

  • git branch --set-upstream-to=origin/ dev

合并
  • git merge 分支名;>> 合并分支到主线

合并后出现Fast-forward 代表合并时没有冲突
Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。

  • git merge --no-ff -m "merge with no-ff" dev;
    • no-ff 参数

强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,所以需要加入新的提交描述;

bug分支
  • git stash > >可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
  • git stash list >> 查看历史保存的现场
  • git stash apply >> 恢复保存的现场但是恢复后,stash内容并不删除
  • git stash pop >> 恢复的同时把stash内容也删了
  • git cherry-pick 4c805e2(ID) >> 复制一个特定的提交到当前分支:

当一个BUG存在与连个分支上,修改一次后,可以将其复制一次提交,就不用重复操作了

历史查看

  • git log >> 查看提交记录(特指commit 过的历史)
  • git log --graph >> 查看分支合并图。
  • git log --pretty=oneline >> 去除一些无用的log信息,显示iD是 完成

decorate 显示指向的引用

  • git log --decorate --oneline >> 去除一些无用的log信息
    ,显示iD只有前7位
  • git log --all >> 显示所有主分支记录
  • git log decorate >> 将日志和标签的指向改为分支
  • git reflog ;查出所有的id,包括被回滚后的;覆盖掉的;
  • git log --pretty=oneline --abbrev-commit

tag标签

  • git tag >> 查看所有标签
  • git tag v1.0 >> 创建一个标签

默认标签是打在最新提交的commit上的,有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,

  • git tag v0.9 f52c633(id) >> 给已经提交的commit打标签
  • git show v0.9 >> 查看标签信息
  • git tag -a v0.1 -m "version 0.1 released" 1094adb

创建带有说明的标签,用-a指定标签名,-m指定说明文字

  • git tag -d v0.1 >> 删除标签

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

  • git push origin >> 推送某个标签到远程
  • git push origin --tags >> 推送全部未上传标签到远程
  • git push origin :refs/tags/v0.9 >> 删除远程的tag,先删除本地,再执行此命令
  • git push origin --delete tag v0.9 >> 删除远程的tag

小知识;

-f --cached

  • 一个‘-’ 代表常用,单词首字母
  • 两个‘--’ 代表可选的,单词完整拼写
git的三棵树;
  1. 工作区

  2. 暂存区;

  3. git仓库

git 和 其他版本控制的不同;

1、提交管理

  • svn增量管理,就是每一次提交只保存修改的地方,
  • git独立管理,就是每一次提交都是独立的管理;

当要切分支的时候,svn就得把所有的文件复制到另一个分支上吗,而git由于灭一个提交都是独立的,只需要创建一个指针(即分支)指向相应的提交即可

Git 实用教程 视频地址:
https://www.bilibili.com/video/BV1Vs411876L?p=10

Git 实用教程 :阮一峰
https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136

posted @ 2020-08-12 22:05  古月大叔  阅读(793)  评论(0编辑  收藏  举报