专栏首页進无尽的文章代码管理| 全面了解Git使用相关

代码管理| 全面了解Git使用相关

Git add 和 Git commit 的区别

史上最浅显易懂的Git教程

要想弄明白git addgit commit的区别,首先我们需要知道三个概念:工作区(Working Directory)版本库(Repository)暂存区(Stage or index)

工作区: 当你在开发一个项目时,主目录就是你的工作区。
版本库: 工作区中有一个隐藏目录`.git`,这个就是git的版本库了。
暂存区: Git的版本库里存了很多文件,其中包括称为Stage或index的暂存区,还有一个git为      
        我们自动创建的第一个分支`master`,以及指向`master`的一个指针`HEAD`。

下面就是三个区的示意图:

三个区的示意图

git add 和 git commit 的区别就在于:

git add     把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit  提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支。所以,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。 所以要想将修改提交到master中一定要先git add到暂存区中,再git commit到master分支。

结合远程仓库,这四个区的转换关系以及转换所使用的命令:

GitFlow工作流常

Gitflow 是一个非常成功的分支模型,它主要分为2个(master, develop)主要的分支和3个(feature, release, hotfix)辅助分支。SourceTree 已经集成了它。它主要有以下几个分支组成:

master:  生产环境分支,它是非常稳定的版本,一但处于develop分支的代码没问题以后,
          将会被合并到这个分支用来发布代码。也就是说它处于随时待命的状态。

develop: 开发分支,最新的开发状态,它是基于 master 分支的,一旦开发完毕后,
          将被合并(merge)到 master 分支上。

feature :功能分支,它是基于 develop 分支的,一旦功能开发完成,将被合并(merge)到 develop 分支

release  :发布分支,它是基于 develop 分支的,主要用来修改 bug,
          修改完 bug 后将被合并到 develop 和 master 分支。主要是测试版本供测试人员测试。

hotfix:  补丁分支,基于 master 分支的,等不到新功能版本发布,必须发布一个布丁,
          bug 修复完成后将被合并到 master 分支,同时 hotfix 分支将被删除。

实际项目开发中的GitFlow工作流常用操作流程

GitFlow 最经典的几张流程图,一定要理解:

feature 分支都是从 develop 分支创建,完成后再合并到 develop 分支上,等待发布。

当需要发布时,我们从 develop 分支创建一个 release 分支

然后这个 release 分支会发布到测试环境进行测试,如果发现问题就在这个分支直接进行修复。在所有问题修复之前,我们会不停的重复发布->测试->修复->重新发布->重新测试这个流程。

发布结束后,这个 release 分支会合并到 develop 和 master 分支,从而保证不会有代码丢失。

master 分支只跟踪已经发布的代码,合并到 master 上的 commit 只能来自 release 分支和 hotfix 分支。 hotfix 分支的作用是紧急修复一些 Bug。 它们都是从 master 分支上的某个 tag 建立,修复结束后再合并到 develop 和 master 分支上。

Git的命令行操作

  • git init: 初始化一个空的 Git。在桌面上创建一个文件夹,然后创建一个空的 Git,执行完 git init 命令后,会新建一个隐藏的文件夹 .git
$ mkdir lefeGit
$ cd lefeGit
$ git init

lefeGit 相当于一个仓库(repository)也称为我们的工作区,这里的文件将被 git 管理。

  • git add: 把工作区的内容提交到暂存区;
$ touch lefe.js // 创建一个 lefe.js 文件
$ git add lefe.js // 把 lefe.js 文件修改的内容提交到暂存区
$ git add * // 把当前工作区所以修改过的内容一次提交到暂存区
  • git commit: 把当前修改的内容提交到当前分支;
$ vi lefe.js // 编辑 lefe.js 文件
$ git add * // 把 lefe.js 文件修改的内容提交到暂存区
$ git commit -m 'add lefe' // 把当前修改的内容提交到当前分支,初始化git
的时候,会默认创建一个 master 分支,-m 后是提交时的备注
  • git log: 显示从最近到最远的提交日志
  • git log --pretty=oneline: 显示从最近到最远的提交日志,单行显示
  • git reflog: 查看命令历史
$ git log
commit a7fcde1af5f78af8e44290f3951bb159a9bbcac0 (HEAD -> master)
Author: wangsuyan <wsyxyxs@126.com>
Date:   Thu Nov 2 16:23:35 2017 +0800

    add lefe

$ git log --pretty=oneline
a7fcde1af5f78af8e44290f3951bb159a9bbcac0 (HEAD -> master) add lefe
  • git checkout -- file: 修改未提交到暂存区的文件
$ git checkout lefe.js // 撤销还没有提交到暂存区的更改,这是被修改的内容还在工作区中
  • git reset HEAD file: 修改添加到暂存区的文件
$ git reset HEAD lefe.js // 撤销修改的文件到暂存区
$ git checkout lefe.js // 撤销对 lefe.js 文件的修改
  • git reset --hard HEAD^: 回到上一次提交的
  • git reset --hard HEAD~100: 回到前100次提交的
  • git reset --hard b3a2ba0d9f92d3f: 回退到指定的版本
$ git reset --hard HEAD^
HEAD is now at a7fcde1 add lefe
  • git status: 查看修改的状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   lefe.js

no changes added to commit (use "git add" and/or "git commit -a")
  • git diff: 查看文件的差异
$ git diff
diff --git a/lefe.js b/lefe.js
index b245919..8999741 100644
--- a/lefe.js
+++ b/lefe.js
@@ -1 +1,2 @@
  Hello lefe
+wsy
  • git clone:克隆一个仓库到本地,当你在远程仓库创建一个库后,使用 git clone 把项目克隆到本地;
$ git clone git@github.com:lefex/wsyLefe.git
  • git remote add orgin git@github.com:lefex/wsyLefe.git 本地仓库关联一个远程库;
// 当你本地创建一个仓库后,需要提交到远程仓库时,就需要把本地仓库和远程仓库进行关联,
   这样就可以把本地的代码提交到远程仓库了,orgin 为远程仓库的名字,可以自定义
$ git remote add orgin git@github.com:lefex/gitLearn.git 
// 查看所关联的远程仓库
$ git remote -v
orgin   git@github.com:lefex/wsyLefe.git (fetch)
orgin   git@github.com:lefex/wsyLefe.git (push)
// 如果本地已经关联了远程仓库,需要删除后重新关联,当然也可以同时关联多个远程仓库
$ git remote rm origin
// 由于第一次提交,远程仓库是空的,需要把远程master仓库和本地的master仓库关联起来,
    以后可以直接使用 git push 来提交代码
$ git push -u orgin master
  • HEAD: 指向当前分支;
  • git checkout -b dev: 创建一个 dev 分支,并切换到 dev 分支;
$ git checkout -b dev
$ git branch hot  // 创建 hot 分支
$ git checkout hot // 切换到 hot 分支
$ git branch // 查看所有分支
$ git merge hot // 合并 hot 分支到当前分支
$ git branch -d hot // 删除 hot 分支
  • 如果分支合并时出现冲突,git 使用 <<<<<<< HEAD, ======= 和 >>>>>>> dev 标记冲突的分支,HEAD 表示当前分支,dev 表示 dev 分支;
 Hello lefe
<<<<<<< HEAD
wsy add master
=======
add dev
>>>>>>> dev
  • 当你正在dev分支上开发一个新功能时,突然老板说线上有个 bug 必须修复一下,然后提交个版本。咋办,新功能还需要1天才能写完,还不能提交。使用 git stash 可以暂存你所修改的内容。然后从主分支新建一个分支来修改bug,修改完后与主分支合并,bug修改完后可以继续开发新功能。git stash list 查看暂存的内容,git stash pop 恢复暂存的内容,也可以使用 git stash apply 恢复暂存的内容,但是恢复后,stash内容并不删除,你需要用git stash drop来删除。
  • git push origin master: 把本地的修改提交到远程,origin 为远程分支,master 为本地分支;
  • git pull: 从远程拉去内容;
  • git tag: 给某次提交打一个标签,比如给每一提交的版本打一个标签,方便以后查找;
// 给当前提交的代码打一个名字为 v0.1 的 tag,默认是打在最新一次提交的位置
$ git tag v0.1

// 查看所有的 tag
$ git tag
v0.1
v0.2

// 查看提交记录
$ git log --pretty=oneline --abbrev-commit
48cd742 (HEAD -> master, tag: v0.2, tag: v0.1, orgin/master) chang lefe.js remot
8c2fd8e create lefe.js file

// 某一次提交版本后,忘记了打 tag,可以使用这个命令给某一次提交打 tag
$ git tag v0.01 8c2fd8e

// 提交tag的备注信息 -a:标签名 -m:备注信息
$ git tag -a v0.3 -m '0.3 version release'

// 删除标签
$ git tag -d v0.2
Deleted tag 'v0.2' (was 48cd742)

// 把某个 tag 提交给远程仓库
$ git push orgin v0.1
// 提交所有的 tag 到远程仓库
$ git push orgin --tags

// push 这个tag不小心打错了,并提交到了远程仓库,需要删除,先删除本地,在从远程仓库删除
$ git tag -d push
$ git push orgin :refs/tags/push
  • git show: 显示某个 tag 的详细信息
$ git show v0.01
commit 8c2fd8ecec2f65f58ac1a531203ce520a78229d3 (tag: v0.01)
Author: wangsuyan <wsyxyxs@126.com>
Date:   Fri Nov 3 11:21:31 2017 +0800

    create lefe.js file

diff --git a/lefe.js b/lefe.js
new file mode 100644
index 0000000..37b455a
--- /dev/null
+++ b/lefe.js
@@ -0,0 +1 @@
+Hello lefe
  • 如何提交代码到别人的仓库中(以 Github 为例) fork 别人的代码到自己的账号下,从自己的账号下克隆刚才fork的项目,修改后提交到自己的代码仓库, 如果需要提交给别人的代码中,需要发起一个 pull request,别人同意后,你的代码将出现在别人的仓库中。
  • .gitignore:忽略要提交的文件 如果某些文件不希望提交到仓库中,可以使用 .gitignore 文件忽略它。.gitignore

git的图形化工具sourceTree来管理代码库:

更加详细的配置信息见:Git config 配置

常用的几个Git代码托管平台

说到Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费,如果你做的是一个开源项目,可以首选GitHub。下面推荐几个比较好的Git代码托管平台,这里我不做过多的说明和评价,也好让大家多看 看,比较一下,找到自己的”真爱”。

Git是一款免费、开源的分布式版本控制系统 Github是用Git做版本控制的代码托管平台 coding。代码管理网站,类似于github,是国内产品,速度会相对快一点

相当于本地、公司服务器、Github网站服务器都装Git做版本控制,只不过Github的服务器强大些,对全球用户托管的项目用Git做版本控制!

1、GitHub

关于GItHub相信大家都有耳闻,我就不详细介绍了。

2、Gitlab

对于有些人,提到GitHub就会自然的想到Gitlab,Gitlab支持无限的公有项目和私有项目。

3、Bitbucket

bitbucket免费支持5个开发成员的团队创建无限私有代码托管库。

4、码云-开源中国代码托管

前面说的都是国外的,下面来说几个国内的。开源中国一个账号最多可以创建1000个项目,
包含公有和私有。
开源中国在几个月前又发布了团队协作开发平台,和代码托管平台一起,
打造了一个十分好的团队开发平台,开源中国团队协作平台地址:http://team.oschina.net/,
团队协作平台支持任务的创建、讨论、便签等

5、coding.net

谈到coding.net,首先必须提的是速度快,功能与开源中国相似,
同样一个账号最多可以创建1000个项目,也支持任务的创建等。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 代码管理 | 创建并管理自己的公有Cocopods库

    一是直接将这部分代码copy到绘本阅读这个项目中; 二是将语音评测这部分逻辑给抽取出来,然后在分别在两处使用。

    進无尽
  • 编码篇-从一个第三方的StoryBoard项目中剥离部分功能到纯代码项目中

    最近项目中需要实现视频监控功能,于是就用了某企业旗下的一款视频监控产品,在集成官方Dome中的监控画面播放的功能时,发现整个项目都是通过StoryBoard搭建...

    進无尽
  • 基础篇-Welcome to Xcode

    Command + Shift + K:清除工程: Command + B :构建应用 commond + r 启动模拟器 commond + . 停止模...

    進无尽
  • 【Git】616- git命令的进阶和复习(带动图效果)

    作者:老郑的技术杂货铺 链接:https://juejin.im/post/5e9e49356fb9a03c917fe7fd

    pingan8787
  • Learning Git by Animations

    看到一个动画版的Git教程(网址),动画效果真心不错,所以学了下,本文是记录其中的几个重点部分。

    宅男潇涧
  • 高频使用的 Git 命令

    在整个功能开发完毕的时侯,会有非常多的 commit,用 rebase 可以让我们的commit记录很干净

    CRPER
  • Git知识总结

    暂存区:又称索引区。是git add操作以后将添加的文件存放的区域。在.git文件夹中以index文件存在

    石的三次方
  • 你必须要知道的git rebase

    git add, git commit, git push, git stash, git pull, git merge, git log

    Karl Du
  • Github 学习与常见问题

    github以前用来搭建过博客,但是不会用git仓库,最近抽时间跳坑,把常见问题总结了下。

    风之小云天
  • Git 的基本操作、开发流程、实用技巧总结

    Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂,就不围绕这块展开了,有兴趣的可以去了解下。

    serena

扫码关注云+社区

领取腾讯云代金券