命令行高效操作Git,看这篇就够了
原文地址:http://blog.jboost.cn/2019/06/16/use-git.html
对于软件开发人员来说,git几乎是每天都需要接触的工具。但对于相处如此亲密的工作伙伴,你对它的了解又有多少,是不是还在傻瓜式地打开一个GUI工具,点击提交按钮,然后“卧槽,又冲突了”,一脸懵逼到不知所措,责怪谁又在你前面提交了,谁又改了你的代码。
博主从一开始接触git,就没用过任何GUI工具,都是通过命令行进行操作,发现这种方式不仅对git的理解更深,效率也更高,遇到问题时一般都知道如何来处理,故做此分享。本文所有知识与操作只涉及日常使用场景,更多详细内容可自行查阅其它资料。本文Git版本为 windows-2.20.1版。
基础理论
git的理论知识,对使用者来说只需要知道它是分布式版本控制系统,了解如下三个概念即可,
- 工作区:就是你直接操作的文件目录与内容
- 暂存区:暂时为你保存还没将内容提交到版本库的一个区域,对应.git目录下的stage或index文件
- 版本库:分本地版本库与远程版本库,本地版本库就理解为对应.git目录即可,远程版本库就是远程仓库,如gitlab或github的repository。
如下图,我们平时提交代码的过程基本都是从工作区add
到暂存区,然后再commit
到本地仓库,最后push
到远程仓库。
基本命令
对于日常工作,掌握如下几个基本命令一般就够了
git status
查看修改状态git pull origin master
拉取远程仓库master分支合并到本地,master根据场景换成其它分支名git add file
添加文件到暂存区,可用 * 添加所有git commit -m "commit message"
提交到本地版本库,并添加注释,注释表明此次修改内容,要清晰准确git push origin master
将本地版本提交到远程仓库的master分支,master根据场景换成其它分支名
对大部分日常工作来说, 上面几个命令基本就够用了。
新建项目
1. 从本地到远程
项目开发的时候,有时候是先在本地建一个项目,再提交到远程仓库的。
- 创建项目目录(或通过IDE创建),命令行cd到项目目录
- 执行
git init
, 将在项目目录创建.git目录 - 执行
git add *
,将所有文件添加到暂存区,这里要先创建一个.gitignore文件,将不需要版本维护的文件添加进去忽略,不然各种IDE编译文件夹,环境相关文件都加到版本库去了。删除文件用git rm file_name
- 执行
git commit -m "upload project"
,提交到本地仓库 - 在gitlab或github上创建一个仓库,并将仓库地址复制下来
- 执行
git remote add origin git@server-name:path/repo-name.git
,关联远程仓库,仓库地址如果是http开头则要用户名密码,如果是git开头,则是走的ssh协议,需要将你本机的ssh公钥添加到远程仓库服务上。 - 执行
git push -u origin master
,推送本地仓库内容到远程仓库
这样在远程仓库目录,就能看到你提交上去的文件内容了。
2. 从远程到本地
更多的时候,是远程仓库已有项目了,需要下载到本地开发。
git clone git@server-name:path/repo-name.git
, 将远程仓库的内容下载到本地,这里仓库地址的处理同上- 修改内容
git add *
,将修改的内容添加到暂存区git commit -m "fix xxx issue"
,提交到本地仓库git push -u origin master
, 推送本地仓库内容至远程仓库
版本回退
有时候改了文件,想反悔怎么办,git给你“后悔药”。
单个文件的还原:
git checkout file_name
,丢弃工作区的修改,还原到上次提交(commit)的版本,git reset HEAD file_name
,把暂存区的修改撤销掉(unstage),重新放回工作区。即还原到上次添加到暂存区(add)的版本
这里涉及几个场景
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout file_name
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时(执行了add,但没执行commit),想丢弃修改,分两步,第一步用命令
git reset HEAD file_name
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次的全部提交,参考下面的整个版本的还原,不过前提是没有推送到远程库。
整个版本的还原:
git reset --hard HEAD^^
, 回退到上上个版本git reset --hard 3628164
, 回退到具体某个版本 3628164 是具体某个commit_id缩写
找不到commit_id?
git reflog
可查看每一个命令的历史记录,获取对应操作的commit_id。git log [--pretty=oneline]
, 可查看commit记录
上一个版本就是HEAD^,上上一个版本就是HEAD^^,往上100个版本写成HEAD~100。3628164 是具体某个commit_id,不需要写全,只需要唯一确定就行,可往前进也可往后退。(git windows2.20.1版貌似不支持对HEAD^的操作)
多人协作
- 首先,可以试图用
git push origin branch_name
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则手动解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
分支管理
平时开发时需要创建子分支来实现你的功能模块,然后再合并到主分支中。
git checkout -b your_branch_name
, 创建并切换分支git branch
, 查看分支,标有*号表示当前所在分支git merge dev
, 合并指定dev分支到当前分支git merge --no-ff -m "merge with no-ff" dev
, 合并分支并生成commit记录git branch -d dev
, 删除分支
git checkout -b dev = git branch dev + git checkout dev
Fast-forward合并,“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。存在冲突的不能fast forward。
git merge --no-ff -m "merge with no-ff" dev
Fast forward模式下,删除分支后,会丢掉分支信息。如果强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
标签管理
当发布版本时,一般需要对当前版本进行标签记录,以便后续进行版本查看或回退。
git tag tag_name
, 对当前分支打标签git tag
, 查看所有标签git tag v0.9 6224937
,针对某个具体commit id打标签git show tag_name
, 查看标签信息git tag -a v0.1 -m "version 0.1 released" 3628164
, 带有说明的标签git tag -d v0.1
, 删除标签git push origin tag_name
, 推送标签到远程git push origin --tags
, 一次性推送所有标签
删除已经推送到远程的标签:
git tag -d v0.9
, 先本地删除git push origin :refs/tags/v0.9
, 然后从远程删除
提高效率的Tips
配置命令别名
git config --global alias.st status # 后面可以用git st 来代替git status了
git config --global alias.ck checkout # 后面可以用 git ck 来代替 git checkout了
git config --global alias.cm 'commit -m' # 后面可以用git cm 来代替 git commit -m 了git pull origin master
或git push origin master
, 可直接git pull
或git push
, 如果出现“no tracking information”的提示,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/master master
建立关联即可。
总结
以上命令虽然看起来多,但平常用的最频繁的应该是“基本命令”与“分支管理”部分,只要多用几次,自然便能记住,应付日常工作完全没有问题,彻底脱离GUI操作,让工作更有效率。
我的个人博客地址:http://blog.jboost.cn
我的头条空间: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112
我的github地址:https://github.com/ronwxy
我的微信公众号:jboost-ksxy
————————————————————————————————————————
欢迎关注我的微信公众号,及时获取最新分享
命令行高效操作Git,看这篇就够了的更多相关文章
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- eos开发(二)使用cleos命令行客户端操作EOS(钱包wallet基础操作)
不知道下边这一段英文你们是不是能看懂,如果看不懂那就算了,我就是转过来随便看看的. 总之你记住nodeos.cleos和keosd这三个工程十分重要就行了,回头咱们的研究都从这三个工程杀进去. EOS ...
- EOS开发基础之二:使用cleos命令行客户端操作EOS(钱包wallet基础操作)
不知道下边这一段英文你们是不是能看懂,如果看不懂那就算了,我就是转过来随便看看的. 总之你记住nodeos.cleos和keosd这三个工程十分重要就行了,回头咱们的研究都从这三个工程杀进去. EOS ...
- [转]Mysql命令行常用操作
Mysql命令行常用操作 一.从命令行登录MySQL数据库服务器 1.登录使用默认3306端口的MySQL /usr/local/mysql/bin/mysql -u root -p 2.通过TCP连 ...
- SLAM+语音机器人DIY系列:(一)Linux基础——3.Linux命令行基础操作
摘要 由于机器人SLAM.自动导航.语音交互这一系列算法都在机器人操作系统ROS中有很好的支持,所以后续的章节中都会使用ROS来组织构建代码:而ROS又是安装在Linux发行版ubuntu系统之上的, ...
- 使用cmd命令行窗口操作SqlServer
本文主要介绍使用windows下的使用cmd命令行窗口操作Sqlserver, 首先我们可以运行 osql ?/ ,这样就把所有可以通过CMD命令行操作sqlserver的命令显示出来 (有图有 ...
- Hadoop HDFS的shell(命令行客户端)操作实例
HDFS的shell(命令行客户端)操作实例 3.2 常用命令参数介绍 -help 功能:输出这个命令参数手册 -ls 功能:显示目录信息 示例: hadoop fs ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...
- redis常用的命令行以及操作
redis常用的命令行以及操作 转载酱紫人的理直气壮 最后发布于2018-07-30 17:00:41 阅读数 805 收藏 转载地址:https://blog.csdn.net/li_lening ...
随机推荐
- 【07】 vue 之 Vue-router
注意: vue-router@2.x 只适用于 Vue 2.x 版本. vue-router@1.x 对应于Vue1.x版本. 的Github地址:vue-router 文档地址 7.2. vue-r ...
- .NET获取URL的各种方式及其区别
原文发布时间为:2009-11-11 -- 来源于本人的百度文章 [由搬家工具导入] http://www.test.com/testweb/default.aspx?id=1 Request.App ...
- hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...
- duilib入门简明教程 -- 第一个程序 Hello World(3) (转)
原文转自 http://www.cnblogs.com/Alberl/p/3343579.html 小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个m ...
- LeetCode总结【转】
转自:http://blog.csdn.net/lanxu_yy/article/details/17848219 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近完成了www.leetco ...
- Linux centos 时间不同步 date 和 hwclock 时间不一致
Linux centos 时间不同步 date 和 hwclock 网站有两台服务器,date 查看差3分钟 在应用 APP倒计时 与 直播,时时性较强的功能应用中 请求服务器后返回的服务器时间与数据 ...
- Educational Codeforces Round 34 B. The Modcrab【模拟/STL】
B. The Modcrab time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- HDU 4870 Rating (高斯消元)
题目链接 2014 多校1 Problem J 题意 现在有两个账号,初始$rating$都为$0$,现在每次打分比较低的那个,如果进前$200$那么就涨$50$分,否则跌$100$分. 每一 ...
- jquery中的数据传输
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- iterator取集合元素
1,完整代码 //创建两个arraylist对象 Collection al = new ArrayList(); //al1添加元素 al.add("name1"); al.ad ...