UNDER MIT LICENSE.

公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题。经过三个月的踩坑和填坑, git 操作颇显成熟。仅以此文回忆学习 git 的历史。

本文地址:http://www.cnblogs.com/hustskyking/p/git-improve.html,转载请注明源地址。

一、基本操作

1. 克隆代码

1.1 添加仓库

最直接的方式:

cd dir  # 这里不用新建一个项目名的文件夹,dir为git文件夹的父文件夹
git clone https://github.com/barretlee/Micro-Share

你也可以进入一个目录,然后初始化(init):

cd path/to/Project
git init
# 添加远程目录
git remote add origin https://github.com/barretlee/Micro-Share

这些都是最基本的了,上面的 remote add 是添加一个远程目录,你也可以添加多个远程目录,什么情况下会添加多个呢?比如:我想把别人的代码处理之后放到自己的 git 仓库上去,

git remote add origin https://github.com/barretlee/Micro-Share
git remote add mine http://your/path/to/git
# 拉取远程代码到 init 之后的 master 主干上
git fetch origin master
# 修改代码之后,提交到自己的仓库
git commit -am "fist"
git push -u mine master

1.2 添加文件

在提交文件之前首先要添加文件到分支中,很多人只知道:

git add .

如果有文件删除,会发现这些删除的文件并没有被附加进去,肿么办?

#方式一
git add --all .
#方式二
git add -A .
  • --all 参数,顾名思义,添加所有文件(change|delete|add)
  • -A 参数,添加修改过和删除过的文件(change|delete)
  • 不加 参数,添加修改过和添加的文件(change|add)

1.3 提交文件

git commit -m "comment"

如果没有删除过文件,可以合并添加和提交文件为一步:

git commit -am "add and commit"

1.4 远程提交

提交到远程仓库上:

# 将 master 提交到 origin 上
git push origin master

这一步操作可能会出现很多的问题,比如:

a) origin为一个多人开发的库,别人在你提交之前已经向 origin 上提交过一次(或者多次),那么此时你的版本是落后于远程服务器版本的,你需要先拉去线上最新的代码:

# 拉去远程分支到 master
git pull origin master

b) 执行 a) 之后,有可能也会有提醒:存在冲突,需要合并分支,这个在后面会提到

c) 如果你很自信,觉得线上的版本是存在问题,你这个版本木有问题,你可以强制提交你的代码

git push -u origin master -f

这里需要特别注意,加了 -f 线上之前的修改就会被删掉,请谨慎使用!

二、进阶操作指南

上面是最基本的几条命令,初用 git 的童鞋一般也只会接触这些东西,在一些复杂的多人开发项目中,修改代码、合并代码十分频繁,上面的命令显然是不够用了。在介绍进阶命令之前,先了解下 git 的三种状态。

+-----------+      +-----------+       +-----------+
|           |      |           |       |           |
|  working  | -->  |   index   |  -->  |  commit   |
|           |      |           |       |           |
+-----------+      +-----------+       +-----------+
      ↓                  ↓                   ↓
   当前操作            git add            git commit

                              <Created By Barret Lee>

你当前的操作状态下,所有文件的状态都在 work 状态,当你执行 git add 之后,文件状态变为 index,也就是在 git 中已经有过一次登记了,而 git commit 之后就被编入了分支,成为 commited 状态了。需要注意的是,这三种状态一直存在,只是会有不同的文件来对应这些状态。

1. 场景切换

Barret 有一天敲代码,代码敲了一半,Boss 跟他说,线上出了个 bug,赶紧的,去修复!

咋办?上面那堆代码,敲了半个上午啊,重新新建一个文件夹,然后把线上代码再克隆一次修改?这种处理的成本显然太高了!其实 git 为我们提供了很好用的命令 git stash。只要在当前目录下操作:

git stash

这句命令执行完毕之后,git 管理区中的 stash 会多出一条记录,这条记录保存了上一次提交到目前,你所有的修改:

last commit ... working file now

接着你就可以修改你的 bug 了,修改完了之后,再使用

git stash pop

将之前保存的修改(场景)还原回来。其内部的原理也是很简单的:

+---------------+      +-----------+      +-----------+       +-----------+
|               |      |           |      |           |       |           |
|  last commit  | -->  |  working  | -->  |   index   |  -->  |  commit   |
|               |      |           |      |           |       |           |
+---------------+  ↑   +-----------+      +-----------+   |   +-----------+
      ↓            |         ↓                  ↓         |          ↓
   上次提交         |      当前操作            git add      |    git commit
                   |                                     s|
                   |                                     t|
                   |       +---------+                   a|
                   |       | Stash  |                   s|
                   |       +---------+                   h|
                   +------ | Stash  | <------------------+
                           +---------+
                           |  ....   |
                           +---------+
                           | Stash n |
                           +---------+
                                ↓                    <Created By Barret Lee>
                             stash堆栈

有些童鞋可能看不太懂上面的图,git 有一个场景(stash)堆栈,这个堆栈的作用是用于保存修改的,下面举个例子:

# 进入文件夹
$ cd test
# 初始化 git
$ it init
# 新建四个文件
$ touch f1 f2 f3 f4

上面初始化一个 git ,然后新建了四个文件

# 修改 f1
$ " > f1
# 将修改 push 到 stash 栈堆中
$ git stash

上面修改了文件 f1,并保存到场景栈堆中

# 查看 stash 栈堆
$ git stash list
  stash@{}: WIP on master: 7f58be2 

查看栈堆,可以看到 stash@{0}

# 修改 f2
$ " > f2
# 添加修改
$ git add .
# 将修改 push 到 stash 栈堆中
$ git stash

修改文件 f2,添加之后保存到栈堆之中

# 查看 stash 栈堆
$ git stash list
    stash@{}: WIP on master: 7f58be2
    stash@{}: WIP on master: 7f58be2 

栈堆中多了一个 stash@{1},这个时候我们去修复 bug,改变其他位置的代码,完了之后:

# pop 栈堆,还原修改
$ git stash pop

上面我们将栈堆 pop 出来,遵循后进先出的规则

# 查看文件状态
git status
$ Changes not staged for commit:
    changed: f2
  please commit it

以上代码都是我手动敲出来的,不是复制控制台的代码,大概就是这个么意思吧。关于 stash 的最后一个想说明的命令是:

git stash  HEAD

比较前第三次与现在代码的差异,可以:

git  HEAD

获取前第n次的还有另外一种方式,如前第二次:

HEAD^^

前第五次:

HEAD^^^^^

这样写起来比较累,还是前面的方式比较顺手。

2.2 SHA

关于 SHA 标识的介绍,我这里就懒得打字了,可以看我之前分享的一点东西,使用

git log

可以看到每次 commit 的 SHA 标识。要比较两次提交之间的差异,可以直接

git diff SHA1 SHA2

其中 SHA1 和 SHA2 是两次提交(commit)时的标识。

2.3 与场景的比较

这个用的比较少,对比目前代码跟最近一次 push 的场景代码差异:

git diff --cached

从字面上也好理解,就是跟缓存的文件做对比嘛~

3. 版本回退

如果上面的 SHA,working,index,commit 几种状态和标识没有弄明白,相信这里也是十分难理解的。

版本回退使用的命令是:

git reset

3.1 三种操作

这个命令后面是要加参数的,分别为:

a) filename

git reset HEAD filename  # 从暂存区移除文件

如果之前有 add filename,上面的命令操作之后,filename 将处于未被 add 的状态。也就是从 index 转变成 working 状态。

b) HEAD

git reset --hard HEAD~n

直接回退到前第 n 个版本。

c) SHA

git reset --hard SHA

回到 SHA 对应的 commit 的版本。

3.2 三种方式

上面我们使用的是 --hard 来 reset 代码,这样风险是特别大的,这里有三个可选参数:

  • --hard 回退版本,代码也回退,忽略所有修改
  • --soft 回退版本,代码不变,回退所有的 add 操作
  • --mixed 回退版本,代码不变,保留 add 操作

4. 分支处理

4.1 查看分支

git branch

这是最简单的查看,查看本地创建了哪些分支。

git branch -va

查看本地+远程分支,及其详细信息(上次提交commit信息)

4.2 添加分支

git branch branch_name

如果你当前所在的分支是 master,此处创建的分支会直接继承 master 的所有修改历史。

git branch -b branchnew branchold

-b 是 base 的意思,如果你有两个分支 A 和 B ,目前在 A 分支上,你先新建一个分支继承 B,此刻你有两个选择:

# 选择一
# 先切换到 B 分支上
git checkout B
git branch C

# 选择二
git branch -b C B

4.3 切换分支

a) 切换到本地分支

git checkout branch_name

b) 切换到远程分支

git checkout remotes/origin/branch_name
git checkout branch_name

详情请看之前分享的这篇文章,git切换到远程分支

4.4 删除分支

显切换到别的分支上,然后

git branch -d branch_name

如果是远程分支:

git push origin :branch_name

在需要删除的分支前面加一个冒号OK了,push 上去之后,服务器上的分支自然就被删除了。


 

 

由于想写的内容实在太长,故打算下次再补充第二部分。

下期预告:

本节补充: 
  5. tag处理
  6. 仓库管理
第三章 版本管理策略 
第四章 看懂 diff 
第五章 配置别名

下次再做小结。

 

作者:Barret Lee
出处:http://www.cnblogs.com/hustskyking/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

转 git操作小结的更多相关文章

  1. Intellij 中的git操作 转!

    http://blog.csdn.net/lovesummerforever/article/details/50032937 Git原理以后会分章节介绍,本次主要说一下intellij怎样操作git ...

  2. 使用Git操作GitHub代码入门教程

    GitHub除了网页操作外,还可以借助本地客户端git(或github for windows)来增删修改远程代码.使用Git操作来连接GitHub可以通过Https或SSH方式,使用SSH方式可以免 ...

  3. java导入导出excel常用操作小结及简单示例

    POI中常用设置EXCEL的操作小结: 操作excel如下 HSSFWorkbook wb = new HSSFWorkbook();  //创建一个webbook,对应一个Excel文件 HSSFS ...

  4. js,jQuery数组常用操作小结

    一.js中数组常用操作小结 (1) shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift() ...

  5. Git操作指令进阶

    注意: 学习前请先配置好Git客户端 相关文章:Git客户端图文详解如何安装配置GitHub操作流程攻略 官方中文手册:http://git-scm.com/book/zh GIT 学习手册简介 本站 ...

  6. git操作标签

    操作标签 如果标签打错了,也可以删除: $ git tag -d v0.1 Deleted tag 'v0.1' (was e078af9) 因为创建的标签都只存储在本地,不会自动推送到远程.所以,打 ...

  7. git操作

    svn终结,git时代来临 git是最好的分布式版本控制系统 廖雪峰的git讲的蛮不错,http://www.liaoxuefeng.com/wiki/0013739516305929606dd183 ...

  8. git操作笔记

    首先本文参考廖雪峰的git学习教程,写的非常好,值得学习. http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b80 ...

  9. 关于git 操作

    一. Git 命令初识 在正式介绍Git命令之前,先介绍一下Git 的基本命令和操作,对Git命令有一个总体的认识 示例:从Git 版本库的初始化,通常有两种方式: 1)git clone:这是一种较 ...

随机推荐

  1. HDU 4632 Palindrome subsequence(DP)

    题目链接 做的我很无奈,当时思路很乱,慌乱之中,起了一个想法,可以做,但是需要优化.尼玛,思路跑偏了,自己挖个坑,封榜之后,才从坑里出来,过的队那么多,开始的时候过的那么快,应该就不是用这种扯淡方法做 ...

  2. Ehcache(05)——缓存的查询

    http://haohaoxuexi.iteye.com/blog/2117505 缓存的查询 目录 1.    使Cache可查询 1.1     基于Xml配置 1.2     基于代码的配置 2 ...

  3. 【Unity3D】中的空引用 Null Reference Exception

    Null Reference Exception : Object reference not set to an instance of an object. 异常:空引用,对象的引用未设置到对象的 ...

  4. OpenCV3读取、写入和保存图像

    需要说明的是在OpenCV3中已经将imread()和imwrite()函数转移到imgcodecs模块中,因此读写图像时,需要包含imgcodecs.hpp头文件,但是highgui.hpp头文件中 ...

  5. gwt CellTable中的控件按Tab键切换

    默认是 cellTable.setKeyboardSelectionPolicy(KeyboardSelectionPolicy.ENABLED); 如果要Tab,则设置为DISABLED; 并将其t ...

  6. linux安装gcc-c++

    首先查看系统是否安装: gcc -v    g++ -v    c++ -v 没有安装则执行一键安装命令:#yum install gcc-c++ 如果直接执行:#yum install c++是安装 ...

  7. JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    摘要: 原始数据类型和引用数据类型的副本作为参数传递给函数. 原文:JavaScript 是如何工作的:JavaScript 的共享传递和按值传递 作者:前端小智 Fundebug经授权转载,版权归原 ...

  8. RAID磁盘阵列是什么(一看就懂)

    在单机时代,采用单块磁盘进行数据存储和读写的方式,由于寻址和读写的时间消耗,导致I/O性能非常低,且存储容量还会受到限制.另外,单块磁盘极其容易出现物理故障,经常导致数据的丢失.因此大家就在想,有没有 ...

  9. hd loadBalanceServer F5 BIG-IP / Citrix NetScaler / Radware / Array / HAProxy /

    s 五.Citrix NetScaler 和 CDN 案例 问题描述: Citrix 10.5.66.9软件版本下,存在计时器bug,此bug会造成CDN长连接回源超过设备默认的180S,会发fin包 ...

  10. Linux编程 3 (初识bash shell与man查看手册)

    一.初识bash shell 1.1 启动 shell   GNU bash shell 能提供对Linux系统的交互式访问.通常是在用户登录终端时启动,登录时系统启动shell依赖于用户账户的配置. ...