• Git& GitHub常用的操作


     Git是目前世界上最先进的分布式版本控制系统。

    创始人:Linus Torvalds林纳斯·托瓦兹 

    经典的集中管理型(CVS、VSS、SVN)

     版本管理系统:

                                           

    1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?

    2、程序员上传到服务器的代码要求是完整版本,但是程序员开发过程中想做小版本的管理,以便追溯查询,怎么破?

    3、系统正在上线运行,时不时还要修改bug,要增加好几个功能要几个月,如何管理几个版本?

    4、如何管理一个分布在世界各地、互不相识的大型开发团队?

                                             

    1、命令行工具:Git for windows

    Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。

      C:Usersadmin路径下的.gitconfig文件里面可以看到

      --global 表示全局属性,所有的git项目都会共用属性

    1)填写用户名和邮箱
    Administrator@PC201803221826 MINGW64 /e/git-space $ git config --global user.name "kris" Administrator@PC201803221826 MINGW64 /e/git-space $ git config --global user.email "kris073@aliyun.com" ##全局是每个项目都是这个名; 非全局是针对这个项目,优先使用本地再全局;
    2)创建版本库 Administrator@PC201803221826 MINGW64
    /e/git-space $ git init //在项目文件夹内执行; Initialized empty Git repository in E:/git-space/.git/
    3)提交文件 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git status //查看文件状态; On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) src/ ##被追踪状态,红色; nothing added to commit but untracked files present (use "git add" to track)
    Administrator@PC201803221826 MINGW64
    /e/git-space (master) $ git add src/abc.java ①##加入暂存区 warning: LF will be replaced by CRLF in src/abc.java. The file will have its original line endings in your working directory. $ git commit #②把暂存区的提交到本地库;命名为:即直接带注释提交:git commit -m "create01" $ vim src/abc.java 把文件修改后,它的状态还是红色 $ 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: src/abc.java Untracked files: (use "git add <file>..." to include in what will be committed) src/main/ src/pom.xml no changes added to commit (use "git add" and/or "git commit -a") $ git add src/pom.xml $ git add src/abc.java $ git commit -m "create 02"

    4)查看文件提交记录 git log 文件名 $ git log --pretty=oneline 7595ce37bf951f64fc838feb78eed3ddc2da24b1 update 04 add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03 ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01 5)回退历史: git reset --hard HEAD^ 回退到上一次提交 git reset --hard HEAD~n 回退n次操作 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard HEAD^ HEAD is now at add4b42 create 03 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git log --pretty=oneline add4b426ac0306b408e1c6b6c1e09f3188387a9e create 03 ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard HEAD~2 HEAD is now at ce667fb create 02 6) 版本穿越: Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reflog ##查看历史记录的版本号, add4b42 HEAD@{0}: reset: moving to HEAD^ 7595ce3 HEAD@{1}: commit: update 04 add4b42 HEAD@{2}: commit: create 03 ce667fb HEAD@{3}: commit: create 02 0b2ee35 HEAD@{4}: commit (initial): create 01 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git reset --hard 7595ce3 ##回到这个版本号的状态; HEAD is now at 7595ce3 update 04 7) 还原文件: Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/pom.xml ##改错了,想回到之前的状态;只还原一个文件 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git checkout -- src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ vim src/pom.xml 8) 删除某个文件 先删除文件 #把本地文件删了,但它服务器上还有 再git add 再提交 $ git status On branch master Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: src/pom.xml ##红色,删除了也是有变化 no changes added to commit (use "git add" and/or "git commit -a") $ git add src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git commit Aborting commit due to empty commit message. Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git commit -m "fix bug" [master 00e4cff] fix bug 1 file changed, 1 deletion(-) delete mode 100644 src/pom.xml Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git log --pretty=oneline 00e4cff3cbc3d722bcd997caf25edb424286b687 fix bug ##版本记录就是为了留痕;完全删除了删不了的; ce667fbd41f4f51b2810a816e238afcaddec8be1 create 02 0b2ee35565d8eb7943100ca5db507e99a3e6d2e4 create 01

    工作区  + 暂缓区 + 本地库

      工作区(Working Directory):就是你电脑本地硬盘目录

      本地库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库

      暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

              

    2.  Git的实战操练---分支

    分支:
    系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本?
     两段代码的功能上线时间是不同的,就用到分支了,拆开;分支之间互相独立不影响;
    1)创建分支 git branch 分支名
    master分支: Administrator@PC201803221826 MINGW64
    /e/git-space (master) $ git branch -v //查看分支 * master 00e4cff fix bug 创建名为dev的分支 Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch dev Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 00e4cff fix bug * master 00e4cff fix bug
    2)切换分支 git checkout 分支名 //只是切换; git checkout -b 分支名 //创建并且切换 Administrator@PC201803221826 MINGW64
    /e/git-space (master) $ git checkout dev Switched to branch 'dev' Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ vim newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git add newfunc.java   warning: LF will be replaced by CRLF in newfunc.java.   The file will have its original line endings in your working directory. Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git commit -m "newfunc"   [dev 0830a63] newfunc   warning: LF will be replaced by CRLF in newfunc.java.   The file will have its original line endings in your working directory.   1 file changed, 1 insertion(+)   create mode 100644 newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git branch -v * dev 0830a63 newfunc ##在这个分支上创建并提交,就往前推动了一步; master 00e4cff fix bug

    3)合并分支 先切换到主干,git checkout master //再合并git merge 分支名
    Administrator@PC201803221826 MINGW64
    /e/git-space (dev) $ git checkout master   Switched to branch 'master' Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git checkout dev ##这样子来回切一遍,newfunc.java就出来了;虽然在分支上,但最终还是要回到主干上;切换到分支它才会出现;切到master就不见了; Switched to branch 'dev' 把分支合并,拽取/吸收,站在没有功能的那个分支 $ git branch -v dev 0830a63 newfunc * master 00e4cff fix bug Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git merge dev Updating 00e4cff..0830a63 Fast-forward newfunc.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 0830a63 newfunc * master 0830a63 newfunc

    冲突:大家都改同一份代码

    冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
    合并时冲突:
    程序合并时发生冲突系统会提示CONFLICT关键字,命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。

    解决冲突:
    此时通过git diff 可以找到发生冲突的文件及冲突的内容。然后修改冲突文件的内容,再次git add <file> 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。

      ①合并merge时产生的冲突;

    ////master主分支修改newfunc.java文件
    $ vim newfunc.java Administrator@PC201803221826 MINGW64
    /e/git-space (master) $ git add newfunc.java $ git commit -m "mm" [master 4b2a4d7] mm 1 file changed, 1 insertion(+) $ git branch -v dev 0830a63 newfunc * master 4b2a4d7 mm
    ////////dev分支也修改同样的文件!!! $ git checkout dev Switched to branch
    'dev' Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ vim newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git add newfunc.java $ git commit -m "dd" $ git branch -v * dev 34671bc dd master 4b2a4d7 mm Administrator@PC201803221826 MINGW64 /e/git-space (dev) $ git checkout master   Switched to branch 'master' Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git branch -v dev 34671bc dd * master 4b2a4d7 mm Administrator@PC201803221826 MINGW64 /e/git-space (master) $ git merge dev ##master和分支都修改同一个文件,master在合并分支时就会出现错误:   Auto-merging newfunc.java   CONFLICT (content): Merge conflict in newfunc.java   Automatic merge failed; fix conflicts and then commit the result.   Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) #正在合并中 解决:编辑文件,可以把标签删了(可以选择要哪个改动的),然后重新提交 Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ vim newfunc.java ggggggggggg <<<<<<< HEAD 删 mmmmmmmmmmm ======= 删 HHHHHHHHHHH >>>>>>> dev 删 Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ git add newfunc.java Administrator@PC201803221826 MINGW64 /e/git-space (master|MERGING) $ git commit -m "mmdd" [master f33fb98] mmdd Administrator@PC201803221826 MINGW64 /e/git-space (master) ##在不同分支newfunc.java的数据内容是不一样的; $ git branch -v dev 34671bc dd * master f33fb98 mmdd

    3. GitHub介绍与实操

    GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务

                                

                                     

    https://github.com/kris-2018/Test.git起别名是放在conf里边的
    1) 增加远程地址 
     git remote add <远端代号> <远端地址> 。
      <远端代号> 是指远程链接的代号,一般直接用origin作代号,也可以自定义。
      <远端地址> 默认远程链接的url
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git remote add origin https://github.com/kris-2018/Test.git 
    2)推送到远程库
    git push <远端代号> <本地分支名称>。
      <远端代号> 是指远程链接的代号。
      <分支名称> 是指要提交的分支名字,比如master。
      例: git push origin master
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git push origin master
    Username for 'https://github.com': 2030323705@qq.com
    Counting objects: 24, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (12/12), done.
    Writing objects: 100% (24/24), 1.70 KiB | 0 bytes/s, done.
    Total 24 (delta 0), reused 0 (delta 0)
    To https://github.com/kris-2018/Test.git
     * [new branch]      master -> master
    

     3) 从GitHub上克隆一个项目
        git clone <远端地址> <新项目目录名>。
        <远端地址> 是指远程链接的地址。
        <项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名。
        命令执行完后,会自动为这个远端地址建一个名为origin的代号。
        例 git clone https://github.com/user111/Helloworld.git hello_world

    Administrator@PC201803221826 MINGW64 /e/git-Hei
    $ git clone https://github.com/kris-2018/Test.git Test
    Cloning into 'Test'...

     4) 从GitHub更新项目
        git pull <远端代号> <远端分支名>。
         <远端代号> 是指远程链接的代号。
         <远端分支名>是指远端的分支名称,如master。
         例 git pull origin master



    需要添加Collaborators合作者

      在项目中点击settings页签,然后点击Collaborators,然后在文本框中搜索合作伙伴的邮箱或者账号。点击添加。
        添加后GitHub会给合作伙伴对应的邮箱发一封,邀请邮件。

      合作伙伴会收到邀请邮件。点击View invitation 按钮后会跳转至GitHub页面,让合作伙伴选择,是否接受邀请。
        点击接受后,则合伙伙伴正式加入项目,获得直接提交代码的权限。

     remote: Permission to kris-2018/Test.git denied to kris073.

     

    kris18用户: Collaborators:
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ vim src/abc.java   ##对数据进行修改
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git add src/abc.java
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git commit -m "a"  ##提交
    [master ccbf98d] a
     1 file changed, 1 insertion(+)
    
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git push origin master
    Username for 'https://github.com': kris18@aliyun.com
    Counting objects: 4, done.

      kris-2018用户再pull更新下数据

    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git pull origin master
    remote: Enumerating objects: 15, done.
    remote: Counting objects: 100% (15/15), done.
    remote: Compressing objects: 100% (6/6), done.
    remote: Total 12 (delta 0), reused 12 (delta 0), pack-reused 0
    Unpacking objects: 100% (12/12), done.
    From https://github.com/kris-2018/Test
     * branch            master     -> FETCH_HEAD
       f33fb98..36cee76  master     -> origin/master
    Updating f33fb98..36cee76
    Fast-forward
     src/abc.java | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ vim src/abc.java  ##数据已经发生更新;

    协作冲突

    冲突:两个人之间

    在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。

    ① 一种是做下权限,加到项目组;  ② 审查机制;

      在第三方中点Fork

    解决冲突,三板斧:
      1、修改合并
      2、git add 
      3、git commit

    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ vim src/abc.java
    
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git add src/abc.java
    
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git commit -m "ccc"
    [master 824de95] ccc
     1 file changed, 1 insertion(+)
    
    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git push origin master
    Username for 'https://github.com': 2030323705@qq.com
    Counting objects: 4, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (4/4), 318 bytes | 0 bytes/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    To https://github.com/kris-2018/Test.git
       36cee76..824de95  master -> master
    
    
    
    ##################################
    
    $ vim src/abc.java  ##修改
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git add src/abc.java
    
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git commit -m "dd"
    [master 10b7713] dd
     1 file changed, 1 insertion(+)
    
    Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master)
    $ git push origin master
    Username for 'https://github.com': kris18@aliyun.com
    To https://github.com/kris-2018/Test.git
     ! [rejected]        master -> master (fetch first)
    error: failed to push some refs to 'https://github.com/kris-2018/Test.git'
    hint: Updates were rejected because the remote contains work that you do
    hint: not have locally. This is usually caused by another repository pushing
    hint: to the same ref. You may want to first integrate the remote changes
    hint: (e.g., 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.
    $ git pull origin master ##两个人修改不同地方有可能不会报错,修改同一个地方肯定会报错的 remote: Enumerating objects:
    7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0 Unpacking objects: 100% (4/4), done. From https://github.com/kris-2018/Test * branch master -> FETCH_HEAD 36cee76..824de95 master -> origin/master Auto-merging src/abc.java CONFLICT (content): Merge conflict in src/abc.java Automatic merge failed; fix conflicts and then commit the result. 解决办法: $ vim src/abc.java aaaaaaaaaaa bbbbbbbbbb <<<<<<< HEAD dddddddddddddddd ======= ccccccccccccccccc >>>>>>> 824de9578a98395bb4623035ddaa0231322c5d6a Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ vim src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ git add src/abc.java Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master|MERGING) $ git commit -m "bbcc" [master eff7cbb] bbcc Administrator@PC201803221826 MINGW64 /e/git-Hei/Test (master) $ git push origin master Username for 'https://github.com': kris18@aliyun.com Counting objects: 8, done. Delta compression using up to 8 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (8/8), 644 bytes | 0 bytes/s, done. Total 8 (delta 0), reused 0 (delta 0) To https://github.com/kris-2018/Test.git 824de95..eff7cbb master -> master

     kris-2018本地仓库再pull更新下:

    Administrator@PC201803221826 MINGW64 /e/git-space (master)
    $ git pull origin master
    remote: Enumerating objects: 14, done.
    remote: Counting objects: 100% (14/14), done.
    remote: Compressing objects: 100% (5/5), done.
    remote: Total 8 (delta 0), reused 8 (delta 0), pack-reused 0
    Unpacking objects: 100% (8/8), done.
    From https://github.com/kris-2018/Test
     * branch            master     -> FETCH_HEAD
       824de95..eff7cbb  master     -> origin/master
    Updating 824de95..eff7cbb
    Fast-forward
     src/abc.java | 1 +
     1 file changed, 1 insertion(+)

    4.  在idea中使用Git

    配置下Git地址:

     把idea中项目提交到GitHub

    使用在远端建立仓库:

     出现弹框:填写仓库名和描述;  

    选择项目中要提交的:只提交源码的,.idea是你本地工程文件不要提交,.iml随意可提交也可不提交;

      提交src下的java源码工程、pom文件;

    如果弹窗出现Add File to Git:它会去检查你工程文件看看那个没提交,不能提交.dea你的工程文件,直接把它Remenber,don‘t ask again;  点击NO

      蓝色就是有改动过但还没提交;红色是还没有提交的文件; 绿色表已放在了暂缓区;

    红色:

    把刚刚放在暂缓区的文件提交了: 先提交到本地( 下面截图即是提交到本地 );   再push

     

    把别人的代码down下来:

    或者

  • 相关阅读:
    vmware workstation 10.0
    成为嵌入式程序员应知道的0x10个基本问题
    Linux嵌入式系统与硬件平台的关系
    vasprintf的实现
    GIT常用命令
    ip地址转化代码实例
    Linux网络编程实例解析
    openwrt的交叉编译
    appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: '10.12.1’,
    第二章 mac上运行第一个appium实例
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10781247.html
Copyright © 2020-2023  润新知