Git是目前世界上最先进的分布式版本控制系统(没有之一)!

由于现在用的还不多,还没有这种体会,但是前人的经验是值得借鉴的,所以我认真的学习了一些关于git的简单操作,现在在这分享一些心得,或者说是为团队及个人留一些笔记供后续使用进行参考。(主要讲的是windows下的操作,虽然听说windows是最烂的开发平台-

git的安装

  • 前往 https://git-for-windows.github.io 下载模拟环境和git打包好的git版本,直接默认安装就行。
  • 安装完成之后在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

  • 安装完成后还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

创建版本库

  • 选择一个合适的地方,创建一个空目录:

    <font color=#ff0000 size=>请确保目录名(包括父目录)不包含中文

  • 通过git init命令把这个目录变成Git可以管理的仓库

$ git init
Initialized empty Git repository in /Users/***/***/.git/
  • 仓库建好后可以在该目录下或者该目录的子目录下创建文件,文件创建好以后:

    • git add ***.txt
    • git commit -m "add ***.txt"
$ git add *.txt
$ git commit -m "wrote a *** file"
[master (root-commit) cb926e7] wrote a *** file
1 file changed, 2 insertions(+)
create mode 100644 ***.txt

出现如上情况则说明已将文件提交到仓库!

远程仓库

  1. 创建ssh key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Git Bash,创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"

邮件地址写成自己的!!

2. 登录coding.net,在账户那边添加公钥,公钥名称自定义,公钥内容则是.ssh 目录下的id_ras.pub的文件内容,复制上去即可。

3. 新建一个项目,然后将该项目的ssh信息复制下来,在git下运行以下命令:

$ git remote add origin **

<font color=#ff0000 size=>** 表示你刚刚复制的ssh信息

4. 把本地内容推送到远程仓库:

$ git push -u origin master
Enter passphrase for key '/c/Users/lenovo/.ssh/id_rsa':
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (2/2), 226 bytes | 0 bytes/s, done.
Total 2 (delta 0), reused 0 (delta 0)
To git@git.coding.net:liushibubingyihan/test1.git
814c331..ba16318 master -> master
Branch master set up to track remote branch master from origin.

第一次推送才需要-u参数,之后就可省略不写

5. 克隆远程库:一般我们都是先建远程库,之后再建本地目录从远程库克隆下来。首先建好远程库,然后执行:

$ git clone **
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

**是远程库的ssh支持的git协议,复制粘贴即可

“后悔药”

  1. 版本回退

    • 多次提交之后,我们可以通过git log可查看历史记录



      commit后面跟着的一串数字就是版本号
    • 我们要回退到之前的版本,只需要git reset --hard + 版本号(版本号可以只写前面的四位左右)就可以回到对应的版本

    • 现在我们再git log看看,发现在你回到的版本之后的版本号找不到了,你可以试试git reflog会发现版本号都在,这时候就可以松一口气了!可以继续使用git reset --hard + 版本号回到你想去的地方。

  2. 撤销修改
    • git checkout -- file可以撤销工作区的修改,分两种情况:

      • 还未提交到暂存区,所以回到跟版本库一样的状态

      • 提交到了暂存区,所以回到与暂存区一样的状态

    • 提交到了暂存库要回到工作区,可以用git reset HEAD file,可以把暂存区的修改撤销掉(unstage),重新放回工作区,接着就回到情形一一样的情况,同样git checkout -- file即可!

    • 暂存区内容提交到版本库,可以利用第一节的版本回退撤销本次的提交!

  3. 删除文件
    • 将一个文件提交到版本库,然后删除文件管理器的文件
$ rm file

使用git status可以马上查看哪些文件被删除了



现在有两种情况:

* 从版本库删除该文件,使用git rm file,并且git commit:

* 从版本库恢复该文件,使用git checkout -- file:

$ git checkout -- b.txt

分支管理

  1. 创建和合并分支:

    • 创建dev分支并切换到该分支
$ git checkout -b dev
Switched to a new branch 'dev'

git branch可查看分支,前面带*的为当前分支

* 往该分支addcommit

* 切换回master分支

$ git checkout master
  * 将`dev`分支内容合并到`master`分支
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
  * 删除`dev`分支
$ git branch -d dev
  1. git merge branch的时候,删除分支以后就无法查看历史记录,所以我们可以改为git merge --no-ff -m "merge with --no-f" branch这样就会生成一个commit,之后可以用git log查看分支历史。
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
  1. git branch -D branch_name强行删除不需要的分支
  2. 多人协作:
    • git remote可以查看远程库
$ git remote
origin
  * 首先,可以试图用`git push origin branch-name`推送自己的修改;

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

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

  * 没有冲突或者解决掉冲突后,再用`git push origin branch-name`推送就能成功!

  * 如果`git pull`提示`“no tracking information”`,则说明本地分支和远程分支的链接关系没有创建,用命令`git branch --set-upstream branch-name origin/branch-name`。

对比git pullgit pull --rebase

应助教的提问,找了许多资料,大体理解了这两者的联系与区别:
  • git pull = git fetch + git merge

    git pull --rebase = git fetch + git rebase

    所以说来,两者的区别就是git merge 与 git rebase 的区别

  • 创建完新分支时是这样的:

  • dev分支下完成提交,同时有其他人在origin做了修改和提交



    这时候E提交的话会产生冲突,有下面两种方式解决:

    • git merge

      用git pull命令把"origin"分支上的修改pull下来与本地提交合并(merge)成版本M

    • git rebase

    创建一个新的提交R,R的文件内容和上面M的一样,但我们将E提交废除,当它不存在。由于这种删除避免了菱形的产生,保持提交曲线为直线,让大家易于理解。

    说到这,应该清楚了两者的区别了,个人理解就是git merge 保留的分支记录,而git rebase则是像修改历史一样,没人知道之前分支的存在记录。到底该用哪个,还是要具体时候具体分析,各有各的特点。

总结:

  • 本文是看过廖雪峰的官方网站的git教程后做的一些总结,主要是一些常用的操作,再加上自己的一些实验以及心得。
  • 当看到助教问的关于git pullgit pull --rebase的问题的时候有点懵,因为之前只听过git pull,倒是不曾听过什么git pull --rebase,查了许多其他大神的博客才略有理解。
  • 希望git 能为自己团队的后续开发有帮助吧!

关于git的学习的更多相关文章

  1. git入门学习(二):新建分支/上传代码/删除分支

    一.git新建分支,上传代码到新的不同分支  我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...

  2. git入门学习(一):github for windows上传本地项目到github

    Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...

  3. 代码管理工具之git的学习

    1.代码管理工具git的学习  http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 2.github的使用帮助   https:// ...

  4. git的学习笔记(二):git远程操作

    1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...

  5. Git操作学习笔记

    根据廖雪峰老师git教程学习整理 这里需要辨析一下概念.Github是代码托管平台,是协作的工具;而Git是版本控制工具.Git不需要联网,在本机就可以使用 集中式版本控制系统与分布式版本控制系统 S ...

  6. FastAdmin 推荐 Git 在线学习教程

    FastAdmin 推荐 Git 在线学习教程 因为 FastAdmin 推荐使用 Git 管理代码,有很多小伙伴对 Git 不是很熟悉. 也苦于找不到好的教程,我就分享一个 Git 在线学习教程. ...

  7. Git命令学习之旅——日志和穿梭版本号

    在总结了git命令的基础之后,接下来我们看一下基础的一些进阶内容:删除撤销命令.日志查看命令等 既然有加入文件的功能,那么相相应的肯定有移除文件的功能,命令例如以下:git rm [文件名称] 在输入 ...

  8. 【Git】学习开始

    [Git]学习开始 转载:https://www.cnblogs.com/yangchongxing/p/10172683.html 在线电子书籍:https://git-scm.com/book/z ...

  9. Git详细学习教程

    作者:gafish https://github.com/gafish/gafish.github.com Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目 ...

  10. Git速成学习第六课:Bug分支

    Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 当你接到一个修复代码为101的任务的时候,很自然的你想创建一个分支issue-101来修复它,但 ...

随机推荐

  1. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  2. javascript: 带分组数据的Table表头排序

    如下图: 要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变 从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份 < ...

  3. Linux 中 Weblogic 启动和关闭

    a.start weblogic1)找到 /Oracle/Middleware/user_projects/domains/ 用户_domain目录. nohup ./startWebLogic.sh ...

  4. Nodejs基础:路径处理模块path总结

    模块概览 在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块.部分因为文档说的不够清晰,部分因为接口的平台差异性. 将path的接口按照用途归类,仔细琢磨琢磨,也就没那么费解了. 获取 ...

  5. DSOFramer 之一:在 64 位系统注册 DSOFramer

    DSOFramer是微软提供的一款用于在线编辑.调用Word.Excel等Office程序的ActiveX组件.很多第三方的Office组件都是基于DSOFramer组件开发的.今天我们不讲如何使用D ...

  6. [HDU5904]LCIS(DP)

    题意: 给定两个序列,求它们的最长公共递增子序列的长度, 并且这个子序列的值是连续的 n,m<=1e5,a[i],b[i]<=1e6分析:dp[i]表示以数字i结尾的序列最长长度 dp[a ...

  7. 隐马尔可夫模型(Hidden Markov Model,HMM)

    介绍 崔晓源 翻译 我们通常都习惯寻找一个事物在一段时间里的变化规律.在很多领域我们都希望找到这个规律,比如计算机中的指令顺序,句子中的词顺序和语音中的词顺序等等.一个最适用的例子就是天气的预测. 首 ...

  8. Linux中TFTP使用详解

    FTP协议简介TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现. linux服务器端tftp-server的配置1.安装tftp服务器需要安装xinetd(守护tftp).tftp和 ...

  9. C#中的Where和Lambda表达式

    1 2 3 4 5 6 7 8 9 10 11 List<string> listString = new List<string>(); listString.Add(&qu ...

  10. Bete冲刺第七阶段

    Bete冲刺第七阶段 今日工作: web: 新增通知处理接口 ios: 重写登录逻辑,添加创建行程填写.注册 POP界面 目前所遇问题: web: web目前进展顺利,暂时还没有遇到编码的问题. iO ...