文档章节

你需要知道的12个Git高级命令

一零贰IV
 一零贰IV
发布于 2017/07/25 17:47
字数 2134
阅读 28
收藏 1
点赞 0
评论 0

众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈。学习Git,首先当然是学习Git的基本工作流。相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生的强大工具。使用Git时常用的命令有pull、commit、push等,貌似很简单。不过,有时你会遇到合并冲突的情况,Git这时会将冲突标记出来,需要你手工来解决。有时,你会不小心将代码提交到错误的分支上,并且又推送到了远程仓库。还有些时候,你需要切换到不同的分支,但Git却不让你这么做,因为还有未保存的修改。如果需要通过另一个分支的提交来为代码打补丁该怎么做呢?本文就将介绍12个Git高级命令,合理使用这些命令可以大大提升应用Git的效率。

1. 使用rebase而非merge来拉取上游修改

分支合并会被记录为一次合并提交,这种做法是很有意义的。比如说,可以通过这种方式来标识一个新特性被合并到了发布分支中。不过,当多个团队成员工作在一个项目中并使用常规的git pull来同步分支时,提交时间线就会被不必要的合并提交所污染。更好的做法则是使用git rebase将一个feature分支变基到master分支:

$ git checkout feature
$ git rebase master

这么做会将整个feature分支移动到master分支的起点,它会合并master分支上所有新的提交。不过,相比于使用合并提交来说,变基会通过在原来的分支中为每次提交创建全新提交来重写项目历史。变基的主要好处在于你会得到一个更加整洁的项目历史。此外,这里还有关于变基的陷阱的一些讨论。

2. 在执行git rebase后解决合并冲突

正如能力越大责任就越大一样。在执行git rebase时,你可能会遇到合并冲突的情况。合并冲突表示两个提交修改了同一个文件的同一行,Git不知道该应用哪一个修改。这会导致如下所示的错误消息:

Git会为你提供3个选择来修复导致冲突的提交(fa39187):

  • 可以运行git rebase –abort来完全取消变基。这么做会取消变基修改,并将分支置回到执行git rebase之前的状态。
  • 可以运行git rebase –skip来完全忽略该提交。这样,有问题的提交所引入的变化就不会被添加到历史中。
  • 可以使用与合并冲突相同的标准步骤来解决冲突。

3. 临时性保存修改

在工作进行中时,有些东西常常会处于凌乱的状态。如果这时需要切换到不同的分支该怎么办呢?Git是不允许你这么做的,因为还有尚未保存的修改。坦率地说,你并不想将半成品提交上去,后面再来修改。这个问题的解决之道就是使用git stash命令。Stash会接收工作目录的当前状态(比如说,修改了的追踪文件与暂存区的修改等),并将其保存到未完成的修改栈中,这样后面随时可以再来修改。可以通过如下命令来暂存你的工作:

$ git stash
Saved working directory and index state WIP on feature: 3fc175f fix race condition
HEAD is now at 3fc175f fix race condition

现在,工作目录就是干净的了:

$ git status
# On branch feature
nothing to commit, working directory clean

这时就可以安全地切换分支做别的事情了。不过不必担心,暂存的提交依旧还在:

$ git stash list
stash@{0}: WIP on feature: 3fc175f fix race condition

稍后,在回到feature分支后,你就可以取回所有暂存的变更了:

$ git stash pop
On branch feature
Changes not staged for commit:
  (use "git add ..." to update what will be committed)

     modified:   index.html
Dropped refs/stash@{0} (ac2321cc3a33ba712b8e50c99a99d3c20da9d6b8)

关于暂存,还有其他一些选项可用,如下所示:

$ git stash save "describe it"   # give the stash a name
$ git stash clear                # delete a stashed commit
$ git stash save --keep-index    # stash only unstaged files

4. 克隆一个特定的远程分支

如果想要从远程仓库中克隆一个特定的分支该怎么做呢?通常你会使用git clone,不过这么做会将所有其他分支都一并克隆下来。一个便捷的方式是使用git remote add:

$ git init  
$ git remote add -t  -f origin 
$ git checkout

5. 将cherry-pick远程提交合并到自己的分支中

更有甚者,如果只想将远程仓库的一个特定提交合并到自己的分支中该怎么做呢?可以使用git cherry-pick 来选择给定SHA值的提交,然后将其合并到当前分支中:

$ git cherry-pick

6. 应用来自于不相关的本地仓库的补丁

如果需要将另一个不相关的本地仓库的提交补丁应用到当前仓库该怎么做呢?答案就是下面这条命令:

$ git --git-dir=/.git format-patch -k -1 --stdout  | git am -3 -k

7. 忽略追踪文件中的变更

如果你和你的同事操纵的是相同分支,那么很有可能需要频繁执行git merge或是git rebase。不过,这么做可能会重置一些与环境相关的配置文件,这样在每次合并后都需要修改。与之相反,你可以通过如下命令永久性地告诉Git不要管某个本地文件:

$ git update-index --assume-unchanged

8. 每隔X秒运行一次git pull

通常,合并冲突出现的原因在于你正在工作的本地仓库不再反映远程仓库的当前状态。这正是我们为什么每天早晨要首先执行一次git pull的缘故。此外,你还可以在后台通过脚本(或是使用GNU Screen)每隔X秒调用一次git pull:

$ screen
$ for((i=1;i<=10000;i+=1)); do sleep X && git pull; done

9. 将子目录分隔为新的仓库

有时,你可能需要将Git仓库中某个特定的目录转换为一个全新的仓库。这可以通过git filter-branch来实现:

$ git filter-branch --prune-empty --subdirectory-filter  master
# Filter the master branch to your directory and remove empty commits
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (89/89)
Ref 'refs/heads/master' was rewritten

现在,仓库会包含指定子目录中的所有文件。虽然之前的所有文件都会被删除,但他们依旧存在于Git历史中。现在可以将新的本地仓库推送到远程了。

10. 清理

有时,Git会提示“untracked working tree files”会“overwritten by checkout”。造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生:

$ git clean -f     # remove untracked files
$ git clean -fd    # remove untracked files/directories
$ git clean -nfd   # list all files/directories that would be removed

11. 将项目文件打成tar包,并且排除.git目录

有时,你需要将项目副本提供给无法访问GitHub仓库的外部成员。最简单的方式就是使用tar或zip来打包所有的项目文件。不过,如果不小心,隐藏的.git目录就会包含到tar文件中,这会导致文件体积变大;同时,如果里面的文件与接收者自己的Git仓库弄混了,那就更加令人头疼了。轻松的做法则是自动从tar文件中排除掉.git目录:

$ tar cJf .tar.xz / --exclude-vcs

12. 查找修改者

最后,如果出现混乱的情况,你一定想要找出是谁造成的。如果生产服务器宕机,那么找到罪魁祸首是比较容易的事情:只需执行git blame。该命令会显示出文件中每一行的作者,提交hash则会找出该行的上一次修改,还能看到提交的时间戳:

$ git blame

当然,Git命令是非常多的,除了上面介绍的12个重要命令外,相信各位InfoQ读者在日常工作过程中也有自己偏爱且好用的一些命令,不妨以评论的形式与其他读者一同分享。

© 著作权归作者所有

共有 人打赏支持
一零贰IV
粉丝 16
博文 97
码字总数 48362
作品 0
武汉
程序员
Git 学习看这篇就够了!

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 可能新手会问“git和github有什么关系啊?” git是一个版本控制工具; github是一个用git做版本控...

Michaelyn ⋅ 2016/12/26 ⋅ 0

你需要知道的 12 个 Git 高级命令

众所周知,Git目前已经是分布式版本控制领域的翘楚,围绕着Git形成了完整的生态圈。学习Git,首先当然是学习Git的基本工作流。相比于SVN等传统版本控制系统来说,Git是专为分布式版本控制而生...

oschina ⋅ 2016/01/31 ⋅ 18

Android Studio Terminal 不是内部或外部命令,也不是可运行程序或批处理文件

版权声明:本文为博主原创文章,未经我的允许不得转载! 转载请标明出处: http://blog.csdn.net/guiying712/article/details/53129961 ,本文出自:【张华洋的博客】 Android Studio Termina...

guiying712 ⋅ 2016/11/11 ⋅ 0

git命令入门

基本了解 git命令是一些命令行工具的集合,它可以用来跟踪,记录文件的变动。比如你可以进行保存,比对,分析,合并等等。这个过程被称之为版本控制。已经有一系列的版本控制系统,比如SVN, ...

天机 ⋅ 2016/06/29 ⋅ 0

Git学习笔记一--创建版本库、添加文件、提交文件等

其实,很多人都不care谁写了Git,只在乎它是免费而且好用的!So do I! 下面开始我们的学习:   1.Git安装(略)。   2.创建版本库   首先,选择一个合适的地方(我选择了D盘,我的电脑...

TreasureWe ⋅ 2016/10/13 ⋅ 0

我痛恨 Git 的 10 个理由

Git 是一个源代码版本控制系统,正在迅速成为开源项目的标准。它有一个强大的分布式模型,允许高级用户用分支来处理各种棘手的问题和改写历史记录。但是,要学习 Git 是需要付出更多的努力,...

红薯 ⋅ 2012/03/10 ⋅ 90

13 个 Git 技巧献给 Git 13 岁生日

这 13 个 Git 技巧将使你的版本控制技能 +1、+1、+1…… Git 是一个分布式版本控制系统,它已经成为开源世界中源代码控制的默认工具,在 4 月 7 日这天,它 13 岁了。使用 Git 令人沮丧的事情...

作者: John Sj Anderson ⋅ 04/20 ⋅ 0

jenkins插件的安装与卸载

说明 Jenkins大部分的功能都是插件来实现的,所以必须知道jenkins插件的安装和卸载。 一、配置插件代理 jenkins在安装插件时候经常出现无法安装的情况,所以可以通过配置jenkins代理,来解决...

日久不生情 ⋅ 2017/11/17 ⋅ 0

30分钟Git命令“从入门到放弃”

一、基本了解 git命令是一些命令行工具的集合,它可以用来跟踪,记录文件的变动。比如你可以进行保存,比对,分析,合并等等。这个过程被称之为版本控制。已经有一系列的版本控制系统,比如S...

linuxprobe ⋅ 2016/08/07 ⋅ 0

部署自己的gitlab服务器

本文系统:centos 6.5 x64 ip: 172.16.162.130 GitLab 8.0.5GitLab Shell2.6.6GitLab APIv3Ruby 2.2.3p173Rails 4.1.12 1、安装依赖包 [root@vm1 ~]# yum install gcc* libicu* -y 2、安装g......

西索oO ⋅ 2016/04/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql in action / alter table

change character set ALTER SCHEMA `employees` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci ;ALTER TABLE `employees`.`t2` CHARACTER SET = utf8mb4 , COLLAT......

qwfys ⋅ 今天 ⋅ 0

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

MySQL

查看表相关命令 - 查看表结构    desc 表名- 查看生成表的SQL    show create table 表名- 查看索引    show index from  表名 使用索引和不使用索引 由于索引是专门用于加...

stars永恒 ⋅ 昨天 ⋅ 0

easyui学习笔记

EasyUI常用控件禁用方法 combobox $("#id").combobox({ disabled: true }); ----- $("#id").combobox({ disabled: false}); validatebox $("#id").attr("readonly", true); ----- $("#id").r......

miaojiangmin ⋅ 昨天 ⋅ 0

金山WPS发布了Linux WPS Office

导读 近日,金山WPS发布了Linux WPS Office中文社区版新版本,支持大部分主流Linux系统,功能更加完善,兼容性、稳定性大幅度提升。本次更新WPS将首次在Linux提供专业办公文件云存储服务,实...

问题终结者 ⋅ 昨天 ⋅ 0

springboot2输出metrics到influxdb

序 本文主要研究一下如何将springboot2的metrics输出到influxdb maven <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

go4it ⋅ 昨天 ⋅ 0

微信小程序 - 选择图片显示操作菜单

之前我分享过选择图片这个文章,但是我在实际开发测试使用中发现一个问题在使用 wx.chooseImage 选择照片显示出第一格是拍照,后面是相册里的图片。这种实现之前说过了,效果如下。 但是你从...

hello_hp ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部