Git和Github的基本操作

什么是GIT?

Git是一个免费、开源的版本控制软件,目前世界上最先进的分布式版本控制系统(没有之一)

什么是版本控制系统?

版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况得系统。

  • 系统具体功能

    记录文件的所有历史变化

    随时可恢复到任何一个历史状态

    多人协作开发或修改

    错误恢复

版本控制的工具:

  - svn   集中式版本控制系统

  - git  分布式版本控制系统

集中式vs分布式

CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢:

集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

集中式版本控制系统最大的毛病就是必须联网才能工作。

分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。

既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。

因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。

什么是Github

Github是全球最大的社交编程及代码托管网站(https://github.com/)。

Github可以托管各种git库,并提供一个web界面(用户名.github.io/仓库名)

 Github和Git是什么关系

Git是版本控制软件

Github是项目代码托管的平台,借助git来管理项目代码

使用Git

项目背景:这个创业者想开发选课系统

阶段一:顺利上线代码

首先在你创建的项目的文件夹里面右键--->点击Gir Bash Here---->吧git运行起来。

1、初始化:git   init

git init,初始化,表示即将对当前文件夹进行版本控制

git init

2、如果你第一次使用git的时候,需要配置一下。如果你已经配置了,以后就不用配置了

 3、使用git init之后工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

 4、添加当前的目录以及所有的子文件到暂存区
  • git add 文件名,将指定文件添加到版本库的暂存状态。
      git add .    #所有的文件

     git add README.md  #具体添加的文件

 git status查看当前状态,红色代表未跟踪的文件,绿色代表跟踪的文件(可以被版本库管理)

     查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等。

5. 数据提交上线:git commit -m "描述信息"

将暂存区的文件提交到版本库的分支。

 

6、查看状态,看那个是否被修改过:git status

一定记得先add,后commit,add之后是没有放到版本里的,只有commit的时候才有版本

7、查看有几个版本:查看版本提交记录   :git log

查看提交记录,即:历史版本记录

8.修改某一个文件后,提交

9.查看提交后log

10、回滚到上一个版本:git   reset --hard   版本号
 
11、再跳回去(查看往后的版本号):git reflog 

 Git把管理的文件分为了两个区域四个状态。

add到暂存状态的时候成绿色了,在commit的时候就没有了

提供了这个回滚的功能。

12、撤销修改:git checkout -- <file>(在add之前撤销)

13、撤销修改:git reset head -- <file>(在add之后撤销)
 

14、总结:
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • git log可以查看提交历史,以便确定要回退到哪个版本。

  • git reflog查看命令历史,以便确定要回到未来的哪个版本。

  • git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用git reset --hard commit_id,不过前提是没有推送到远程库。

阶段二:当开发到一半的时候出现bug,修复bug

  - 开发直播功能

当项目开发到一半的时候,就是在此时线上运行平台出现Bug需要紧急修复,之前的版本出现bug了怎么办? 

解决思路:使用分支

 默认会有一个master的分支。只做线上的版本,注意不要在master分支上修改,要修改的话就创建一个bug分支

1、创建一个修复bug的分支:git  branch  bug   ,这个bug分支是在master分支上建的,相当于拷贝了一份

2、查看一共有几个分支 :  git  branch

3、跳转到bug分支:git  checkout  bug

4、跳转到master分支:git branch master 

5、创建一个开发新功能的分支:git  branch  dev    #只做开发的版本

现在就有三个分支了,每个分支都是不一样的,bug修复完了,现在就要合并在master上了。

6、master和bug分支合并:git merge  bug  

7、删除bug分支:git branch -d bug

8、继续开发,切到dev:git  branch  dev

9、开发完毕,master和dev合并:git merge dev 

切换之前一定记得把你的代码提交一下

git add . 

git commit -m '修改bug' 

合并的时候可能出现冲突,可能不出现,出现冲突了就得手动解决

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ git branch bugdev  # 创建分支bugdev

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ ls
__pycache__/  main.py*  Manager.py*  pickle_util.py*  School.py*  Student.py*  Teacher.py*

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ git checkout bugdev #切换分支bugdev
Switched to branch 'bugdev'
M       core/main.py

@-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev)
$ touch b.log  #增加文件

@-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev)
$ git add . #提交到暂存区

@-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev)
$ git commit -m 'bugdev' #提交到版本库,修复bug
[bugdev 7fc00b8] bugdev
 2 files changed, 1 insertion(+), 2 deletions(-)
 create mode 100644 core/b.log

@-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev)
$ git checkout master #切换到master分支
Switched to branch 'master'

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ ls
__pycache__/  main.py*  Manager.py*  pickle_util.py*  School.py*  Student.py*  Teacher.py*

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ git merge bugdev # 合并bugdev分支
Updating 8562916..7fc00b8
Fast-forward
 core/b.log   | 0
 core/main.py | 3 +--
 2 files changed, 1 insertion(+), 2 deletions(-)
 create mode 100644 core/b.log

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ ls #查看文件内容,多了b.log文件
__pycache__/  b.log  main.py*  Manager.py*  pickle_util.py*  School.py*  Student.py*  Teacher.py*

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ git branch -d bugdev #删除bugdev分支
Deleted branch bugdev (was 7fc00b8).

@-PC MINGW64 ~/PycharmProjects/stucourse/core (master)
$ git branch #查看所有分支
  dev
* master
$ git checout dev 继续开发dev内容

开发完内容之后,在master上合并dev内容
$ git checkout master

$ git merge dev

  

流程图

branch相关常用命令:

git branch 分支名称             创建分支
git checkout 分支名称          切换分支
git branch -m 分支名称        创建并切换到指定分支
git branch                          查看所有分支
git branch -d 分支名称         删除分支
git merge 分支名称              将指定分支合并到当前分支

面试题:当公司代码出现bug时候怎么办?

解答:创建一个bug分支,修复bug后,合并到主分支上,然后删除bug分支

扩展:git rebase

合并+将提交记录合并到一条主线上,提交记录整洁

阶段三: 两个地方办公

云端需要一个存放代码的地方用Github或码云等

  公共的

     - Github是用来做代码托管的

     - 码云,做代码托管

     - csdn code ,做代码托管

  内部搭建:

     - gitlab

1、登录Github

在家里:

就会有这样一个地址,我们就可以用这个地址来提交

git remote add origin https://github.com/XXX/study1.git
#给远程项目起一个别名origin
 
git push -u origin master
#把本地项目分支提交到GitHub远程项目

 

在公司: 

家里:
                    
                    git add .
                    git commit -m 'xx'
                    
                    git remote add origin https://github.com/WuPeiqi/greenlu.git
                    
                    git push origin master 
                    
公司:
                    
                    # 新公司第一次获取代码
                        方式一
                        git clone https://github.com/WuPeiqi/greenlu.git
                            
                        方式二
                        git init 
                        git remote add origin https://github.com/WuPeiqi/greenlu.git
                        git pull origin master 直接拿回来
                        
                        
                        方式三
                        git init 
                        git remote add origin https://github.com/WuPeiqi/greenlu.git
                        这的两句相当于git pull origin master 这一句
                        git fetch origin master  拿到分支上了
                        git merge origin/master  合并在一起
                    
                    # 日后
                        git pull origin master  #
                        
                        或者
                        git fetch origin master 
                        git merge origin/master 
                        
                        
                        
                    #   如果你在本地修改问题,又add,又提交,在线上去拿的时候,或许会冲突

 图示

特殊场景解决

当你在家的时候吧代码上线了。到了公司以后吧线上的代码拉回来。

git pull origin dev
开始写代码了。
写完之后add commit。。。这时候忘了往github上提交了
回到家的时候,那今天写的代码没提交,怎么办呢?回公司太晚了,在写一遍浪费时间
,或许你还记着今天写的代码,就在这基础上又开发了,
这下提高了警记了,就记得提交了 add 、commit 、git push origin dev
第二天又到公司了,那昨天的代码怎么办呢、、?是拉下来呢?还是推上去呢?
如果你推上去的话,没有冲突还好,如果有冲突的话,那你把你的冲突都上线了,不让你提交,所以我们要先拉下来
先去吧代码拉下来,git pull origin dev 可能会有冲突,解决冲突。

原文地址:https://www.cnblogs.com/xiao-apple36/p/9241514.html