0

0

git使用杂记

高洛峰

高洛峰

发布时间:2017-02-09 09:31:40

|

1216人浏览过

|

来源于php中文网

原创

Cogram
Cogram

使用AI帮你做会议笔记,跟踪行动项目

下载

前言

作为一个开发者,如果现在还不知道git或者还不会使用git,那么你应该好好的反省。自己去好好看一遍的入门介绍吧。今天只是对自己在日常中使用git的一些常用命令的介绍与自己认为不错且能提高我们办公效率的命令。内容可能会有点杂乱,但绝对都是经典的命令,在此记下笔记,也希望能帮助来赏脸关顾的你们。

区域

在这之前,来介绍一下git的三个区域

  • 工作区(working directory)

  • 暂存区(stage index)

  • 本地历史区(history)

通过一张图就能简洁易懂的明白它们之间的转化。

git使用杂记

clone

先从clone命令来介绍,使用过git的都知道它。git colne命令拉取远程仓库到本地。但当我们要拉取到指定的文件夹下时,你可能会直接mkdir,其实无需如此,一条命令就能搞定git clone 远程仓库 文件名,就是如此简单。

rm

我们在工作中可能会遇到这么一种情况,使用git add .直接将工作区的所有修改的文件加入到暂存区了,但是后面发现有一个文件先不要加进去,此时我们就可以使用如下命令就可以将该文件退回到工作区中。

git rm --cached <file>

stash

有这么一种情况,当你正在开发中时,有一个线上的紧急bug需要修复,此时开发中的功能又没有完成你不想提交,此时你可以使用git stash将工作区的文件都存放起来。这时你就可以放心的去切分支修复bug,修复完之后执行git stash pop可以将先前存放的取出,当然也有一些其他的相关命令例如:git stash list查看存放的记录,git stash drop丢弃存放的记录。

tag

可能在开发中我们要打标签git tag tagName,并且要将相应的标签推送到远程仓库中,此时可以使用如下命令进行推送。

git push --tags tagName

amend

当你commit以后,发现有一个文件没有加进上次的commit中,或者又修改了一些文件。此时你并不想增加新的commit信息,只是想将其加入到上次的commit中。这时你就可以使用

git commit --amend <file>

将暂存区的文件加入其中,并且你也可以修改此时的commit信息。

reset

reset也能实现前面的rm的效果,可以使用如下命令来替代前面的git rm --cached <file></file>命令

git reset HEAD <file>

reset用途更广,结合soft参数可以回撤到任意的commit节点进行操作

git reset --soft index

执行该命令之后,就回到index处,工作区不变、暂存区回到当时的index处。另外还有一个hard参数。

git reset --hard index

soft可以说对立,它的效果就在于工作区与暂存区的不同,它会清空这两个区。

rebase

对于rebase是重定向的意思,如果你当前的分支与远程的分支commit信息存在差异时,会提醒你此时不能进行push,必须先将远程的commit信息拉去到本地来,才能进行提交。对于这种情况就可以使用rebase命令了。如下当前处在develop分支

git使用杂记

此时应该先执行rebase命令

git fetch
git rebase origin/master

执行完之后,最后再push到远程master

git push origin master

最终各个分支的情况就是上图的效果了。如果觉得命令多难记,这里也可用一条命令来完成上面的效果

git pull --rebase origin master

这是rebase的简单运用,也是常见的命令了。下面介绍rebase的一个可选参数--onto

--onto

使用场景:开发过程中我们都会创建不同的分支进行开发不同的功能,当你在分支A上创建了新分支B进行开发功能并且也提交了一些commit时,此时你发现原来A分支上有错误的commit,如果要rebasemaster上时,不能将这个错误的commit也附带上。这个时候就该--onto大显神通了。

git使用杂记

当前处在B分支,要得到上面的结果,只需执行如下命令

git rebase --onto master <b的commit hash code> B

这个不仅可以针对不同的分支,也能作用于同一个分支上。所以针对上面的情况可以只对分支B进行操作,等价命令如下:

git rebase --onto <a的commit hash code> <b的commit hash code> B

--interactive

当我们要修改commit信息的名称时,如果要修改的commit处在第一个时,可以使用

git commit --amend

如果不是第一个时,我们就要使用到rebase--interactive可选参数了,可以简写为-i

git rebase -i <commit hash code>

参数后面的commit hash code为需要修改的commit的前一个。执行之后就会出现如下类似的信息:

pick 137cf0a First coommit
pick 163dc38 Second commit

# Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

根据提示我们可以有6个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit的情况,需要使用r

r 137cf0a First commit
pick 163dc38 Second commit

执行之后会跳到修该First coomit的界面,进行修改即可。

First commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Jan 26 23:07:10 2017 +0800
#
# rebase in progress; onto f9aee6e
# You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'.
#
# Changes to be committed:
#       new file:   file1

至于其他的操作项,有兴趣的可以自己去尝试一下。例如s操作就可以用来合并commit

branch

相信branch都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit信息节点进行创建分支。

git使用杂记

要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit节点的hash code

git branch new_branch <commit hash code>

push

这里提一下push--set-upstream,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。

git checkout push_branch
git push origin push_branch

下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。

git push --set-upstream origin push_branch

cherry-pick

这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit你还是想推送到远程master上。

git使用杂记

将分支切换到master,执行以下命令:

git cherry-pick <b的 commit hash code>

merge

我们所熟知的是使用merge来进行分支的合并,每次使用merge时都会自动将副分支合并成一个commit进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash操作

git merge --squash dev_branch

执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。

reflog

当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:

git reflog
894a16d HEAD@{0}: commit: commit another todo
6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman
324336a HEAD@{2}: commit: commit todo
6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger
6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom
6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman
6876e5b HEAD@{6}: commit (initial): initial commit

这样我们就可以看到所用的操作历史了。这样如果我们使用git reset命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code,之后就可以通过如下命令进行恢复。

git checkout <hash code>
目前想到的就这些了,希望能有所帮助

个人博客:http://www.php.cn/

前言

作为一个开发者,如果现在还不知道git或者还不会使用git,那么你应该好好的反省。自己去好好看一遍的入门介绍吧。今天只是对自己在日常中使用git的一些常用命令的介绍与自己认为不错且能提高我们办公效率的命令。内容可能会有点杂乱,但绝对都是经典的命令,在此记下笔记,也希望能帮助来赏脸关顾的你们。

区域

在这之前,来介绍一下git的三个区域

  • 工作区(working directory)

  • 暂存区(stage index)

  • 本地历史区(history)

通过一张图就能简洁易懂的明白它们之间的转化。

git使用杂记

clone

先从clone命令来介绍,使用过git的都知道它。git colne命令拉取远程仓库到本地。但当我们要拉取到指定的文件夹下时,你可能会直接mkdir,其实无需如此,一条命令就能搞定git clone 远程仓库 文件名,就是如此简单。

rm

我们在工作中可能会遇到这么一种情况,使用git add .直接将工作区的所有修改的文件加入到暂存区了,但是后面发现有一个文件先不要加进去,此时我们就可以使用如下命令就可以将该文件退回到工作区中。

git rm --cached <file>

stash

有这么一种情况,当你正在开发中时,有一个线上的紧急bug需要修复,此时开发中的功能又没有完成你不想提交,此时你可以使用git stash将工作区的文件都存放起来。这时你就可以放心的去切分支修复bug,修复完之后执行git stash pop可以将先前存放的取出,当然也有一些其他的相关命令例如:git stash list查看存放的记录,git stash drop丢弃存放的记录。

tag

可能在开发中我们要打标签git tag tagName,并且要将相应的标签推送到远程仓库中,此时可以使用如下命令进行推送。

git push --tags tagName

amend

当你commit以后,发现有一个文件没有加进上次的commit中,或者又修改了一些文件。此时你并不想增加新的commit信息,只是想将其加入到上次的commit中。这时你就可以使用

git commit --amend <file>

将暂存区的文件加入其中,并且你也可以修改此时的commit信息。

reset

reset也能实现前面的rm的效果,可以使用如下命令来替代前面的git rm --cached <file></file>命令

git reset HEAD <file>

reset用途更广,结合soft参数可以回撤到任意的commit节点进行操作

git reset --soft index

执行该命令之后,就回到index处,工作区不变、暂存区回到当时的index处。另外还有一个hard参数。

git reset --hard index

soft可以说对立,它的效果就在于工作区与暂存区的不同,它会清空这两个区。

rebase

对于rebase是重定向的意思,如果你当前的分支与远程的分支commit信息存在差异时,会提醒你此时不能进行push,必须先将远程的commit信息拉去到本地来,才能进行提交。对于这种情况就可以使用rebase命令了。如下当前处在develop分支

git使用杂记

此时应该先执行rebase命令

git fetch
git rebase origin/master

执行完之后,最后再push到远程master

git push origin master

最终各个分支的情况就是上图的效果了。如果觉得命令多难记,这里也可用一条命令来完成上面的效果

git pull --rebase origin master

这是rebase的简单运用,也是常见的命令了。下面介绍rebase的一个可选参数--onto

--onto

使用场景:开发过程中我们都会创建不同的分支进行开发不同的功能,当你在分支A上创建了新分支B进行开发功能并且也提交了一些commit时,此时你发现原来A分支上有错误的commit,如果要rebasemaster上时,不能将这个错误的commit也附带上。这个时候就该--onto大显神通了。

git使用杂记

当前处在B分支,要得到上面的结果,只需执行如下命令

git rebase --onto master <b的commit hash code> B

这个不仅可以针对不同的分支,也能作用于同一个分支上。所以针对上面的情况可以只对分支B进行操作,等价命令如下:

git rebase --onto <a的commit hash code> <b的commit hash code> B

--interactive

当我们要修改commit信息的名称时,如果要修改的commit处在第一个时,可以使用

git commit --amend

如果不是第一个时,我们就要使用到rebase--interactive可选参数了,可以简写为-i

git rebase -i <commit hash code>

参数后面的commit hash code为需要修改的commit的前一个。执行之后就会出现如下类似的信息:

pick 137cf0a First coommit
pick 163dc38 Second commit

# Rebase f9aee6e..163dc38 onto f9aee6e (2 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

根据提示我们可以有6个可选择的操作。相信提示已经说的很明显了,对于我们这种要修改First coommit的情况,需要使用r

r 137cf0a First commit
pick 163dc38 Second commit

执行之后会跳到修该First coomit的界面,进行修改即可。

First commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Jan 26 23:07:10 2017 +0800
#
# rebase in progress; onto f9aee6e
# You are currently editing a commit while rebasing branch 'master' on 'f9aee6e'.
#
# Changes to be committed:
#       new file:   file1

至于其他的操作项,有兴趣的可以自己去尝试一下。例如s操作就可以用来合并commit

branch

相信branch都很熟悉,我这里要说的是他的另一种可能会用到的情况。场景是这样的:如果在你进行创建新的分支时,并不想从当前的commit信息节点进行创建分支。

git使用杂记

要实现如上效果只需在创建分支时在后面再添加额外的参数,该参数就是你所需调到的commit节点的hash code

git branch new_branch <commit hash code>

push

这里提一下push--set-upstream,它的效果是设置上游分支,当我们将远程不存在的本地分支推送到远程时,如果不在推送的分支上,我们一般会使用如下命令进行推送。

git checkout push_branch
git push origin push_branch

下面是简洁的方法,使用该参数无需切换分支,可以直接使用如下命令进行推送。

git push --set-upstream origin push_branch

cherry-pick

这个命令的场景是:当你所在的分支没用,你要删除它,但其中的一个commit你还是想推送到远程master上。

git使用杂记

将分支切换到master,执行以下命令:

git cherry-pick <b的 commit hash code>

merge

我们所熟知的是使用merge来进行分支的合并,每次使用merge时都会自动将副分支合并成一个commit进行推送到主分支上,那么如果我不想它自动推送到主分支上时(可能我还需要进行修改),这时就可以使用--squash操作

git merge --squash dev_branch

执行完以上命令后,我们就可以在暂存区看到一个还未提交的文件状态。

reflog

当我们切分支太频繁了之后,可能会忘了一些分支是从哪个分支切过来的,此时可以使用如下命令查看:

git reflog
894a16d HEAD@{0}: commit: commit another todo
6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman
324336a HEAD@{2}: commit: commit todo
6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger
6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom
6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman
6876e5b HEAD@{6}: commit (initial): initial commit

这样我们就可以看到所用的操作历史了。这样如果我们使用git reset命令不小心删除了需要的东西。可以通过此来查找到删除操作的hash code,之后就可以通过如下命令进行恢复。

git checkout <hash code>
目前想到的就这些了,希望能有所帮助

更多git使用杂记 相关文章请关注PHP中文网!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

2

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

1

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

3

2026.02.24

Golang 疑难杂症解决指南:常见问题排查与优化
Golang 疑难杂症解决指南:常见问题排查与优化

《Golang 疑难杂症解决指南》聚焦开发过程中常见却棘手的问题,从并发模型、内存管理、性能瓶颈到工程化实践逐步拆解。通过真实案例与调试思路,帮助开发者定位问题根因,建立系统化排查方法。不只给出答案,更强调分析路径与工具使用,让你在复杂 Go 项目中具备持续解决问题的能力。

1

2026.02.24

Golang 入门学习路线:从零基础到上手开发
Golang 入门学习路线:从零基础到上手开发

Golang 入门路线涵盖从零到上手的核心路径:首先打牢基础语法与切片等底层机制;随后攻克 Go 的灵魂——接口设计与 Goroutine 并发模型;接着通过 Gin 框架与 GORM 深入 Web 开发实战;最后在微服务与云原生工具开发中进阶,旨在培养具备高性能并发处理能力的后端工程师。

0

2026.02.24

中国研究生招生信息网官方网站入口 研招网网页版在线入口
中国研究生招生信息网官方网站入口 研招网网页版在线入口

中国研究生招生信息网入口(https://yz.chsi.com.cn) 此网站是研究生报名入口的唯一官方网站

95

2026.02.24

苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法
苹果官网入口与在线访问指南_中国站点快速直达与iPhone查看方法

本专题汇总苹果官网最新可用入口及中国站点访问方式,涵盖官网直达链接、iPhone官方页面查看方法与常见访问说明,帮助用户快速进入苹果官方网站,便捷了解产品信息与官方服务。

14

2026.02.24

Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址
Asianfanfics官网入口与访问指南_AFF官方平台最新登录地址

本专题系统整理Asianfanfics(AFF)官方网站最新可用入口,涵盖官方平台最新直达地址、官网登录方式及中文访问指引,帮助用户快速、安全地进入AFF平台浏览与使用相关内容。

15

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.8万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号