注意:本文中,一些命令包含含有方括号的部分(e.g.git add -p [file_name]
).在这些例子中,您要在该处插入所需的数字,标示符等。而不需要保留方括号。
1.Git自动补全
如果你在命令行中使用Git命令,每次手动输入命令是一件非常烦人的。为了解决这个问题,你可以很方便的开启自动补全功能。
在Unix系统下,运行以下指令来获取脚本:
1
2
|
cd ~
curl https: //raw .github.com /git/git/master/contrib/completion/git-completion . bash -o ~/.git-completion. bash
|
然后,在您的~/.bash_profile
文件中添加以下代码:
1
2
3
|
if [ -f ~/.git-completion. bash ]; then
. ~/.git-completion. bash
fi |
尽管我之前就提到过,在这里我仍要不厌其烦的说:如果你想使用Git提供的全部功能,你肯定是需要转而使用命令行来操作的。
2.在Git中忽略文件
你是否对出现在你Git仓库中的已编译文件(比如.pyc
)感到厌烦?
亦或是你已经对把它们加入Git中这件事感到忍无可忍了?
眼下就有一个可以让Git忽略特定文件或是目录的方法。只需要简单的创建一个.gitignore
文件,然后列出你不想让Git跟踪的文件和目录即可。你可以使用感叹号(!)来指出例外的情况。
1
2
3
4
5
|
*.pyc *.exe my_db_config/ !main.pyc |
3.谁动了我的代码?
出了问题后去责怪别人,是人类的天性。如果你的成品服务器出了问题,你可以非常轻松的把坏人揪出来——只需要使用git blame
命令。
这个命令会显示文件中每一行的作者,最后一次改动后进行的提交(commit)以及该次提交的时间戳。。
1
|
git blame [file_name] |
下图中,你可以看到在一个大型仓库中使用该命令是什么样子的。
4.回顾仓库历史
在之前的教程中,我们了解了git log
命令的用法,然而,它还有三个选项,你应该了解。
-
--oneline
——把每次提交间显示的信息压缩成缩减的hash值和提交信息,在一行显示。 -
--graph
——该选项会在输出界面的左手边用一种基于文本的图形表示法来显示历史。
如果你只是浏览一个单独分支的历史,那么这个功能是没有用的。 -
--all
——显示全部分支的历史
这里是以上命令综合使用的效果。
5.绝不丢失一个提交信息
比方说,你提交了一个你不想要提交的代码,最后你通过使用硬重置(hard reset)使其回到了之前的状态。稍后,你意识到,在这个过程中你丢失了一些其他的信息,并想要退回或是至少能看一眼。git reflog
命令可以帮你做到这一点。
一个简单的git log
命令,显示你最近的提交信息,以及上一次,再上一次的提交信息,以此类推。
而git reflog
显示的是所有head移动的信息。记住,它是在本地的,而不是你仓库的一部分,不会包含在推送(push)和合并中(merge)。
如果我使用git log
,我得到的提交信息是我的仓库的一部分。
然而git reflog
显示了一个提交信息(b1b0ee9
– HEAD@{4}
),这是我使用硬重置(hard reset)时丢失的那个。
6.暂存一个文件的部分改动
通常来讲,创建一个基于特性的提交是一个良好的做法,就是说,每次提交都必须代表一个新特性的产生或者是一个bug的修复。考虑一下,如果你修复了两个bug,或是添加了多个新特性但是却没有提交这些变化会怎样呢?在这种情况下,你可以把这些变化放在一次提交中。但是还有一个更好的方法:把文件分别暂存(Stage)然后分别提交。
比如说,你对一个文件进行了多次修改并且想把他们分别提交。这种情况下,你可以在添加命令(add
)中加上-p
选项
1
|
git add -p [file_name] |
让我们演示一下。我在file_name
文件中添加了3行文字,而且我只想提交第一行和第三行。我们先看一下git diff
显示的结果。
然后,我们看一下,在添加命令(add)中加上-p
选项后会发生什么。
看上去,Git假定所有的改变都是针对同一件事情的,因此它把这些都放在了一个块里。你有如下几个选项:
- 输入
y
来缓存该块 - 输入
n
不缓存该块 - 输入
e
来人工编辑该块 - 输入
d
来退出或进入下一个文件 - 输入
s
来分割这个块
对我们而言,我们肯定希望把它分成几个部分,有选择的添加一部分而忽略其他的。
正如你所看到的,我们添加了第一行和第三行而忽略了第二行。你可以在之后查看仓库状态并进行提交。
7.合并多次提交
当你提交你的代码进行审核并创建一个pull request时(在开源项目中常常发生这样的情况),你经常会在代码被采纳前,要求修改一些代码。你进行了一些修改,而在下一次审核中,又会被要求进行另外的修改。你不知道还有多少次修改等着你,在你知道以前,你进行了多次额外的提交。理想的状态是,你可以使用rebase
命令,把他们都合并成一次提交。
1
|
git rebase -i HEAD~[number_of_commits] |
如果你希望合并最后两次提交,您需要以下命令
1
|
git rebase -i HEAD~2 |
使用该命令,你会进入一个交互式的界面,显示了最后两次提交,并且询问你要压缩哪些。理想状态是你pick
最近的一次提交并把它和之前的提交squash
。
接下来你会被要求为合并后的这次提交填写描述信息。这一个过程实际上重写了你的提交历史。
8.保存尚未提交的改动
比方说你正在解决一个bug或是添加某个新功能,这时你突然被要求展示你的工作。你当前的工作还没有完成到进行提交的地步,而且你在这个阶段也没办法展示你的工作(如果不回退所有变化的话)。在这种情况下,git stash
可以拯救你。stash命令本质上是保存了你全部的改动以供将来使用。保存你的改动,你只需要运行如下命令:
1
|
git stash |
查看暂存列表,你可以运行如下命令:
1
|
git stash list |
如果你不想保存了或是想要恢复这些改动,你使用如下命令:
1
|
git stash apply |
在最后一张截图中,你可以看到,每一次保存都有一个标示符,一个独一无二的数字(尽管我们此处只有一次保存),万一你只想使用某些保存,你需要在apply
命令后指明标示符。
1
|
git stash apply stash@{2} |
9.检查丢失的提交
尽管reflog
是一种查看丢失提交的方法,但是它在大型仓库中行不通。这时就该fsck
(file system check)出场了。
1
|
git fsck --lost-found
|
这里你可以看到丢失的提交,你可以使用git show [commit_hash]
来查看这些提交所包含的改动或者是使用git merge [commit_hash]
来恢复它。git fsck
比reglog
有一个优势。比如你删除了一个远端分支并且克隆了仓库,使用fsck
命令你可以搜索并恢复该远端分支。
10.cherry-pick命令
我把最优雅的Git命令留在了最后。cherry-pick
是我最爱的Git命令,因为它的名字就意味着它的功能!
简而言之,cherry-pick
是指从不同的分支里选择某次提交并且把它合并到当前的分支来。如果你在并行的开发某两个或多个分支,你可能会注意到有一个bug存在于所有的分支中。如果你在一个分支中解决了它,你可以使用cherry-pick来把这次提交合并进其他的分支而不会搞乱其他的文件或是提交。
让我们想象一个可以使用该命令的场景。我有两个分支,并且我想要把b20fd14: Cleaned junk
这次提交使用cherry-pick的方法放入到另一个分支。
我切换到我想要放入该提交的分支,然后运行如下命令:
1
|
git cherry-pick [commit_hash] |
尽管我们本次使用cherry-pick
没什么问题,但是你应该清楚这个命令会带来冲突,请谨慎使用。
小结
说着说着我们就来到了文章的末尾,我认为这些技巧会让你的Git水平更上一层楼。
Git是最棒的,只要你能想得到,它就能做得到。
因此,要经常挑战自己的Git水平。最后你很有可能会学到新的东西。
让你的Git水平更上一层楼的10个小贴士的更多相关文章
-
Python开发的10个小贴士
下面是十个Python中很有用的贴士和技巧.其中一些是初学这门语言常常会犯的错误. 注意:假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5 ...
-
10 个迅速提升你 Git 水平的提示
1. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟. 为了得到这个脚本 ...
-
10 个迅速提升你 Git 水平的提示【转】
转自:https://www.oschina.net/translate/10-tips-git-next-level 最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git ...
-
【转】10 个迅速提升你 Git 水平的提示
最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用 ...
-
10 个迅速提升你 Git 水平的提示(转)
最近我们推出了两个教程:熟悉Git的基本功能和 让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使 ...
-
App适配iPhone 6/ Plus和iOS 8:10条小秘诀
App适配iPhone 6/ Plus和iOS 8:10条小秘诀 iPhone 6iOS 8适配 (原文:raywenderlich 作者:Jack Wu 译者:@TurtleFromMars ...
-
python小练习:使用循环和函数实现一个摇骰子小游戏。游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<;=总值<;=18为“大”,3<;=总值<;=10为“小”。然后告诉玩家猜对或者是猜错的结果。
python小练习:使用循环和函数实现一个摇骰子小游戏.游戏规则如下:游戏开始,首先玩家选择Big or Small(押大小),选择完成后开始摇三个骰子,计算总值,11<=总值<=18为“ ...
-
(译)关于使用Eclipse Memory Analyzer的10点小技巧
作者 Rave_Tian 2016.02.01 17:56* 字数 2988 阅读 520评论 0喜欢 0 分析和理解应用的内存使用情况是开发过程中一项不小的挑战.一个微小的逻辑错误可能会导致监听器没 ...
-
HDU 3791 二叉搜索树 (数据结构与算法实验题 10.2 小明) BST
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3791 中文题不说题意. 建立完二叉搜索树后进行前序遍历或者后序遍历判断是否一样就可以了. 跟这次的作业第 ...
随机推荐
-
android nio
Android开发进阶之NIO非阻塞包(二) 有关Android NIO我们主要分为三大类,ByteBuffer.FileChannel和SocketChannel.由于篇幅原因今天Android12 ...
-
python判断字符串
python判断字符串 s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小 ...
-
Python实现Apriori
Python实现Apriori 运行环境 Pyhton3 计算过程 st=>start: 开始 e=>end: 结束 op1=>operation: 读入数据 op2=>ope ...
-
WinCE5.0中文模拟器SDK(VS2005)的配置
WinCE5.0中文模拟器SDK的安装过程不细说了,一路默认即可,下面主要介绍如何配置,使其能在VS2005中正常使用. 安装完成后,打开VS2005,点击菜单“工具”——“选项”——“设备工具”—— ...
-
js iframe跨域访问
1.什么是跨域? 2.前台解决跨域几种方法 2.1 动态创建script 2.2 使用document.domain 2.3使用HTML5新属性postMessage 2.4 利用iframe和loc ...
-
Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式
相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...
-
spring-data-mongodb 使用原生aggregate语句
除了特殊注释外,本文的测试结果均基于 spring-data-mongodb:1.10.6.RELEASE(spring-boot-starter:1.5.6.RELEASE),MongoDB 3.0 ...
-
winSockets编程(七)WSAAsyncSelect模式
占位## #include <WinSock2.h> #include <Windows.h> #include <StrSafe.h> #pragma comme ...
-
SSM-CRUD实战
前端最容易出现缓存问题,所以以后每次都必须完全在idea加载完后,再在浏览器端多 执行 ctrl+F5 索要最新copy 这样就能拿到最新的改动了,就不会出现各种代码没问题但是功能就是实现不了的问题 ...
-
自动化框架httpClient实例
package com.auto.test.util; import java.net.SocketException;import java.net.SocketTimeoutException;i ...