热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

经常用到的git操作,简单易懂演示一波

虽然现在编辑器或者各种git扩展很好用,并极大的提高了生产力。但是也出现了一些现象:一些工程师对诸如webstorm或者vscode之类的可视化git操

虽然现在编辑器或者各种git扩展很好用,并极大的提高了生产力。但是也出现了一些现象:一些工程师对诸如webstorm或者vscode之类的可视化git操作用得心应手,但对一些其中的git命令的意思却不求甚解。对,说的就是我以前的我。

而且还有个现象,一旦你依赖于编辑器的可视化操作,那么对命令行的操作会出现恐惧的心理,我以前是这样。所以为了改变现状,现在彻底告别可视化操作,拥抱命令行。

说到git的一些操作,常用的诸如:

$ git clone
$ git branch
$ git checkout 分支名
$ git checkout -b 分支名
$ git checkout origin/<远程分支> -b <本地分支>
$ git add
$ git checkout --
$ git reset
$ git commit
$ git push
$ git fetch #并没更改本地仓库的代码&#xff0c;只是拉取了远程commit数据&#xff0c;将远程仓库的commit版本号 更新为最新。分支git log信息不会变
$ git pull #fetch&#43;merge&#xff0c;把远程代码拉到本地并merge&#xff0c;git log信息会更新
$ git merge
$ git rebase
$ git log
$ git rebase -i <提交版本号>
$ git log master..dev #查看 dev 中比 master 中多提交了哪些内容

比如下面我要开发新项目&#xff0c;新项目已经在远程仓库了

  • 首先我拉项目到本地

$ git clone <远程仓库地址># 通常拉下来的是默认分支master&#xff0c;那么想要拉下的是另一个分支的代码的话
$ git clone -b <分支名> <远程仓库地址>

  • 开发阶段&#xff0c;首先要从master上切出一个开发分支

$ git checkout -b <分支名># 我给开发分支起名叫&#xff1a;dev
$ git checkout -b dev
Switched to a new branch &#39;dev&#39;

  • 如果有个同事已经有了个开发分支&#xff0c;让我直接用他的开发分支开发功能

# 使用
$ git checkout origin/<远程分支> -b <本地分支># 他的分支叫&#xff1a;dev1
$ git checkout origin/dev1 -b dev1

  • 此时我想看下本地和远程分别有哪些分支

# 查看本地分支列表,*号所在的那个是当前分支
$ git branchdev
* dev1master# 查看远程分支列表&#xff0c;打印出的列表&#xff0c;红颜色的代表远程分支
$ git branch -a

  • 我新增了一个“git-test.js”文件、改了一个"index.html"文件

# 输入git status查看状态
$ git status
On branch dev1
Changes not staged for commit:(use "git add ..." to update what will be committed)(use "git checkout -- ..." to discard changes in working directory)modified: index.htmlUntracked files:(use "git add ..." to include in what will be committed)git-test.jsno changes added to commit (use "git add" and/or "git commit -a")# 打印出的信息表示&#xff0c;index.html 文件<修改的部分>还未添加到git暂存区。
# Untracked files表示&#xff1a;新增的 git-test.js 文件还未被跟踪

  • 我想了一下&#xff0c;决定不对 index.html 做更改了&#xff0c;想一下子把它返回到未更改状态

$ git checkout -- index.html# 如果想将多个文件撤销呢&#xff0c;文件名用一个“.”代替
$ git checkout -- .

  • 现在我将未跟踪的 git-test.js 文件加到git 暂存区

# 此处的“.”&#xff0c;和上面的“.”作用一样&#xff0c;代表多个文件
$ git add .# 现在查看下状态
$ git status
On branch dev1
Changes to be committed:(use "git reset HEAD ..." to unstage)new file: git-test.js# 然后我又想将刚加到暂存区的git-test.js移出暂存区&#xff08;我是不是傻&#xff09;
$ git reset HEAD git-test.js
$ git status
On branch dev1
Untracked files:(use "git add ..." to include in what will be committed)git-test.js

  • 现在git-test.js又被加到了暂存区&#xff0c;并且要提交了

$ git commit -m "add git-test.js"
[dev1 5198153] add git-test.js1 file changed, 0 insertions(&#43;), 0 deletions(-)create mode 100644 git-test.js# 现在看下git log
$ git log
commit 51981532d54b62811d8afb9b2493cb3320752eae
Author: xxx
Date: Wed Jul 11 18:04:00 2018 &#43;0800add git-test.js

  • 此时我又对index.html文件做了更改

# 将更改后的index.html加到暂存区
$ git add index.html# 提交,但是我想将这次的提交和上次的提交合并
$ git commit --amend# 打印出以下信息&#xff0c;这是vim编辑窗口
add git-test.js
# Please enter the commit message for your changes. Lines starting
# with &#39;#&#39; will be ignored, and an empty message aborts the commit.
#
# Date: Wed Jul 11 18:04:00 2018 &#43;0800
#
# On branch dev1
# Changes to be committed:
# modified: index.html
# new file: git-test.js
#
~
~# 按shift&#43;:,输入q&#xff0c;退出编辑
[dev1 3da072a] add git-test.jsDate: Wed Jul 11 18:04:00 2018 &#43;08002 files changed, 1 insertion(&#43;)create mode 100644 git-test.js

有时候我们提交了好几个commit,但是想要回到某次的提交

# 回退到上一个版本
$ git reset --hard HEAD^# 回退到往上 n 个版本
$ git reset --hard HEAD~n# 回退到某个版本号的版本
$ git reset --hard <版本号>

好了&#xff0c;开发一段时间了&#xff0c;今天要把master分支给合并过来

$ git merge master
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.# 打印出来的信息说&#xff1a;修复冲突&#xff0c;然后提交结果# 看下git状态
$ git status
On branch dev1
You have unmerged paths.(fix conflicts and run "git commit")Unmerged paths:(use "git add ..." to xxx resolution)both modified: index.html# 修复冲突后
$ git add index.html
$ git commit -m "merge master"$ git log
commit 3030e65c149442a26649fb5e6a2bdb89c976cbc8
Merge: 3da072a 78363ff
Author: zhangqinmiao <564777189&#64;qq.com>
Date: Wed Jul 11 18:47:27 2018 &#43;0800merge mastercommit 78363ff222bc847076bbc96e26f56b04b58ad19d
Author: xxx
Date: Wed Jul 11 18:34:55 2018 &#43;0800update index.htmlcommit 3da072aee0eacf7a8315c3ead1ead88bb0fcf3ed
Author: xxx
Date: Wed Jul 11 18:04:00 2018 &#43;0800add git-test.js##########################################
# 如果在合并状态下&#xff0c;不想合并分支了的话
$ git merge --abort

有人说了&#xff0c;我合并用rebasbe呢&#xff0c;和merge有何不同

# 我们切到master分支&#xff0c;看下log
$ git checkout master
Switched to branch &#39;master&#39;$ git log
commit c5d5bd4046c6c8fb75addfad49e5c396f53f9da1
Author: xxx
Date: Wed Jul 11 18:52:46 2018 &#43;0800update 0711commit 78363ff222bc847076bbc96e26f56b04b58ad19d
Author: xxx
Date: Wed Jul 11 18:34:55 2018 &#43;0800update index.htmlcommit 784f9f65951386344e5073652a88d70a2276f35e
Author: xxx
Date: Wed Jul 11 11:21:13 2018 &#43;0800################################################
# 上面打印出的log&#xff0c;显示是最近三次的master分支的提交# 下面我们看下dev1分支的log
$ git checkout dev1
$ git log
commit 3da072aee0eacf7a8315c3ead1ead88bb0fcf3ed
Author: xxx
Date: Wed Jul 11 18:04:00 2018 &#43;0800add git-test.js
################################################ # 当dev1分支rebase master分支后
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: add git-test.js$ git log
commit b5e1b59c1adb19e6e49e937364f5d00b23942324
Author: xxx
Date: Wed Jul 11 18:04:00 2018 &#43;0800add git-test.jscommit c5d5bd4046c6c8fb75addfad49e5c396f53f9da1
Author: xxx
Date: Wed Jul 11 18:52:46 2018 &#43;0800update 0711commit 78363ff222bc847076bbc96e26f56b04b58ad19d
Author: xxx
Date: Wed Jul 11 18:34:55 2018 &#43;0800update index.html

注意&#xff1a; 虽然“update 0711”这次提交的时间比“add git-test.js”这次提交的时间晚&#xff0c;一个18:52:46&#xff0c;一个18:04:00。这是因为rebase master是以master分支作为基础&#xff0c;然后合并就以master的提交记录开始依序开始。详细介绍

如果你想合并多个commit

# 看下本分支的log
$ git log
commit b5e1b59c1adb19e6e49e937364f5d00b23942324
Author: xxx
Date: Wed Jul 11 18:04:00 2018 &#43;0800add git-test.jscommit c5d5bd4046c6c8fb75addfad49e5c396f53f9da1
Author: xxx
Date: Wed Jul 11 18:52:46 2018 &#43;0800update 0711commit 78363ff222bc847076bbc96e26f56b04b58ad19d
Author: xxx
Date: Wed Jul 11 18:34:55 2018 &#43;0800update index.html

  • 复制“update index.html”这次提交的版本号&#xff0c;到下面的 -i 后面

$ git rebase -i 78363ff222bc847076bbc96e26f56b04b58ad19d

  • 打印出以下vim编辑信息

pick c5d5bd4 update 0711
pick b5e1b59 add git-test.js# Rebase 78363ff..b5e1b59 onto 78363ff (2 command(s))
#
# Commands:
# p, pick &#61; use commit
# r, reword &#61; use commit, but edit the commit message
# e, edit &#61; use commit, but stop for amending
# s, squash &#61; use commit, but meld into previous commit
# f, fixup &#61; like "squash", but discard this commit&#39;s log message
# x, exec &#61; run command (the rest of the line) using shell
# d, drop &#61; remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.

前两行前面的pick&#xff0c;在Commands下面有解释&#xff0c;如下我将前两行改为以下形式&#xff1a;

pick c5d5bd4 update 0711
s b5e1b59 add git-test.js

上面修改的意思是&#xff1a;使用b5e1b59这个的提交&#xff0c;但是合并到之前的提交。

  • 修改完成后&#xff0c;保存。然后有打印出以下vim编辑信息

# This is a combination of 2 commits.
# The first commit&#39;s message is:update 0711# This is the 2nd commit message:add git-test.js# Please enter the commit message for your changes. Lines starting
# with &#39;#&#39; will be ignored, and an empty message aborts the commit.
#
# Date: Wed Jul 11 18:52:46 2018 &#43;0800
#
# interactive rebase in progress; onto 78363ff
# Last commands done (2 commands done):
# pick c5d5bd4 update 0711

  • 此时你可以修改信息为以下形式

rebase -i test
# Please enter the commit message for your changes. Lines starting
# with &#39;#&#39; will be ignored, and an empty message aborts the commit.
#
# Date: Wed Jul 11 18:52:46 2018 &#43;0800
#
# interactive rebase in progress; onto 78363ff
# Last commands done (2 commands done):
# pick c5d5bd4 update 0711

  • 保存后&#xff0c;打印出以下信息。提示成功

[detached HEAD 747712c] rebase -i testDate: Wed Jul 11 18:52:46 2018 &#43;08003 files changed, 218 insertions(&#43;), 4 deletions(-)create mode 100644 git-test.js
Successfully rebased and updated refs/heads/dev1.# 查看下log
$ git log
commit 747712c3b99e734d85defcacdc0a1d4610c6d9af
Author: xxx
Date: Wed Jul 11 18:52:46 2018 &#43;0800rebase -i testcommit 78363ff222bc847076bbc96e26f56b04b58ad19d
Author: xxx
Date: Wed Jul 11 18:34:55 2018 &#43;0800update index.html

转:https://juejin.im/post/5c85d820e51d45747674e593



推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • scrapy 采集入为库 mysql 数据库,只更新一个字段 提示这个语法错误?
    就是查询有没有这个字,如果查到这个字就更新这个字的bsmc字段表是news_topic插入代码如下: ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
  • 先记住几个专用名词,如下:Workspace:工作区IndexStage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库一、新建代码库#在当前目录新建一个G ... [详细]
author-avatar
手机用户2602882697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有