Git 命令行其实真的很好用
使用命令行操作git,我觉得是最简单、最直接的方式,最开始使用git的时候特别喜欢这种方式。后来,就不再使用命令行,而是选择了其他可视化的工具,如idea自带的插件、sourceTree、TortoiseGit、GitKraken。发生的转变的原因很现实,同事说我很装逼(整得我很不好意思,不就命令敲得比较溜嘛,就这么埋汰我),另外就是特别容易忘记命令,没有可视化界面那么直观。但是我仍然认为,要想掌握好git的使用,应该先从命令行入手,因为可视化工具的本质,依然是命令行的包装,掌握好命令行,有助于加深理解每一步命令操作的变化,然后再转向各种可视化工具就像如鱼得水般简单了。
关于git的命令行操作,主要包括有仓库操作、日常基本操作、分支操作、标签操作、冲突解决。
1. 仓库操作
在git中所谓的仓库,就是存储代码的地方,即磁盘下的目录。因为目录的位置不同,又分为本地仓库和远程仓库。本地仓库,就是自己本地存储代码的根目录以及子目录。远程仓库,就是在服务端存储代码的一个目录。仓库的操作命令主要包括新建仓库、检出仓库、添加远程仓库、查看远程仓库、删除远程仓库、拉取远程仓库、推送远程仓库。
1.1 新建仓库
主要用于工程的初始化的时候。在磁盘中新建一个工程目录,然后在工程根目录下执行下面的命令,然后本地仓库就建好了。
git init
1.2 检出仓库
新入职的同事,一般都会给分配一个git账号和工程的git地址,然后在本地磁选择一个合适的目录,执行下列表命令,就可以把远程仓库的代码检出到本地了。此时,本地仓库和远程仓库默认是处于关联状态的。
git clone https://gitee.com/gaoxing27/git-study.git
1.3 查看远程仓库
新建的本地仓库根目录下执行下列命令,执行结果是空的,说明此时本地仓库没有关联到远程仓库。
git remote -v
如果本地仓库与远程仓库已关联,执行结果是这样的。
1.4 添加远程仓库
在项目搭建最开始的时候,在本地新建一个本地仓库,另外需要在服务端新建一个远程仓库,此时远程仓库与本地仓库没有关联关系,本地仓库的代码文件无法推送到远程仓库,远程仓库的代码文件也无法拉取到本地,需要添加远程仓库与本地仓库的关联关系,命令如下:
git remote add origin https://gitee.com/gaoxing27/git-study.git
origin是远程仓库的名称,可以随便取,后面的url是远程仓库的http地址。
1.5 删除远程仓库
删除远程仓库即切断本地仓库与远程仓库的关联关系,平时极少用到,具体命令如下:
git remote rm origin
1.6 拉取远程仓库
每次在开始修改文件或提交文件时,先从远程仓库拉取代码,确保本地仓库的代码是最新版本的,命令如下:
git pull origin dev
origin是远程仓库的名称,dev是拉取代码所在的分支名称。
1.7 推送远程仓库
完成开发任务后,代码提交到了本地仓库,需要推送代码到远程仓库,命令如下:
git push origin master
origin 是远程仓库的名称,master是主分支的分支名称,这里也可以是其他分支名称。
2. 基本操作
2.1 查看状态
查看文件的状态,这里我新增了一个文件,并修改了一个文件的内容,然后执行下面命令:
git status
从执行结果来看,新增的example2.txt文件处于未受控状态(untracked files),example.txt文件被修改了(modified)。
2.2 查看变更内容
在上面我修改了example.txt的内容,执行下面的命令可以知道变更前后内容对比,需要注意的是这个命令只能比较未add到暂存区的文件。
git diff example.txt
从执行结果可以看到,执行后比执行前多了一行“add one line”
2.3 添加文件
修改或新增一个文件后,执行下面命令添加文件到暂存区:
#添加指定文件到暂存区
git add example2.txt
#添加工作区所有变更的文件到暂存区
git add .
2.4 提交文件
执行下面命令,提交暂存区的所有文件到本地仓库,
git commit -m ‘xxxx’
xxxx部分需要写上这次提交内容的描述
2.5 推送文件
执行下面命令,把提交到本地仓库的代码文件推送到远程仓库
git push origin master
2.6 查看版本历史记录
每次commit都会形成一个版本,一段经过计算生成的字符串作为版本号标识这次提交,执行下面命令可以查看版本的历史记录
git log
2.7 撤销代码
2.7.1 未add文件的撤销
git checkout hello.txt
2.7.2 已add文件的撤销
对于已经add到暂存区的文件,要恢复到未修改前的版本,需要两步,命令如下:
#撤销add的操作,但是会保留已编辑的内容
git reset HEAD hello.java
#撤销已编辑的内容,恢复到未修改前的状态
git checkout hello.java
2.7.3 对已commit文件的撤销:
文件被commit到本地仓库后会产生一个版本号,通过查看版本历史记录命令git log可以得到,然后执行下面命令撤销已提交的文件
git reset --hard xxxxx
"xxxxx"是要撤销到指定版本的版本号。关于git reset命令的参数mixed、soft、hard这里需要特别说明一下:
–mixed 默认是这种,代表撤销git add和git commit的操作,保留编辑器的代码;
–soft代表撤销git commit,不撤销git add操作,同时保留编辑器的代码;
–hard参数很暴力,直接撤销commit和add的操作,撤销所有改动的代码,当你决定用–hard参数的时候,就代表着你应该已经决定了放弃修改过的所有代码。
2.7.4 已push操作的撤销:
对于一不小心把不想推送的代码推送到了远程仓库,撤销分为两步,第一步,把本地仓库的文件撤销到指定版本;第二步用本撤销后的文件push到远程仓库,命令如下
#本地代码撤销到指定的版本
git reset --hard xxxxx
#把已撤销的本地操作强制推送到远程仓库,把一不小心push到远程仓库的操作撤销
git push --force origin master
使用git reset这种方式,撤销操作在本地、远程仓库都不会留下记录,也就是你不说,很难发现你推送错了代码然后又悄悄撤销了。另外还有一种方式git revert,如下:
#回退到指定版本
git revert xxxxx
#手动合并代码,保留下撤销前的内容,然后再正常的add、commit、push
git add hello.txt
git commit -m '撤销错误提交的内容'
git push origin master
xxxxx回退到指定版本的版本号。与git reset不同的是,revert之前的提交记录会保留,revert会再生成一次新的commit来撤销之前的psuh的内容,简单理解就是本地仓库的代码先撤销,然后把一不小心不想push的内容删除,再次提交。git reset --hard比较狠,不留痕迹,全部回退到指定版本。如果当前版本与回退版本之间,除了自己提交的版本,还有其他人提交的版本,那么其他人提交的版本也会悄无声息被你干掉,项目组里如果经常有人莫明其妙的叫嚷:为什么我的代码莫明其妙被合丢了,大概率是有人这么干了,所以git reset --hard极度危险,当慎用呀,推荐使用git revert,一切都有记录,一切都掌控之中。
2.8 撤销代码后悔了
如果撤销完,又后悔了,想向前再恢复回去,但是找不到之前的版本历史记录了,下面的命令可以查询到回退到指定版本后往前几次的版本历史记录。找到向前的版本历史记录后,再向前回退和向后回退是一样的,回退和提交的过程实际就像一个指针,向前或向后的移动,head通常就是这个指针,指向当前版本。
git reflog
3. 分支操作
之前的所有操作都是在master分支,也就是主分支上进行的,分支操作的命令主要是用于创建分支、切换分支、查看分支、合并分支这些操作。
3.1 创建分支
3.1.1 创建本地分支
#创建本地分支,但是不会切换到创建分支上,dev是分支的名称
git branch dev
#创建本地分支,并切换到创建的分支上,dev2是分支的名称; 如果分支已创建,则切换到分支上
git checkout -b dev2
3.1.2 创建远程分支
创建远程分支需要先在本仓库创建本地分支,然后推送到远程仓库,远程的分支就创建好了
git push origin dev
3.2 查看分支
3.2.1 查看所有分支:
git branch -a
3.2.2 查看远程所有分支
git branch -r
3.2.3 查看本地所有分支
git branch
3.3 切换分支
git checkout dev2
3.4 合并分支
把另一个分支上的内容与当前分支进行合并,合并后会生成一次合并的提交记录。
#当前分支是dev2,合并dev分支内容到dev2
git merge dev
#推送合并后dev2分支内容到远程仓库
git push origin dev2
3.5 删除分支
#删除本地分支
git branch -d dev
#删除远程分支,origin为远程仓库名称,dev为远程分支名称
git push origin :dev
4. 标签操作
打个比方说一下什么是标签,每一次的代码提交,都会生成一个版本号,每个版本号之间连接起来就会形成一条线,只要不断有新提交生成,这条线就会一直延伸下去,打一个标签(tag)好比在这条线作了一个标记。这个标记有什么用呢?项目在迭代开发的时候,每开发完一个版本,就在分支上打一个tag,然后运维组依据这个tag发布测试环境、灰度环境,由测试组进行测试验证,开发组继续在原来的分支上进行迭代开发,提交内容,彼此之间不受影响。
4.1 查看标签
git tag
4.2 创建标签
#在本地打一个标签
git tag dev_20221116_v1
#推送标签到远程仓库
git push origin dev_20221116_v1
4.3 删除标签
#删除本地仓库上的标签
git tag -d dev_20221116_v1
#删除远程仓库上的标签
git push origin :dev_20221116_v1
4.4 查看远程标签
git log
5 冲突解决
5.1 冲突原因
代码冲突其实很容易理解,没有那么麻烦,简单来说就是同一个文件的同一个位置都修改了,且内容不同,会产生冲突。举一个例了,在文件a第十行,你添加了一个“.”,另外一个同事在文件a的第十行添加了一个“#”,并且早于你提交远程仓库,你再提交的时候,就会发生冲突。这里需要注意的是,所谓的同一个位置可能是一行代码、也可能是几行。
5.2 合并冲突
远程仓库文件的内容
下面就是发生冲突的文件内容,head是指向当前版本,即本地仓库当前版本小强在文件的第2行提交了“小强提交了edf”,“=======”后面的内容是远程仓库的相同位置的内容。
解决冲突很简单,假如经过确认两次提交都需要保留,那么手工合并冲突,保留两次提交内容,然后再提交推送到远程仓库即可。
理解冲突的原因后,解决冲突的过程无非需要多加小心一些,要确认清楚冲突的部分哪些是需要保留,哪些不需要保留,然后根据实际情况正常合并处理即可。
Git 命令行其实真的很好用相关推荐
- 关于使用 git 命令行来和“码云”账号上的项目互通过程的基础步骤
前提:已经有码云账号,电脑已经安装了git工具. (1)在码云账号上登陆自己的账号,创建一个新的项目. (2)在自己的本地磁盘下随便创建一个文件夹(例如起名为:mayun),用来存放从码云上拉下来的项 ...
- Git命令行介绍和使用说明(持续更新)
Git命令行介绍和使用说明(持续更新) Git命令行介绍和使用说明(持续更新) 文档名称 Git命令行介绍和使用说明会 创建时间 2012/8/23 修改时间 2012/8/23 创建人 Baifx ...
- 如何用git命令行上传本地代码到github
如何用git命令行上传本地代码到github 2016年09月19日 16:10:36 阅读数:9337 注意:安装的前提条件是配置好git的相关环境或者安装好git.exe,此处不再重点提及 上传的 ...
- git命令行完全解读
BY 张建成(prettyEcho@github) 除非另行注明,页面上所有内容采用知识共享-署名(CC BY 2.5 AU)协议共享 原文地址deep.js , 欢迎 评论 和 star ?? 欢迎 ...
- 【重要】使用Git命令行上传到GitHub上
[本人GitHub账号:] 用户名:chenhongshuang 密码:shuangshuang6300 邮箱:2452420371@qq.com 进入GitHub账号后 1·新建项目文件名称例dem ...
- 如何使用git命令行上传项目到github
参考文献: 如何使用git命令行上传项目到github 感谢楼主分享!
- linux tig不支持中文,tig — 让 git 命令行可视化
tig 是一款优化 git 命令行的工具,使 git 命令行更加的便捷人性化 .如果用习惯了,会上瘾. image 基础 安装 在 Mac 上最简单的方式是使用 Homebrew: brew inst ...
- gitBash快速清屏,git命令行操作,快速清屏,清屏
## ** gitBash快速清屏,git命令行操作,快速清屏,清屏 ** 快捷键 点赞去啊!!!!!!!!!!!!!
- zbb20190109 git命令行解决冲突文件步骤
git命令行解决冲突文件步骤 方法一(推荐使用): git pull 出现冲突后丢弃本地冲突文件修改,采用远程文件覆盖本地文件 git checkout [文件路径] 例:git checkout ...
- 使用Git命令行推送代码到远程仓库,阿里云效Codeup代码管理平台
项目提交暂存.提交本地仓库.拉取.推送: [本步骤是新项目流程]请自行根据自有项目分辨是否需要跳过前两步. 右键点击项目根文件夹,选中Git Bash Here,打开命令行. (1)初始化项目命令: ...
最新文章
- LSM 优化系列(二)-- dCompaction: Speeding up Compaction of the LSM-Tree via Delayed Compaction
- 7.0系统设备xposed框架激活经验
- uniapp禁止遮罩层下的页面滚动
- 2021暑假每日一题 【week5 完结】
- Map.putAll方法——追加另一个Map对象到当前Map集合
- 一起啃PRML - 1.2.2 Expectations and covariances 期望和协方差
- Basic Oracle Net Services Client-Side Configuration
- iPhone、iPad明年或采用USB-C接口;虎牙回应央视点名网课内容充斥广告;Rust 1.44.0 发布| 极客头条...
- linux进程fd数量,linux – 文件描述符的数量:/ proc / sys / fs / file-nr和/ proc / $pid / fd之间有什么不同?...
- python pdb查看变量值_如何用pdb进行python调试
- Oracle数据库学习心得(一)
- 文档——软件需求说明书
- 唐诗赏析html网页制作,【毕业论文】古诗词鉴赏网站的设计与实现.doc
- 找到解决办法了,特回来写总结,the import cannot be resolved问题可以通过以下方法解决
- STM32F103_study57_The punctual atoms(STM32 Port multiplexing and remapping configuration)
- 智牛股_第6章_Mybatis Generator代码生成器
- AV1编码器优化技术
- 黑马程序员——java语言基础部分——网络编程
- 责任链模式-C++实现
- 记录一下Vue中的created函数所踩到的坑(回调函数不立即生效)
热门文章
- java根据书签添加内容_Java PDF书签——添加、编辑、删除、读取书签
- 传音控股前三季度研发投入稳步增加 “剑”指全球新兴市场技术变革新机遇
- SpringBoot整体开发的详细过程(待完结)
- 高数_第3章重积分__二重积分_怎样交换积分次序
- Android 12没显示出app的微件问题
- 矩阵的分解:满秩分解和奇异值分解
- U8 ActiveX 部件不能创建对象
- 蓝凌OA SSRF+JNDI远程命令执行
- MFC--按键、按钮按下和弹起事件检测
- OSChina 周一乱弹 —— 妮儿还是把上衣穿上吧