Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )
在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题。以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分:
- 如何修改 origin 仓库信息
- 如何配置 git ssh keys
- 如何撤销修改
- 遇到冲突了怎么解决
- git stash / alias / submodule 的使用问题等
问:如何修改 origin 仓库信息?
1、添加 origin 仓库信息
git remote add origin <git仓库地址>
2、查看 origin 仓库信息
# 以下三种方式均可
git config get --remote.origin.url
git remote -v
git remote show origin
3、删除 origin 仓库信息
git remote rm origin
问:如何配置 git ssh keys ?
- 在本地生成 ssh 私钥 / 公钥 文件
- 将「公钥」添加到 git 服务(github、gitlab、coding.net 等)网站后台
- 测试 git ssh 连接是否成功
接下来以添加 github ssh keys 为例,请注意替换 github 文件名:
# 运行以下命令,一直回车,文件名可随意指定
ssh-keygen -t rsa -b -C "kaiye@macbook" -f ~/.ssh/github # 如果不是默认密钥 id_rsa ,则需要以下命令注册密钥文件
ssh-add ~/.ssh/github # 将 pub 公钥的内容粘贴到线上网站的后台
cat ~/.ssh/github.pub # 测试 git ssh 是否连接成功
ssh -T git@github.com
问:如何撤销修改?
修改包含四种情况,需单独区分。
1、新建的文件和目录,且从未提交至版本库
此类文件的状态为 Untracked files
,撤销方法如下:
git clean -fd .
其中,.
表示当前目录及所有子目录中的文件,也可以直接指定对应的文件路径,以下其他情况类似。
2、提交过版本库,但未提交至暂存区的文件(未执行 git add)
此类文件的状态为 Changes not staged for commit
,撤销方法:
git checkout .
3、已提交至暂存区的文件
此类文件的状态为 Changes to be committed
,撤销方法:
git reset .
执行之后文件将会回到以上的 1 或者 2 状态,可继续按以上步骤执行撤销,若 git reset 同时加上 --hard
参数,将会把修改过的文件也还原成版本库中的版本。
4、已提交至版本库(执行了 git commit)
每次提交都会生成一个 hash 版本号,通过以下命令可查阅版本号并将其回滚:
git log
git reset <版本号>
如果需要「回滚至上一次提交」,可直接使用以下命令:
git reset head~
执行之后,再按照 1 或者 2 状态进行处理即可,如果回滚之后的代码同时需要提交至 origin 仓库(即回滚 origin 线上仓库的代码),需要使用 -f
强制提交参数,且当前用户需要具备「强制提交的权限」。
5、如果回滚了之后又不想回滚了怎么办?
如果是以上的情况 1 或者 2,只能歇屁了,因为修改没入过版本库,无法回滚。
如果是情况 4,回滚之后通过 git log 将看不到回滚之前的版本号,但可通过 git reflog
命令(所有使用过的版本号)找到回滚之前的版本号,然后 git reset <版本号>
。
问:遇到冲突了怎么解决?
两个分支进行合并时(通常是 git pull 时),可能会遇到冲突,同时被修改的文件会进入 Unmerged
状态,需要解决冲突。
最快的办法
大部分时候,「最快解决冲突」的办法是:使用当前 HEAD 的版本(ours),或使用合并进来的分支版本(theirs)。
# 使用当前分支 HEAD 版本,通常是冲突源文件的 <<<<<<< 标记部分,======= 的上方
git checkout --ours <文件名> # 使用合并分支版本,通常是源冲突文件的 >>>>>>> 标记部分
git checkout --theirs <文件名> # 标记为解决状态加入暂存区
git add <文件名>
最通用的办法
用编辑器打开冲突的源文件进行修改,可能会发生遗留,且体验不好,通常需要借助 git mergetool 命令。
在 Mac 系统下,运行 git mergetool <文件名>
可以开启配置的第三方工具进行 merge,默认的是 FileMerge 应用程序,还可以配置成 Meld 或 kdiff3,体验更佳。
最好的习惯
有三个好的习惯,可以减少代码的冲突:
- 在开始修改代码前先
git pull
一下; - 将业务代码进行划分,尽量不要多个人在同一时间段修改同一文件;
- 通过 Gitflow 工作流 也可以提升 git 流程效率,减少发生冲突的可能性。
最复杂的情况
如果你的项目周期比较长,还应该养成「定期 rebase 的习惯」,git pull --rebase
可以让分支的代码和 origin 仓库的代码保持兼容,同时还不会破坏线上代码的可靠性。
它的大概原理是,先将 origin 仓库的代码按 origin 的时间流在本地分支中提交,再将本地分支的修改记录追加到 origin 分支上。如果发生冲突,则可以即时的发现问题并解决,否则到项目上线时再解决冲突,可能会发生额外的风险。
rebase 大概的操作步骤如下:
# 将当前分支的版本追加到从远程 pull 回来的节点之后
git pull --rebase # 若发生冲突,则按以上其他方法进行解决,解决后继续
git rebase --continue # 直到所有冲突得以解决,待项目最后上线前再执行
git push origin # 若多次提交修改了同一文件,可能需要直接跳过后续提交,按提示操作即可
git rebase --skip
问:如何在不提交修改的前提下,执行 pull / merge 等操作?
有些修改没有完全完成之前,可能不需要提交到版本库,圡方法是将修改的文件 copy 到 git 仓库之外的目录临时存放,pull / merge 操作完成之后,再 copy 回来。
这样的做法一个是效率不高,另外一个可能会遗漏潜在的冲突。此类需求最好是通过 git stash
命令来完成,它可以将当前工作状态(WIP,work in progress)临时存放在 stash 队列中,待操作完成后再从 stash 队列中重新应用这些修改。
以下是 git stash 常用命令:
# 查看 stash 队列中已暂存了多少 WIP
git stash list # 恢复上一次的 WIP 状态,并从队列中移除
git stash pop # 添加当前 WIP,注意:未提交到版本库的文件会自动忽略,只要不运行 git clean -fd . 就不会丢失
git stash # 恢复指定编号的 WIP,同时从队列中移除
git stash pop stash@{num} # 恢复指定编号的 WIP,但不从队列中移除
git stash apply stash@{num}
问:如何在 git log 中查看修改的文件列表?
默认的 git log 会显示较全的信息,且不包含文件列表。使用 --name-status
可以看到修改的文件列表,使用 --oneline
可以将参数简化成一行。
git log --name-status --oneline
每次手动加上参数很麻烦,可以通过自定义快捷命令的方式来简化操作:
git config --global alias.ls 'log --name-status --oneline --graph'
运行以上配置后,可通过 git ls
命令来实现「自定义 git log」效果,通过该方法也可以创建 git st
、 git ci
等一系列命令,以便沿用 svn 命令行习惯。
更多 git log 参数,可通过 git help log
查看手册。
如果是看上一次提交的版本日志,直接运行 git show
即可。
问:git submodule update 时出错怎么解决?
例如,在执行 git submodule update 时有以下错误信息:
fatal: reference is not a tree: f869da471c5d8a185cd110bbe4842d6757b002f5
Unable to checkout 'f869da471c5d8a185cd110bbe4842d6757b002f5' in submodule path 'source/i18n-php-server'
在此例中,发生以上错误是因为 i18n-php-server 子仓库在某电脑 A 的「本地」commit 了新的版本 「f869da471c5d8a185cd110bbe4842d6757b002f5」,且该次 commit 未 push origin。但其父级仓库 i18n-www 中引用了该子仓库的版本号,且将引用记录 push origin,导致其他客户机无法 update 。
解决方法,在电脑 A 上将 i18n-php-server 版本库 push origin 后,在其他客户机上执行 git submodule update 。或者用以上提到的 git reset 方法,将子仓库的引用版本号还原成 origin 上存在的最新版本号。
其他问题
设置本地分支与远程分支保持同步,在第一次 git push 的时候带上
-u
参数即可git push origin master -u
支持中文目录与文件名的显示(git 默认将非 ASCII 编码的目录与文件名以八进制编码展示)
git config core.quotepath off
常用的打 tag 操作,更多请查看《Git 基础 - 打标签》
# 列出所有本地 tag
git tag # 本地新增一个 tag,推送至 origin 服务器
git tag -a v1.0.0 -m 'tag description'
git push origin v1.0.0 # 删除本地与 origin tag
git tag -d v1.0.0
git push origin --delete v1.0.0使用 git GUI 客户端(如,SoureTree、Github Desktop)能极大的提升分支管理效率。分支合并操作通常只有两种情况:从 origin merge 到本地,使用
git pull
即可;从另外一个本地分支 merge 到当前分支,使用git merge <分支名>
,以下是常用命令:# 新建分支 branch1,并切换过去
git checkout -b branch1 # 查看所有本地与远程分支
git branch -a # 修改完成后,切换回 master 分支,将 branch1 分支合并进来
git checkout master
git merge branch1 # 删除已完成合并的分支 branch1
git branch -d branch1
如有其他问题,请在 github 上留言补充 :)
Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )的更多相关文章
- Git 进阶指南
转自: https://github.com/kaiye/kaiye.github.com/issues/7 在掌握了基础的 Git 使用 之后,可能会遇到一些问题.以下是猫哥筛选总结的部分常见问题, ...
- iOS开发零基础教程之生成git所需的SSH keys
在我们github看到了一个不错的第三方库时,可能我们想把他git clone到本地,我们需要复制他的SSH URL,如下图: 复制完地址之后,我们需要打开终端,然后输入命令: git clone + ...
- Git多个SSH KEYS解决方案(含windows自动化、TortoiseGit、SourceTree等)
工作过程中,经常会使用到多个git仓库,每个git仓库对应一个账号,可以理解为每个git仓库对应一个ssh key,因此我们需要管理多个ssh key. 一.快速创建ssh key 1. 创建 ...
- Ubuntu下升级Git以及获取ssh keys的代码
今天开始用的git,记下获取ssh keys 的代码 ? 1 2 3 ssh-keygen -t rsa -C "your_email@example.com" # Enter f ...
- git 生成ssh keys
最近从svn转到gitlab 记录一下如何生成ssh keys 首先下载GitExtensions246SetupComplete.msi并安装,如果已经安装了git,那么安装途中就跳过就行 安装完毕 ...
- git bash push 本地的commit到远程 -- ssh keys设置
1. 检查是否已经创建 ssh keys git bash 下,cd ~/.ssh 如何出现“No such file or directory”,则表示需要创建一个ssh keys. 2. 创建新 ...
- 创建SSH keys用于添加到Git服务器上
SSH keys SSH key 可以让你在你的电脑和Git服务器之间建立安全的加密连接.先执行以下语句来判断是否已经存在本地公钥: cat ~/.ssh/id_rsa.pub 如果你看到一长串以 s ...
- git SSH keys
An SSH key allows you to establish a secure connection between your computer and GitLab. Before gene ...
- git的id_rsa.pub的生成(也就是github上的SSH Keys)
只需要一条语句就可以实现生成id_rsa.pub和id_rsa的目的:ssh-keygen -t rsa -C your_email 注意:这个邮箱是你github上的邮箱.只有在gthub上添加了这 ...
随机推荐
- 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?
引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- .net Elasticsearch 学习入门笔记
一. es安装相关1.elasticsearch安装 运行http://localhost:9200/2.head插件3.bigdesk插件安装(安装细节百度:windows elasticsear ...
- 如何在ASP.Net创建各种3D图表
我们都知道,图表在ASP.NET技术中是一种特别受欢迎而又很重要的工具.图表是表示数据的图形,一般含有X和Y两个坐标轴.我们可以用折线,柱状,块状来表示数据.通过图表控件,我们即能表示数据又能比较各种 ...
- git-2.10.2-64-bit介绍&&git下载&&git安装教程
Git介绍 分布式:Git系统是一个分布式的系统,是用来保存工程源代码历史状态的命令行工具. 保存点:Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目的状态:可以在该保存点将 ...
- 深入理解 JavaScript,以及 Linux 下的开发调试工具
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
- Microsoft Visual Studio 2015 下载、注册、安装过程、功能列表、问题解决
PS:请看看回复.可能会有文章里没有提到的问题.也许会对你有帮助哦~ 先上一张最终的截图吧: VS2015正式版出了,虽然没有Ultimate旗舰版,不过也是好激动的说.哈哈.可能有的小伙伴,由于工作 ...
- 烂泥:redis3.2.3安装与配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前一段时间写过一篇codis集群的文章,写那篇文章主要是因为当时的项目不支持redis自 ...
- 最小生成树(Kruskal算法-边集数组)
以此图为例: package com.datastruct; import java.util.Scanner; public class TestKruskal { private static c ...
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): da.huying.usermanag ...