原创

最近公司的代码管理工具要从SVN转到Git上,因此虽然之前用过Git,但是都是一些简单的推送提交,因此还是有必要进行一些系统的学习,这里做一下笔记,以备后询,且不定期更新。

关于SVN和Git的比较已经有很多文章说过了,就不再赘述,本文的重点是如何使用常用的Git命令进行操作,冷门的就不说了,且比较零散,系统的学习推介廖雪峰的Git教程。

声明

  1. 下面用户名都为 SHERlocked93,请自行修改成自己的用户名

1. 概览

  • 工作区 Workspace

  • 暂存区 Stage / Index

  • 本地仓库 Repository

  • 远程仓库 Remote

2. 修改

2.1 暂存修改

操作一览

操作 bash
创建stash git stash
查看 git stash list
应用 git stash apply stash@{ <num>}
删除 git stash drop stash@{ <num>}
还原上一个暂存并删除暂存(如无conflict) git stash pop

如果在工作的时候出现了临时需要解决的问题,而你又不希望提交,那么有个 stash功能

git stash
 

在暂存后工作区会回退到最近的一个commit的状态,以便开建新分支;比如我们修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场 git stash一下,然后去修复bug,修复后,再 git stash pop,回到工作现场。

2.2 撤销修改

还未提交到暂存区

当修改还没有被 add的时候,可以使用

git checkout -- filename.txt
 

来丢弃工作区某文件的修改,当然也可以把后面的文件改成 *来撤销所有文件的修改。这是用仓库的文件覆盖工作区的文件。

注意这里用的是 --,如果没有这个 --的话就变成切换分支了。

还未提交到仓库

如果你的修改已经被 add到了暂存区,但是还没有被 commit,那么可以使用

  1.  
    git reset HEAD filename.txt
  2.  
    git checkout -- filename.txt

首先用 reset来把修改撤回到工作区,再使用上面的 checkout命令撤回工作区的修改。这里的 reset相当于 add的反操作。

已经提交到仓库

则可以版本回退

git reset --hard 15zdx2s
 

这里的 --hard表示强制回退,丢弃本地的修改。这个回退比较野蛮,该版本号之后的提交都将不可见。

撤销之前某一个提交

git revert撤销一个提交的同时会创建一个新的提交,这是一个安全的方法,因为它不会重写提交历史。但实现上和reset是完全不同的。它撤销这个提交引入的更改,然后在最后加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交。

git revert 46af7z6
 

相较于 resetrevert不会改变项目历史,对那些已经发布到共享仓库的提交来说这是一个安全的操作。其次 git revert 可以将提交历史中的任何一个提交撤销、而 reset会把历史上某个提交及之后所有的提交都移除掉,这太野蛮了。

相比 reset,它不会改变现在的提交历史。因此, revert 可以用在公共分支上, reset 应该用在私有分支上。

合并commit

如果已经 commit了怎么办,如果要撤回目前的 commit,可以把它合并到上一个 commit

git rebase -i HEAD~~
 

在出现的两个提交信息的 pick改为 fixup

3. 分支操作

3.1 创建/查看/合并分支

操作一览

操作 bash
查看分支 git branch
查看本地和远程分支 git branch -a
在target分支上创建分支,没有则从当前分支 git branch <branch-name> <target-branch>
创建并切换分支 git checkout -b <branch-name>
合并某分支到当前分支 git merge <branch-name>
删除分支,只能删参与了合并的 git branch -d <branch-name>
强行删除 git branch -D <branch-name>
删除远程分支 git push origin : <remote-branch-name>

创建分支

  1.  
    # 创建新分支
  2.  
    git branch bug-fix
  3.  
    # 查看分支,-a查看本地和远程的分支,-r查看远程分支,-l或没有只查看本地
  4.  
    git branch -a
  5.  
    # 切换到刚刚创建的分支
  6.  
    git checkout bug-fix

上面两个步骤可以合并为

  1.  
    # 创建并切换到分支
  2.  
    git checkout -b bug-fix

如果修改一下本地文件之后在这个分支继续培育一个版本之后,怎么去合并到主分支呢

  1.  
    git add *
  2.  
    git commit -m "some change"
  3.  
    # 切换到主分支
  4.  
    git checkout master
  5.  
    # 合并分支
  6.  
    git merge bug-fix
  7.  
    # 删除分支 (可选)
  8.  
    git branch -d bug-fix

如果master分支和新的分支都各自培育了版本,那么自动合并通常会失败,发生冲突 conflict,此时需要打开文件解决冲突之后 commit一个版本以完成合并

  1.  
    git add *
  2.  
    git commit -m "branch merge"

这里提一下, merge的时候有几个主要模式, --no-fffast-forward,其中 fast-forward是默认的

  1. fast-forward:在master开始的新分支前进了几个版本之后如果需要merge回来,此时master并没有前进,那么这个模式就是把HEAD与master指针指向新分支上,完成合并。这种情况如果删除分支,则会丢失分支信息,因为在这个过程中并没有创建commit。

  2. --no-ff:关闭默认的 fast-forward模式,也就是在merge的时候生成一个新的commit,这样在分支历史上就可以看出分支信息。

3.2 远程仓库操作

操作一览

操作 bash
克隆 git clone <url>
添加远程仓库 git remote add <name> <url>
删除远程仓库 git remote rm <name>
拉取 git pull <remote-branch-name> <local-branch-name>
推送本地所有分支到远程 git push --all origin
推送到远程同名分支 git push origin <local-branch-name>
推送本地分支到远程master git push origin <local-branch-name>master
把当前本地分支推送并创建到远程 git push origin
检出远程分支 git checkout -b <new-local-branch-name> origin/ <remote-branch-name>

关于各个分支,哪些需要推送呢

  1. master分支是主分支,因此要时刻与远程同步;

  2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

  3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

  4. feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

直接 clone

在github上创建一个新的项目之后,比如叫 learn-git,那么可以直接 clone下来,注意创建的时候不要选择 Initializethisrepositorywitha README,我们要的是一个空的仓库

git clone https://github.com/SHERlocked93/learn-git.git
 

这样在本地就直接创建了一个空的文件夹 learn-git,当然里面有 .git文件夹。也可以使用SSH地址来clone,速度会快一些,也不用每次推送都输入口令,推介使用这种

git clone git@github.com:SHERlocked93/learn-git.git
 

添加一个文件 filename.txt之后

  1.  
    git add filename.txt
  2.  
    git commit -m "add filename.txt"
  3.  
    git push -u origin master

这样就把本地新建的文件push到了远程仓库

本地与远程建立关联

如果已经有了本地工程文件夹,如何分享到github远程仓库呢,当然此时我们已经在github上创建了一个新的空白项目,还是叫 learn-git,在本地文件夹中

  1.  
    git init
  2.  
    # 关联远程库
  3.  
    git remote add origin git@github.com:SHERlocked93/learn-git.git
  4.  
    git push -u origin master

就可以了,如果你的远程仓库已经有了提交,那么在 push之前需要

  1.  
    # 允许不想干库合并
  2.  
    git pull origin master --allow-unrelated-histories
  3.  
    git push -u origin master

先拉取远程分支,注意这里 --allow-unrelated-histories允许两个不想干的分支强行合并,再 push;这样在github的网站上还能看到commit记录。

也可以强硬一点直接强行推送

  1.  
    # -f 强行推送
  2.  
    git push -u origin master -f

这样本地仓库就直接把远程仓库覆盖了,且github上也看不到历史 commit了,如果不想被同事枪击的话,还是推介上一种做法。

同步远程仓库

那么已经clone的仓库如果希望同步原仓库新的提交怎么办

  1.  
    # 从远程分支拉取代码到本地
  2.  
    git pull upstream master
  3.  
    # push到自己的库里
  4.  
    git push origin master

3.3 多人协作

多人协作的工作模式通常是这样:

  1. 首先,可以试图用 git push origin<branch-name>推送自己的修改;

  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  3. 如果合并有冲突,则解决冲突,并在本地提交;

  4. 没有冲突或者解决掉冲突后,再用 git push origin<branch-name>推送就能成功

从远程抓取分支,使用 git pull,如果有冲突,要先处理冲突, add->commit->push。如果 git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch--set-upstream-to<branch-name>origin/<branch-name>

4. 标签操作

操作一览

操作 bash
查看所有标签 git tag
新建标签 git tag <tagname>
新建并制定说明 git tag <tagname> -m <message> <bash>
查看标签说明 git show <tagname>
删除标签 git tag -d <tagname>
推送某个标签到远程 git push origin <tagname>
推送所有未推送到远程的本地标签 git push origin --tags
合并远程仓库的标签到本地 git pull origin --tags
删除远程标签 git push origin :refs/tags/ <tagname>

如果要删除远程分支,需要

  1.  
    # 首先删除本地tag,假如tag是v0.9
  2.  
    git tag -d v0.9
  3.  
    # 再从远程删除
  4.  
    git push origin :refs/tags/v0.9

5. 提交格式

type:

  • feat: 新特性,添加功能

  • fix: 修改bug

  • refactor: 代码重构

  • docs: 文档修改

  • style: 代码格式修改, 注意不是 css 修改

  • test: 测试用例修改

  • chore: 其他修改, 比如构建流程, 依赖管理.


网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢迎留言指出~

推介阅读:

  1. 廖雪峰 - Git教程

  2. github实现本地仓库与远程仓库同步

  3. 图解 Git 命令

  4. git基本操作,一篇文章就够了!

  5. 团队协作中的 Github flow 工作流程

  6. git 命令大全

附件

  1. Git常用命令速查表:

 

Git 常用命令总结,掌握这些,轻松驾驭版本管理的更多相关文章

  1. 用好Git 和 SVN,轻松驾驭版本管理

    用好Git 和 SVN,轻松驾驭版本管理 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高频率使用到的 Git 常用命令. 一.Git vs S ...

  2. Git 常用命令详解

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  3. Git 常用命令详解(二)

    Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...

  4. 【转】 Git 常用命令详解(二)----不错

    原文网址:http://blog.csdn.net/ithomer/article/details/7529022 Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如: ...

  5. Git常用命令(转)

    目前开发的新项目使用的版本控制工具基本用的都是Git,老项目用的还是Svn,网上Git资源也很多,多而杂.我整理了一份关于Git的学习资料,希望能帮助到正在学习Git的同学. 一. Git 命令初识 ...

  6. Git常用命令和Git团队使用规范指南

    转自:https://wsgzao.github.io/post/git/ 前言 在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git.它的出现改变了 ...

  7. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  8. Git 常用命令大全

    Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v 添加 ...

  9. Git常用命令总结

    Git常用命令总结 git init      在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹.   git clone ...

随机推荐

  1. Hadoop学习之路(4)Intelij+Maven搭建Hadoop项目

    1创建工程 点击project--Maven--next 2通过maven导入项目依赖jar包 (1)设置maven自动导入依赖jar包 勾选 Import Maven projects automa ...

  2. linux - 服务器性能评估

    影响Linux服务器性能的因素 cpu 内存 磁盘IO 网络IO 系统性能评估标准 影响性能因素 好 坏 糟糕 CPU user% + sys%< 70% user% + sys%= 85% u ...

  3. AcWing 1057. 股票买卖 IV

    //f[i,j,1]表示走到第i天已经进行完j次交易并且手中没有股票的所有的购买方式的集合 //f[i,j,0]表示走到第i天并且正在进行第j次交易且手中有货的所有的购买方式的集合 //属性利益最大值 ...

  4. vim光标操作

    v可视模式 ve可视模式但不包括selection o操作符等待模式 i插入模式 r替换模式(命令模式下,按r,输入一个字符将替换光标所在处字符) c命令行常规模式 ci命令行插入模式 cr命令行替换 ...

  5. python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及一些异常的注意事项)

    //20200115 最近在看“咱们裸熊——we bears”第一季和第三季都看完了,单单就第二季死活找不到,只有腾讯有资源,但是要vip……而且还是国语版……所以就瞄上了一个视频网站——可以在线观看 ...

  6. 【Python】圆周率的计算

    1.公式法  代码: #CalPiV1.py pi=0 N=100 for k in range(N): pi+=1/pow(16,k)*(\ 4/(8*k+1)-2/(8*k+4)-\ 1/(8*k ...

  7. mybatis(五):源码分析 - 获取boundsql流程

  8. JavaScript的BOM对象

    JavaScript的BOM对象 BOM:浏览器对象模型 JavaScript和浏览器的关系:JavaScript的诞生就是为了能够让它再浏览器中运行. 1. 操作BOM对象 1.1 window w ...

  9. Wannafly Camp 2020 Day 2C 纳新一百的石子游戏

    为什么为了这么个简单题发博客呢? 因为我又因为位运算运算符优先级的问题血了 #include <bits/stdc++.h> using namespace std; #define in ...

  10. [BZOJ3277/BZOJ3473] 串 - 后缀数组,二分,双指针,ST表,均摊分析

    [BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连 ...