Git 学习之命令详解
- 以下是在各种情况下使用的常见Git命令:
// 启动工作区 clone 将远程版本库克隆到新目录 init 创建一个空Git存储库,或者重新编译现有的Git库 // 处理当前更改 add 添加到暂存区 下面有详解 mv 移动或重命名文件、目录或符号链接 reset 重置为指定状态 rm 从工作树和索引中删除文件 // 检查历史记录和状态 bisect 使用两分法搜索查找引入错误的提交 grep 检索文件中的文本内容 log 显示提交日志 show 显示各种类型对象的相关信息 status 显示工作树状态 // 成长,标记和调整你的共同历史 branch 分支列表、创建或删除分支 checkout 切换 创建分支 commit 将更改记录提交到存储库 diff 显示工作区和临时区之间的更改 merge 合并将两个或多个提交历史合并 rebase 衍合指定分支到当前分支 tag 创建、列出、删除或验证的标记对象 // 协作 fetch 从远程库获取代码 pull 从远程库获取代码快速合并 push 推送到远程库
- 详解:
git clone-n, 不检出Git库中的active branch -o new_origin, 使用new_origin,而不使用默认的origin,作为跟踪分支的upstream所在库 -b new_branch, 设置本地的active branch,而非默认的master branch --single-branch, 只检查一个branch,要么是默认的master,要么是-b new_branch指定的new_branch --recursive, 在本地初始化Git库中的所有模块 git clone 命令默认的只会建立master分支 // 特别提醒 git clone -b [new_branch_name] 仓库地址 // clone时创建新的分支替代默认origin/master git clone 仓库地址 // 从远程库拉到本地 文件名为仓库名 如 git@gitee.com:momingsixiali/git.git 拉到本地文件名为 git git clone 仓库地址 "指定目录" // 拉到本地文件名 为 指定的目录 如 git clone git@gitee.com:momingsixiali/git.git zhiding 本地文件名为 zhiding
git add
git add -u 将文件的修改、文件的删除,添加到暂存区。 git add . 将文件的修改,文件的新建,添加到暂存区。 git add -A 将文件的修改,文件的删除,文件的新建,添加到暂存区。 // 工作中一般是用到 git add . 或者 git add -A git add -A 相对于git add -u命令的优点 : 可以提交所有被删除、被替换、被修改和新增的文件到数据暂存区,而git add -u 只能操作跟踪过的文件 git add -A 等同于 git add -all
git mv
git mv demo demo1 // 不会破坏git历史 等效于 如下: mv demo demo1 // 修改文件名 git add demo1 // 添加到暂存区 git rm demo // 更改demo的提交历史到 demo1
git reset
git commit 每一次提交都会创建一个索引 如上图
git reset --hard // 危险命令 分支的指针都指向上一个提交 无法找回 移动 HEAD->更新索引->更新暂存区工作区
git reset --soft // 分支的指针都指向上一个提交 本次提交还在 只是不显示
git reset --mixed // 分支的指针都指向上一个提交 只是回退暂存区 工作区还在 推荐使用 也是 git 默认
git rm
git rm demo // 等效于 如下:
rm -rf demo
git add demo
git bisect
git bisect start [终点] [起点] // 使用方法 如git bisect start [1] [100] 切换到这段范围正当中的那一次提交就是第 50次提交
git bisect good //说明 标识本次提交(第50次)没有问题 后自动切换到后半段的中点(第75次提交)
git bisect bad // 说明 50 - 75 中间有问题 后自动切换到(第62次提交) 不断重复这个过程,直到成功找到出问题的那一次提交为止 返回
// 648308 is the first bad commit
git bisect reset // 退出,回到最近一次的代码提交 改 BUG
git grep
git grep login // 查找该仓库里所有使用'login'的地方 相当于 Linux中的 grep 返回如下
app/Http/Controllers/Auth/LoginController.php: * Where to redirect users after login.
app/Http/Middleware/Authenticate.php: return route('login');
resources/lang/en/auth.php: 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
git grep -n login // 显示 行号
app/Http/Controllers/Auth/LoginController.php:24: * Where to redirect users after login.
app/Http/Middleware/Authenticate.php:18: return route('login');
resources/lang/en/auth.php:17: 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
git grep --name-only login // 只显示文件名
app/Http/Controllers/Auth/LoginController.php
app/Http/Middleware/Authenticate.php
resources/lang/en/auth.php
git grep -c login // 查看每个文件里有多少行匹配
app/Http/Controllers/Auth/LoginController.php:1
app/Http/Middleware/Authenticate.php:1
resources/lang/en/auth.php:1
git grep login 5027c63 // 指定提交索引 找
git grep -e 'name' --and -e email // 同时满足 name 和 email
app/Models/User.php: 'name', 'email', 'password',
composer.lock: "name": "egulias/email-validator",
git grep --all-match -e 'name' -e email 97bacf05d4 // 满足name 或 email
git grep -e 'name' --and -e -e MAX .
git grep -e 'password' --and ( -e name -e email ) // 同时满足 password 和 (name 或者 email)
// 可组合使用
git grep -n -e 'password' --and -e email 97bacf05d4
git log
ps : 一下命令参数可自由组合 有的会失效 如 --all 和 指定提交 -all 生效
git log --all // 所有分支
git log --graph // 演化历史 包括所有分支
git log --oneline // 简化输出
729399c (HEAD -> dev) 0
736d8f6 (origin/dev) 邮箱验证功能
894f6ae 注册登录
6483089 添加忽略文件
git log --stat // git log 的基础上输出文件增删改详情 返回如下
commit 729399ce26607297d87415ab844ca247137b94f2 (HEAD -> dev)
Author: moming <15516319695@163.com>
Date: Thu Dec 26 23:34:57 2019 +0800
0
app/Models/UserAddress.php | 10 ++++++++++
config/session.php | 4 ++--
database/factories/UserAddressFactory.php | 9 +++++++++
database/migrations/2019_03_27_155837_create_user_addresses_table.php | 31 +++++++++++++++++++++++++++++++
public/js/app.js | 22 +++++++++++-----------
yarn.lock | 38 +++++++++++++++++++-------------------
6 files changed, 82 insertions(+), 32 deletions(-)
git log -p // 显示每个commit具体修改的内容,输出的形式以diff的形式给出
git show // 同git log -p输出类似,不同在于show只显示一个commit的内容,如果不指定commit hash, 它默认输出HEAD指向commit的内容
git shortlog // 显示汇总信息,以用户进行分类 返回如下
moming (6):
Merge branch 'dev' of https://github.com/wujianan/shop into dev
添加忽略文件
注册登录
邮箱验证功能
momingsixiali (1):
项目初始化
git shortlog -s // 显示用户 提交次数 按提交时间排序
git shortlog -n // 显示用户 提交次数 进行倒序排列
git log --author=moming // 显示 moming 的提交, 限定输出给定的用户
git log -2 // 限制 显示输出的数量 本次输出 2个
git log --after '12-22-2019' // --after和--before 限定指定日期的log
git log --decorate --oneline // 显示对应commit所属的branch和tag信息
git show
git show 72939 // 显示指定提交的相关信息
git show 72939^{tree} //显示指定提交的目录结构
git show v1 // 显示指定 tag
git status
git status // 查看当前工作区和暂存区文件的状态
git branch git checkout
git branch // 查看本地分支
git branch -a // 查看 本地 和远程 所有分支
git branch new_branch // 创建新分支
git branch --delete 分支名 // 删除 分支
git checkout 分支名 //切换分支
git checkout -b 分支名 //基于本分支创建并切新信分支
git push origin -u 分支名 // 将本地分支,推送到远程库
git commit
git commit -m '提交信息' // 添加提交信息
git commit -a -m '提交信息' // 还没有执行add命令的修改一起提交
git commit --amend // 修改上一次的提交信息
git diff
git diff // 显示工作区 和暂存区的 不同
git diff --stat // 显示简单的 比较信息
git diff master // 查看当前分支 与 master 分支的 不同之处
git diff SHA1 SHA2 // 比较两个历史版本之间的差异
git merge 和 git rebase
rebase
git merge dev // 当前的分支合并dev 没冲突直接合并 有冲突 会提醒 解决后 重新提交 分支中新的合并提交(merge commit)将两个分支的历史连在了一起 现有的分支不会被更改
git rebase dev // 当前的分支合并dev 没冲突直接合并 有冲突 会提醒 解决后 重新提交 为原分支上每一个提交创建一个新的提交,重写了项目历史,并且不会带来合并提交 *****黄金法则 绝不要在公共的分支上使用它
git fetch 和 git pull
git fetch 和 git pull // 功能是大致相同,都是起到了更新代码的作用 git pull看起来更像git fetch + get merge 建议使用 git fetch + get merge git pull 一旦代码有问题,很难找到出错的地方
git push
git push <远程主机名> <本地分支名>:<远程分支名> // 将本地分支的更新,推送到远程
git push origin :master // 危险 删除远程仓库的分支 等效于 git push origin --delete master
git push //当前分支只有一个追踪分支 可省略 <远程主机名> <本地分支名>:<远程分支名>
git push -u origin master // 将本地的master分支推送到origin远程,同时指定origin为默认,后面就可以不加任何参数使用git push
特别感谢:
博客平台提供-社区
更多关于git fetch 和 git pull
git rebase 使用加图解
本作品采用《CC 协议》,转载必须注明作者和本文链接
ps: 继续完善中
git grep 很实用
为什么不要在公共的分支上使用
git rebase