美文网首页
git使用全教程和原理再加上各种踩过的坑

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

作者: 我不要好好说话 | 来源:发表于2019-12-24 14:38 被阅读0次

    一、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
    

    相关文章

      网友评论

          本文标题:git使用全教程和原理再加上各种踩过的坑

          本文链接:https://www.haomeiwen.com/subject/vodxictx.html