git使用全教程和原理再加上各种踩过的坑

一、git安装

1、mac:

安装方法有两种
第1种:网站下载https://git-scm.com/download,下载好双击安装
第2种:
通过homebrew命令来下载git,homebrew还可以用于下载其他软件
步骤一:安装homebrew命令,在终端输入
【homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"】
步骤二:使用homebrew命令下载git,在终端输入【brew install git】
安装完成

2、win10:

下载网址:https://git-scm.com/download
下载好之后双击安装就ok

二、配置git账号和邮箱

命令:
git config --global user.name "xxx"
git config --global user.email "xxx@163.com"
实际上git就是用name和email做个标识,这个在以后上传文件时会被用
查看用户名、邮箱命令
git config user.name
git config user.email
修改用户名、邮箱命令
git config --global user.name"xxxx"
git config --global user.emailxxx@gmail.com"

三、git初始化

打开git bash窗口,mac打开终端,进入将要作为本地仓库使用的文件夹下,执行操作
1、git init 初始化本地仓库(本地仓库创建好了之后会生成一个.git的隐藏文件,git远程就是靠这个文件来识别你的本地仓库)
2、git clone ‘url’ 克隆远程分支(这里默认克隆的是master分支,克隆其他分支git clone -b 分支名 ‘url’)

四、一般使用流程

1、刚装好git,需要拉取文件

在本地创建一个文件夹作为git的本地仓库,直接使用命令
git clone “url” 这里的url填需要拉取的地址
这个命令的意思是克隆远程该url下的文件(默认为master分支)
如果要克隆dev分支或者其他分支只需在中间加上-b 分支名即可,例如
git clone -b dev “url”

2、写好了代码需要上传

上传之前先拉取一下线上的文件,有分支冲突的问题能在本地及时解决
打开git bash(mac打开终端cd到本地git的本地仓库)
1、git pull origin dev:dev 取回远程主机分支的更新,再与本地的指定分支合并git pull [远程主机名][远程分支名]:[本地分支名]
2、git add *.py 添加修改到暂存区
3、git status 查看自己修改了哪几个文件
4、git commit -m“备注信息” 提交修改到本地仓库,备注写本次修改的内容
5、git push origin 分支名 推送此次修改到远程仓库

3、不小心上传了不需要的文件到远程

1、git rm -rf 文件名称 删除文件
2、git status 查看自己操作的文件,删除的文件会列出来
3、git commit -m “备注信息” 提交修改到本地仓库,备注写本次修改的内容
4、git push origin 分支名 推送此次修改到远程仓库

4、使用pull命令时发现拉下来的本地文件与远程的仓库文件不一致

1、查看本地分支与远程分支是否对应
2、git branch -vv 查看所有分支,分支前的*字符,代表它现在在本地的在哪一个分支
Merge branch后面的显示的是跟踪的远程分支

5、创建或切换分支

1、git checkout master 切换到master分支,这里切换的是本地分支
2、git checkout -b dev 新建并切换到dev分支下
3、git branch 查看当前在哪个分支下

6、push时提示文件冲突

1、打开提示冲突的文件
2、文件中会有<<<<<<=========>>>>>>>等符号提示冲突在哪一行
3、<<<<<<HEAD到====中间的表示的是本地更改的数据
4、=====到>>>>>>>之间表示现在远程仓库上的数据
5、清理掉这个符号并把内容改成最终可以上传的版本
6、重新push(下面有流程详解)

7、本地分支合并

1、git merge 分支名 合并到该分支
2、如果本地分支合并冲突时按照上方场景六处理,下方有详解
3、再次git merge

五、扩展

1、git与svn的区别

最核心的区别是git是分布式的,svn是集中式的。

分布式:
git没有中心服务器,每个人机器上都是一个完整的库。所以断网的情况下也能用,只需在联网时把你的操作记录推送到远程就可以。

集中式:
svn版本库是集中存放在中央服务器上的,如果把中央服务器比作一个图书馆,你要改一本书,必须先从图书馆借出来,然后回家改,改完了再放回图书馆。

2、git log

万一有同学不小心更新错文件了又找不到之前版本的文件了怎么办,git中有一个版本回退功能,因为git在上传的时候每次都会有一个commit命令,每使用一次commit系统就会生成一个commit id作为本次版本的标识,commit id是一个通过SHA1算法计算出来的哈希值,
40位数字用十六进制表示,所以我们可以利用这个id回退到想要的版本。
在命令行里输入git log,回车后下方会展示一些id,这些id就是我们要使用到的commit id了

3、git版本回退

由于我们回退的是本地仓库,所以在本地回退后记得需要再次push上远程
回退时有两种命令方式
数字法:git reset - -hard HEAD^ (上个版本是HEAD^ ,上上个版本是HEAD^^,多的话也可以用数字表示比如回退到5个版本之前HEAD~5)
版本号:git reset - -hard commit id
如果需要取消回退的话再使用git reset - -hard commit id把后面的commit id变成刚刚查到的第一条即可。

4、合并分支

我在本地的halleyself分支建了一个文件,本地的分支文件也是不互通的,需要你自己手动合并分支。你可以尝试去切换分支,但是你会发现这个时候去终端切换分支是不让你切换的,因为你的文件还没有放到暂存区,git不知道怎么处理这个文件,所以得先git add 文件名,
再使用git commit -m “更新信息”。然后就能切换分支,并且切换过去的分支中是没有这个文件的。想要把halleyself分支中的文件合并过来有一个命令,先切换到主分支上,使用命令
git merge halleyself (后面的分支名写需要被合并的分支名)
合并成功。

现在的dev分支下已经有刚刚在halleyself下新增的文件。
而且因为在刚刚的分支下已经执行过add和commit了,所以现在直接push就可以
push完成之后看远程上就有这个文件了,并且这个文件的commit说明和时间都是刚刚在halleyself分支下填的数据

5、git分支冲突

有合并肯定会有冲突,比如两个同学同时更改了同一个文件的同一行,这个时候git就不知道以哪个为准,首先我们得弄明白
无论是 svn 还是 git 的工作流,都是在本地解决冲突再提交,而不是在提交时解决冲突的
svn 的模式是:
1.写代码。
2.从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
3.将本地代码提交到服务器。
而git的分布式版本管理的模式是:
1.写代码。
2.提交到本地版本库。
3.从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突。
4.将远程库与本地代码合并结果提交到本地版本库。
5.将本地版本库推到服务器。

来做个小小的实验
我们在本地写一个文件传到git远程仓库去
然后在远程修改掉这个文件,假设改掉第一行
然后在本地改掉这个文件,也改第一行,并且内容和远程的不一样
两边都保存,先把远程的pull下来。这个时候我们再打开刚刚修改的文件,发现里面多出了很多奇奇怪怪的不知道是干啥的符号
这就是冲突的地方了
<<<<<<HEAD到====之间的表示的是本地的数据
=====到>>>>>>>之间表示现在远程的数据
现在要做的就是把这些奇奇怪怪的符号删掉并更改成最终的正确数据,重新push
冲突解决。

6、跳坑合集

1、有一次一位同事不小心上传了一个1000文件的commit到远程,导致远程打开的时候直接卡死。
然后我们的处理方法就是回退远程,我这边本地回退完了之后强制push到远程再由那边拉取,然后同事重新add了两个文件,再push。但是push完之后看到远程,刚刚的1000个文件竟然也被同时传上去了
????
当时想破了头
还把git本地仓库换了个位置重新clone,竟然还是有那1000个文件。果断用git log看了一下,原来果然有刚刚上传1000个文件时的commit ID,这下就知道怎么解决了
同事电脑回退本地版本,回退到1000个文件之前。再重新add
完美解决

2、gitlub和github是两个东西
他们有不同的库

3、github如果修改了文件再切换分支的话也会提示要先add和commit,但是gitlab不会,gitlab是以add和commit命令在哪个分支使用来判断

4、最后,以上的所有东西都是有迹可循的,比如说你第一次使用git的时候输入用户名和邮箱,为什么后面上传就不用再输入了呢,为什么git认识你呢。其实是我们把用户名和邮箱存在了一个全局的上层文件里头,每次命令git只是去获取一下,带着这玩意儿去请求远程数据的。同样,如果你每次打开终端都要重新输入用户名邮箱时,那你要去检查一下你的文件里面有没有存这个用户名和密码了。然后本地仓库的.git文件夹中还有很多很多操作git时需要存的东西,大家有时间可以都去琢磨琢磨有些啥

接下来放上git使用命令大全,可用来翻阅查询
以上如果有我理解得不对的,欢迎拍砖
有沟通才有进步嘛哈哈哈哈哈哈

六、git基本操作命令(全)

1、删除添加文件:
# 添加指定文件到暂存区
$ git add [file1] [file2] …
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add . 
#建议使用add命令时使用*.py,避免传上一些其他配置文件到远程分支
git add *.py
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
2、代码提交:
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
3、分支:
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
4、标签:
# 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
5、查看信息:
# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
# 显示指定文件相关的每一次diff
$ git log -p [file]
# 显示过去5次提交
$ git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的最近几次提交
$ git reflog
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 还是老规矩,这篇看完后,还是学不会git版本控制的,你来砍我 是兄弟就来砍我吧!!! Git是分布式版本控制系统,...
    Zteen阅读 3,099评论 0 6
  • 转载自:http://www.open-open.com/lib/view/open1414396787325.h...
    Bbooo阅读 403评论 0 3
  • 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统。 二:SVN与Git的最主要的区别? SVN是集...
    傲慢二锅头阅读 406评论 0 0
  • 如何关联远程库? 1.新建本地库 2.通过git官网新建远程库 3.输入指令: git remote add or...
    诸子大人阅读 16,383评论 1 9
  • 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统。 二:SVN与Git的最主要的区别? SVN...
    JSXL阅读 1,815评论 0 2