Git和Github的基本使用

前言

最近想写个项目,正巧很多人推荐github,但我对git的使用不是很熟悉,所以花半天时间看了廖雪峰老师的Git,本篇文章,只是基于老师教程的一个总结归纳,以加深记忆,下面是廖雪峰老师的教程

Git和Github

Git是种技术,由Linus完成设计和编写,Linus在1991年后创建Linux后,自由软件运动下开源思想蓬勃发展,全世界的程序员们都能参与进Linux内核的开发,起初是由Linus手工汇总,筛选的,但是,随着项目的不断扩充,Linus开始力不从心,Linux社区也对这种极低的工作效率感到不满,在拒绝开源的SVN这种集中式的项目管理和因为篡改一个公司免费提供给Linux社区的管理软件后,Linus花了一周,完成了Git的编写(牛人),Linux社区对Git不断完善,在一个月内投入使用。

SVN是种集中式项目管理,Git是分布式项目管理,集中式即将项目的管理请求集中在一台服务器上,没有网络就不行,不能在本地进行项目管理;分布式中参与项目的每台计算机在本地进行项目管理,等到有网的时候再将管理汇总(有解决冲突等机制)。

Github是基于Git的一个网页客户端,提供了可交互的界面,为不想使用命令行进行管理的开发者提供了便利,可以这样说,Git是种技术而Github是使用这种技术的工具。

Git的基本使用

Git的安装在廖雪峰老师的教程里给了对不同操作系统(Win,MacOs,Linux)详细的描述(吐槽官网下载实在太慢,没能下到最新版)。


这里写图片描述
Git运行机制图(处理工作区->Stage区->master区的文件管理)

安装好了Git后,使用git init命令将当前目录定为版本控制目录(通过pwd查看),假设这个版本控制目录是learngit1,此时会在文件夹下生成.git的目录,learngit1目录就是工作区,learngit1/.git目录就是版本库,我们在工作区做的文件创建、修改通过git的一系列命令,放入版本库,你的版本库和你小伙伴的版本库之间可以通过网络交互,以达到版本控制的目的

添加、恢复、删除文件

git add, git commit 添加、提交文件

add命令将文件加入上图中的Stage区,而commit命令将Stage区中的文件真正放入能和你小伙伴版本库进行交互的Master里,这里,commit命令必须要加入-m “你的操作是什么,或者操作的原因”,这样做是为了在后面看记录的时候方便从一系列步骤中找到你需要查看的操作点。


这里写图片描述
touch命令是Linux用来创建空文件的命令

上图中,对a.txt调用了git add,然后git status查看状态,绿字部分是已经提交到了Stage区的文件,而红字部分是还在工作区中,可能此时正在编辑的文件,在修改完成后,可以git add b.txt,然后一起git commit。


这里写图片描述

只有真正Commit后,才能进行版本控制

git diff查看文件的不同

git diff只是查看工作区和Stage区中文件是否被修改(即使之前git diff中,文件a.txt内容不同,如果将工作区和Stage区的a.txt内容改成相同的,那git diff就没有任何结果),而加上–cached参数项是查看Stage区和Master区的不同,而加上Head则是查看工作区和Master区的不同

  1. touch建的文件a.txt是空的,这个空的文件已经在Master里了
  2. 为a.txt增加一行”Insert a Line”后,用git add将a.txt从工作区放到Stage区
  3. 为a.txt再增加一行”Insert the second line”,用git diff命令查看不同
  4. 可以预测工作区的a.txt比Stage区多了Insert the second line,而Stage区的a.txt比Masert区多了Insert a Line,工作区的a.txt比Master区的多了上面两个字符串

这里写图片描述这里写图片描述这里写图片描述这里写图片描述

git diff后可加文件名来查看特定文件的不同(git diff a.txt),如果不加,则检测将所有发生变化的文件显示出来

git status告诉你有文件被修改过,用git diff可以查看修改内容。

git log查看操作历史

这条命令只记录git commit操作完成后相应的修改,比如,我们上面操作a.txt,有如下log:


这里写图片描述

git reset, git checkout

使用git log能在过去与未来穿梭,使用时必须要加–hard。
比如,我将工作目录下的a.txt提交到Master之后,生成另一个commit id


这里写图片描述

可以使用git reset ^Head回到上一个状态,使用git reset Head~数字,回到从现在为起点,第《数字》个状态,也可以直接加上commit后的数字(可以只写前几位)。


这里写图片描述

回到过去后我们发现,此时add newer a.txt的操作不在了,如果想去未来,用git reflog来查看


这里写图片描述

git reset 与 git checkout 的区别

从上面步骤可以看出,git reset清空Stage区,即取消之前的git add操作,而git checkout做如下处理(下面的处理)

  1. 修改后还没有被放到Stage区,现在,撤销修改就回到和Master一模一样的状态(要求Master中必须要有该文件)
  2. 已经添加到Stage区后,又作了修改,现在,撤销修改就回到添加到Stage后的状态。

进行如下操作:

  1. 创建一个空文件c.txt,并commit;
  2. 修改c.txt,调用git checkout – c.txt恢复为空
  3. 添加”m1”,add,添加”m2”,调用git checkout – c.txt恢复为仅含有”m1”字符串的文件(此时,Master区有个空的c.txt,Stage区有个”m1”含c.txt)
  4. 清空c.txt,git add,再添加”m1”,用git reset 清空Stage区,而工作区中的m1不受影响

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

git rm删除文件,git commit确认

这里写图片描述

分支管理

从前面我们能知道,每进行一次commit,都会产生一个commit id,并且能通过git reset –hard commit_id 在各个commit id之间进行切换,节点就像下图所示


这里写图片描述

分支(红色和蓝色线的分叉)是从当前Master创建另外一个Master(可以将之命名为dev),dev和Master完全一样,并且可以独立执行commit以及之前所述的操作。

在多人实现软件项目时,你负责的模块可以单独编写而不影响别人的程序,等到你负责的部分编写完成后,再将dev和Master合并就行了,下面是进行分支管理的命令。

创建、查看、合并 分支

功能命令
查看分支git branch
创建分支git branch name
切换分支git checkout name
创建+切换分支git checkout -b name
合并某分支到当前分支git merge name
删除分支git branch -d(没有归并的需要强行删除使用-D) name

进行如下操作
1. 清空a.txt,再创建分支dev
2. 在dev中为a.txt添加”dev modify a.txt”,commit
3. 切换master为a.txt添加”master modify a.txt”,commit
4. 按照提示处理错误(比对数据,看你要哪一个)并完成归并

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ cat a.txt


lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git branch dev

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git checkout dev
Switched to branch 'dev'

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ vi a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ cat a.txt
dev modify a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ git checkout master
Switched to branch 'master'
M       a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ cat a.txt #如果在dev里不commit的话,会在master里显示
dev modify a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git checkout dev
Switched to branch 'dev'
M       a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ git add a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ git commit -m "a.txt upload by dev"
[dev 444b90a] a.txt upload by dev
 1 file changed, 1 insertion(+), 1 deletion(-)

lenovo@Lenovo-PC MINGW64 /f/learngit1 (dev)
$ git checkout master
Switched to branch 'master'

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ cat a.txt


lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ vi a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ cat a.txt
master modify a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git add a.txt

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git commit a.txt
Aborting commit due to empty commit message.

lenovo@Lenovo-PC MINGW64 /f/learngit1 (master)
$ git commit a.txt -m "a.txt upload by master"
[master e01c133] a.txt upload by master
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git merge dev
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.

因为master和dev里的a.txt不一样,发生了冲突,自动并进入了冲突模式,所以需要选择在master和dev里的a.txt选择一个进行归并,在冲突模式下,输入vi a.txt,决定保留哪个分支的内容,并删除多余项
这里写图片描述========>这里写图片描述

删除之后,需要commit,如果没有冲突的话,则不需要commit,接着删除dev分支


这里写图片描述

本地git连上Github之后,本地进行处理,只用通过上传命令上传到github,刷新就能见到了,是套路,所以直接给廖雪峰老师的链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值